scene3.e967b451.map 4.0 MB

1
  1. {"version":3,"sources":["node_modules/three/build/three.module.js","../../../.npm-global/lib/node_modules/parcel-bundler/node_modules/process/browser.js","node_modules/d.js/lib/D.js","node_modules/uevent/uevent.js","node_modules/dot/doT.js","node_modules/photo-sphere-viewer/dist/photo-sphere-viewer.js","js/until.js","node_modules/fastclick/lib/fastclick.js","js/scene3.js","../../../.npm-global/lib/node_modules/parcel-bundler/src/builtins/bundle-url.js","../../../.npm-global/lib/node_modules/parcel-bundler/src/builtins/css-loader.js"],"names":["Number","EPSILON","undefined","Math","pow","isInteger","value","isFinite","floor","sign","x","Function","prototype","Object","defineProperty","get","toString","match","assign","target","TypeError","output","index","arguments","length","source","nextKey","hasOwnProperty","call","EventDispatcher","addEventListener","type","listener","_listeners","listeners","indexOf","push","hasEventListener","removeEventListener","listenerArray","splice","dispatchEvent","event","array","slice","i","l","REVISION","MOUSE","LEFT","MIDDLE","RIGHT","CullFaceNone","CullFaceBack","CullFaceFront","CullFaceFrontBack","FrontFaceDirectionCW","FrontFaceDirectionCCW","BasicShadowMap","PCFShadowMap","PCFSoftShadowMap","FrontSide","BackSide","DoubleSide","FlatShading","SmoothShading","NoColors","FaceColors","VertexColors","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","AddEquation","SubtractEquation","ReverseSubtractEquation","MinEquation","MaxEquation","ZeroFactor","OneFactor","SrcColorFactor","OneMinusSrcColorFactor","SrcAlphaFactor","OneMinusSrcAlphaFactor","DstAlphaFactor","OneMinusDstAlphaFactor","DstColorFactor","OneMinusDstColorFactor","SrcAlphaSaturateFactor","NeverDepth","AlwaysDepth","LessDepth","LessEqualDepth","EqualDepth","GreaterEqualDepth","GreaterDepth","NotEqualDepth","MultiplyOperation","MixOperation","AddOperation","NoToneMapping","LinearToneMapping","ReinhardToneMapping","Uncharted2ToneMapping","CineonToneMapping","UVMapping","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","SphericalReflectionMapping","CubeUVReflectionMapping","CubeUVRefractionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipMapNearestFilter","NearestMipMapLinearFilter","LinearFilter","LinearMipMapNearestFilter","LinearMipMapLinearFilter","UnsignedByteType","ByteType","ShortType","UnsignedShortType","IntType","UnsignedIntType","FloatType","HalfFloatType","UnsignedShort4444Type","UnsignedShort5551Type","UnsignedShort565Type","UnsignedInt248Type","AlphaFormat","RGBFormat","RGBAFormat","LuminanceFormat","LuminanceAlphaFormat","RGBEFormat","DepthFormat","DepthStencilFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","RGB_PVRTC_4BPPV1_Format","RGB_PVRTC_2BPPV1_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_PVRTC_2BPPV1_Format","RGB_ETC1_Format","RGBA_ASTC_4x4_Format","RGBA_ASTC_5x4_Format","RGBA_ASTC_5x5_Format","RGBA_ASTC_6x5_Format","RGBA_ASTC_6x6_Format","RGBA_ASTC_8x5_Format","RGBA_ASTC_8x6_Format","RGBA_ASTC_8x8_Format","RGBA_ASTC_10x5_Format","RGBA_ASTC_10x6_Format","RGBA_ASTC_10x8_Format","RGBA_ASTC_10x10_Format","RGBA_ASTC_12x10_Format","RGBA_ASTC_12x12_Format","LoopOnce","LoopRepeat","LoopPingPong","InterpolateDiscrete","InterpolateLinear","InterpolateSmooth","ZeroCurvatureEnding","ZeroSlopeEnding","WrapAroundEnding","TrianglesDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","LinearEncoding","sRGBEncoding","GammaEncoding","RGBEEncoding","LogLuvEncoding","RGBM7Encoding","RGBM16Encoding","RGBDEncoding","BasicDepthPacking","RGBADepthPacking","_Math","DEG2RAD","PI","RAD2DEG","generateUUID","lut","d0","random","d1","d2","d3","uuid","toUpperCase","clamp","min","max","euclideanModulo","n","m","mapLinear","a1","a2","b1","b2","lerp","y","t","smoothstep","smootherstep","randInt","low","high","randFloat","randFloatSpread","range","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","ceil","log","LN2","floorPowerOfTwo","Vector2","defineProperties","set","isVector2","setScalar","scalar","setX","setY","setComponent","Error","getComponent","clone","constructor","copy","v","add","w","console","warn","addVectors","addScalar","s","a","b","addScaledVector","sub","subVectors","subScalar","multiply","multiplyScalar","divide","divideScalar","applyMatrix3","e","elements","clampScalar","minVal","maxVal","clampLength","round","roundToZero","negate","dot","lengthSq","sqrt","manhattanLength","abs","normalize","angle","atan2","distanceTo","distanceToSquared","dx","dy","manhattanDistanceTo","setLength","alpha","lerpVectors","v1","v2","equals","fromArray","offset","toArray","fromBufferAttribute","attribute","getX","getY","rotateAround","center","c","cos","sin","Matrix4","error","isMatrix4","n11","n12","n13","n14","n21","n22","n23","n24","n31","n32","n33","n34","n41","n42","n43","n44","te","identity","me","copyPosition","extractBasis","xAxis","yAxis","zAxis","setFromMatrixColumn","makeBasis","z","extractRotation","Vector3","scaleX","scaleY","scaleZ","makeRotationFromEuler","euler","isEuler","d","f","order","ae","af","be","bf","ce","cf","de","df","ac","ad","bc","bd","makeRotationFromQuaternion","zero","one","q","compose","lookAt","eye","up","crossVectors","multiplyMatrices","premultiply","a11","a12","a13","a14","a21","a22","a23","a24","a31","a32","a33","a34","a41","a42","a43","a44","b11","b12","b13","b14","b21","b22","b23","b24","b31","b32","b33","b34","b41","b42","b43","b44","applyToBufferAttribute","count","getZ","applyMatrix4","setXYZ","determinant","transpose","tmp","setPosition","getInverse","throwOnDegenerate","t11","t12","t13","t14","det","msg","detInv","scale","getMaxScaleOnAxis","scaleXSq","scaleYSq","scaleZSq","makeTranslation","makeRotationX","theta","makeRotationY","makeRotationZ","makeRotationAxis","axis","tx","ty","makeScale","makeShear","position","quaternion","_x","_y","_z","_w","x2","y2","z2","xx","xy","xz","yy","yz","zz","wx","wy","wz","sx","sy","sz","decompose","vector","matrix","invSX","invSY","invSZ","setFromRotationMatrix","makePerspective","left","right","top","bottom","near","far","makeOrthographic","h","p","Quaternion","slerp","qa","qb","qm","slerpFlat","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dir","sqrSin","len","tDir","onChangeCallback","setFromEuler","update","c1","c2","c3","s1","s2","s3","setFromAxisAngle","halfAngle","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","setFromUnitVectors","r","EPS","vFrom","vTo","inverse","conjugate","multiplyQuaternions","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","cosHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","onChange","callback","isVector3","setZ","multiplyVectors","applyEuler","applyQuaternion","applyAxisAngle","qx","qy","qz","qw","ix","iy","iz","iw","project","camera","projectionMatrix","matrixWorld","unproject","transformDirection","cross","ax","ay","az","bx","by","bz","projectOnVector","projectOnPlane","planeNormal","reflect","normal","angleTo","acos","dz","setFromSpherical","sinPhiRadius","phi","radius","setFromCylindrical","setFromMatrixPosition","setFromMatrixScale","Matrix3","isMatrix3","setFromMatrix4","g","getNormalMatrix","matrix4","transposeIntoArray","setUvTransform","rotation","cx","cy","rotate","translate","textureId","Texture","image","mapping","wrapS","wrapT","magFilter","minFilter","format","anisotropy","encoding","name","DEFAULT_IMAGE","mipmaps","DEFAULT_MAPPING","repeat","matrixAutoUpdate","generateMipmaps","premultiplyAlpha","flipY","unpackAlignment","version","onUpdate","create","isTexture","updateMatrix","toJSON","meta","isRootObject","textures","getDataURL","canvas","HTMLCanvasElement","document","createElementNS","width","height","context","getContext","ImageData","putImageData","drawImage","toDataURL","metadata","generator","wrap","images","url","dispose","transformUv","uv","Vector4","isVector4","setW","setAxisAngleFromQuaternion","setAxisAngleFromRotationMatrix","epsilon","epsilon2","getW","WebGLRenderTarget","options","scissor","scissorTest","viewport","texture","depthBuffer","stencilBuffer","depthTexture","isWebGLRenderTarget","setSize","WebGLRenderTargetCube","activeCubeFace","activeMipMapLevel","isWebGLRenderTargetCube","DataTexture","data","isDataTexture","Box3","Infinity","isBox3","setFromArray","minX","minY","minZ","maxX","maxY","maxZ","setFromBufferAttribute","setFromPoints","points","makeEmpty","il","expandByPoint","setFromCenterAndSize","size","halfSize","setFromObject","object","expandByObject","box","isEmpty","getCenter","getSize","point","expandByVector","expandByScalar","scope","traverse","node","geometry","isGeometry","vertices","isBufferGeometry","attributes","updateMatrixWorld","containsPoint","containsBox","getParameter","intersectsBox","intersectsSphere","closestPoint","sphere","clampPoint","intersectsPlane","plane","constant","intersectsTriangle","v0","f0","f1","f2","testAxis","extents","triangleNormal","satForAxes","axes","j","p0","p1","p2","triangle","distanceToPoint","clampedPoint","getBoundingSphere","Sphere","intersect","union","xax","xay","xaz","xbx","xby","xbz","yax","yay","yaz","ybx","yby","ybz","zax","zay","zaz","zbx","zby","zbz","optionalCenter","maxRadiusSq","empty","radiusSum","deltaLengthSq","getBoundingBox","Plane","setComponents","setFromNormalAndCoplanarPoint","setFromCoplanarPoints","inverseNormalLength","distanceToSphere","projectPoint","intersectLine","line","direction","delta","denominator","start","intersectsLine","startSign","endSign","end","coplanarPoint","m1","optionalNormalMatrix","normalMatrix","referencePoint","Frustum","p3","p4","p5","planes","frustum","setFromMatrix","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","intersectsObject","boundingSphere","computeBoundingSphere","intersectsSprite","sprite","negRadius","distance","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","aomap_fragment","aomap_pars_fragment","begin_vertex","beginnormal_vertex","bsdfs","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","encodings_fragment","encodings_pars_fragment","envmap_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_fragment","lightmap_pars_fragment","lights_lambert_vertex","lights_pars_begin","lights_pars_maps","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normalmap_pars_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","uv2_pars_fragment","uv2_pars_vertex","uv2_vertex","worldpos_vertex","cube_frag","cube_vert","depth_frag","depth_vert","distanceRGBA_frag","distanceRGBA_vert","equirect_frag","equirect_vert","linedashed_frag","linedashed_vert","meshbasic_frag","meshbasic_vert","meshlambert_frag","meshlambert_vert","meshphong_frag","meshphong_vert","meshphysical_frag","meshphysical_vert","normal_frag","normal_vert","points_frag","points_vert","shadow_frag","shadow_vert","ShaderChunk","UniformsUtils","merge","uniforms","merged","u","uniforms_src","uniforms_dst","parameter_src","isColor","Array","isArray","ColorKeywords","Color","setRGB","setHex","setStyle","hex","setHSL","hue2rgb","style","handleAlpha","string","parseFloat","exec","color","components","parseInt","charAt","copyGammaToLinear","gammaFactor","copyLinearToGamma","safeInverse","convertGammaToLinear","convertLinearToGamma","getHex","getHexString","getHSL","hue","saturation","lightness","getStyle","offsetHSL","hsl","addColors","color1","color2","UniformsLib","diffuse","opacity","map","uvTransform","alphaMap","specularmap","specularMap","envmap","envMap","flipEnvMap","reflectivity","refractionRatio","maxMipLevel","aomap","aoMap","aoMapIntensity","lightmap","lightMap","lightMapIntensity","emissivemap","emissiveMap","bumpmap","bumpMap","bumpScale","normalmap","normalMap","normalScale","displacementmap","displacementMap","displacementScale","displacementBias","roughnessmap","roughnessMap","metalnessmap","metalnessMap","gradientmap","gradientMap","fog","fogDensity","fogNear","fogFar","fogColor","lights","ambientLightColor","directionalLights","properties","shadow","shadowBias","shadowRadius","shadowMapSize","directionalShadowMap","directionalShadowMatrix","spotLights","coneCos","penumbraCos","decay","spotShadowMap","spotShadowMatrix","pointLights","shadowCameraNear","shadowCameraFar","pointShadowMap","pointShadowMatrix","hemisphereLights","skyColor","groundColor","rectAreaLights","ShaderLib","basic","vertexShader","fragmentShader","lambert","emissive","phong","specular","shininess","standard","roughness","metalness","envMapIntensity","dashed","dashSize","totalSize","depth","cube","tCube","tFlip","equirect","tEquirect","distanceRGBA","referencePosition","nearDistance","farDistance","physical","clearCoat","clearCoatRoughness","WebGLAnimation","isAnimating","animationLoop","onAnimationFrame","time","frame","requestAnimationFrame","stop","setAnimationLoop","setContext","WebGLAttributes","gl","buffers","WeakMap","createBuffer","bufferType","usage","dynamic","DYNAMIC_DRAW","STATIC_DRAW","buffer","bindBuffer","bufferData","onUploadCallback","FLOAT","Float32Array","Float64Array","Uint16Array","UNSIGNED_SHORT","Int16Array","SHORT","Uint32Array","UNSIGNED_INT","Int32Array","INT","Int8Array","BYTE","Uint8Array","UNSIGNED_BYTE","bytesPerElement","BYTES_PER_ELEMENT","updateBuffer","updateRange","bufferSubData","subarray","isInterleavedBufferAttribute","remove","deleteBuffer","delete","Euler","_order","DefaultOrder","RotationOrders","asin","setFromQuaternion","setFromVector3","reorder","newOrder","toVector3","optionalResult","Layers","mask","channel","enable","toggle","disable","test","layers","object3DId","Object3D","parent","children","DefaultUp","onRotationChange","onQuaternionChange","enumerable","modelViewMatrix","DefaultMatrixAutoUpdate","matrixWorldNeedsUpdate","visible","castShadow","receiveShadow","frustumCulled","renderOrder","userData","isObject3D","onBeforeRender","onAfterRender","applyMatrix","setRotationFromAxisAngle","setRotationFromEuler","setRotationFromMatrix","setRotationFromQuaternion","rotateOnAxis","q1","rotateOnWorldAxis","rotateX","rotateY","rotateZ","translateOnAxis","translateX","translateY","translateZ","localToWorld","worldToLocal","isCamera","getObjectById","id","getObjectByProperty","getObjectByName","child","getWorldPosition","getWorldQuaternion","getWorldScale","getWorldDirection","raycast","traverseVisible","traverseAncestors","force","geometries","materials","shapes","JSON","stringify","serialize","library","element","parameters","shape","material","uuids","extractFromCache","cache","values","key","recursive","parse","Camera","matrixWorldInverse","OrthographicCamera","zoom","view","updateProjectionMatrix","isOrthographicCamera","setViewOffset","fullWidth","fullHeight","enabled","offsetX","offsetY","clearViewOffset","zoomW","zoomH","scaleW","scaleH","Face3","materialIndex","vertexNormals","vertexColors","geometryId","Geometry","colors","faces","faceVertexUvs","morphTargets","morphNormals","skinWeights","skinIndices","lineDistances","boundingBox","elementsNeedUpdate","verticesNeedUpdate","uvsNeedUpdate","normalsNeedUpdate","colorsNeedUpdate","lineDistancesNeedUpdate","groupsNeedUpdate","vertex","face","jl","computeBoundingBox","obj","fromBufferGeometry","indices","positions","normals","uvs","uvs2","uv2","tempNormals","tempUVs","tempUVs2","addFace","groups","group","computeFaceNormals","cb","ab","fl","vA","vB","vC","computeVertexNormals","areaWeighted","vl","computeFlatVertexNormals","computeMorphNormals","__originalFaceNormal","__originalVertexNormals","tmpGeo","faceNormals","dstNormalsFace","dstNormalsVertex","faceNormal","materialIndexOffset","vertexOffset","vertices1","vertices2","faces1","faces2","uvs1","colors1","colors2","vertexCopy","faceCopy","faceVertexNormals","faceVertexColors","uvCopy","mergeMesh","mesh","isMesh","mergeVertices","verticesMap","unique","changes","precisionPoints","precision","faceIndicesToRemove","idx","diff","sortFacesByMaterialIndex","_id","materialIndexSort","sort","newUvs1","newUvs2","normalsHash","colorsHash","uvsHash","hasMaterial","hasFaceUv","hasFaceVertexUv","hasFaceNormal","hasFaceVertexNormal","hasFaceColor","hasFaceVertexColor","faceType","setBit","getUvIndex","getNormalIndex","getColorIndex","hash","k","kl","uvsCopy","morphTarget","morphNormal","srcVertexNormal","destVertexNormal","BufferAttribute","itemSize","normalized","isBufferAttribute","setArray","setDynamic","copyAt","index1","index2","copyArray","copyColorsArray","copyVector2sArray","vectors","copyVector3sArray","copyVector4sArray","setXY","setXYZW","onUpload","Int8BufferAttribute","Uint8BufferAttribute","Uint8ClampedBufferAttribute","Uint8ClampedArray","Int16BufferAttribute","Uint16BufferAttribute","Int32BufferAttribute","Uint32BufferAttribute","Float32BufferAttribute","Float64BufferAttribute","DirectGeometry","computeGroups","fromGeometry","hasFaceVertexUv2","morphTargetsLength","morphTargetsPosition","morphNormalsLength","morphTargetsNormal","hasSkinIndices","hasSkinWeights","vertexUvs","arrayMax","bufferGeometryId","BufferGeometry","morphAttributes","drawRange","getIndex","setIndex","addAttribute","getAttribute","removeAttribute","addGroup","clearGroups","setDrawRange","needsUpdate","isPoints","isLine","updateFromObject","direct","__directGeometry","lineDistance","fromDirectGeometry","isNaN","pA","pB","pC","normalizeNormals","attribute1","attributeArray1","attribute2","attributeArray2","attributeSize","toNonIndexed","geometry2","array2","keys","morphAttribute","BoxGeometry","widthSegments","heightSegments","depthSegments","BoxBufferGeometry","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","PlaneGeometry","PlaneBufferGeometry","width_half","height_half","segment_width","segment_height","materialId","Material","blending","side","flatShading","transparent","blendSrc","blendDst","blendEquation","blendSrcAlpha","blendDstAlpha","blendEquationAlpha","depthFunc","depthTest","depthWrite","clippingPlanes","clipIntersection","clipShadows","shadowSide","colorWrite","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","dithering","alphaTest","premultipliedAlpha","overdraw","isMaterial","onBeforeCompile","setValues","newValue","currentValue","isRoot","emissiveIntensity","sizeAttenuation","linewidth","gapSize","wireframe","wireframeLinewidth","wireframeLinecap","wireframeLinejoin","skinning","srcPlanes","dstPlanes","MeshBasicMaterial","combine","isMeshBasicMaterial","ShaderMaterial","defines","clipping","extensions","derivatives","fragDepth","drawBuffers","shaderTextureLOD","defaultAttributeValues","index0AttributeName","uniformsNeedUpdate","isShaderMaterial","Ray","origin","ray","at","recast","closestPointToPoint","directionDistance","distanceSqToPoint","distanceSqToSegment","segCenter","segDir","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","intersectSphere","tca","radius2","thc","t0","t1","distanceToPlane","intersectPlane","distToPoint","intersectBox","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","intersectTriangle","edge1","edge2","backfaceCulling","DdN","DdQxE2","DdE1xQ","QdN","Line3","distanceSq","closestPointToPointParameter","startP","startEnd","clampToLine","startEnd2","startEnd_startP","Triangle","getNormal","targetLengthSq","getBarycoord","dot00","dot01","dot02","dot11","dot12","denom","invDenom","setFromPointsAndIndices","i0","i1","i2","getArea","getMidpoint","getPlane","edgeList","projectedPoint","minDistance","Mesh","drawMode","updateMorphTargets","setDrawMode","morphTargetInfluences","morphTargetDictionary","ml","String","inverseMatrix","tempA","tempB","tempC","uvA","uvB","uvC","barycoord","intersectionPoint","intersectionPointWorld","uvIntersection","uv1","uv3","checkIntersection","raycaster","checkBufferGeometryIntersection","intersection","intersects","faceIndex","fvA","fvB","fvC","isMultiMaterial","faceMaterial","morphInfluences","tl","influence","targets","uvs_f","WebGLBackground","renderer","state","objects","clearColor","clearAlpha","planeCamera","planeMesh","boxMesh","render","renderList","scene","forceClear","background","setClear","autoClear","clear","autoClearColor","autoClearDepth","autoClearStencil","isCubeTexture","renderBufferDirect","getClearColor","setClearColor","getClearAlpha","setClearAlpha","WebGLBufferRenderer","info","mode","setMode","drawArrays","renderInstances","extension","drawArraysInstancedANGLE","maxInstancedCount","WebGLCapabilities","maxAnisotropy","getMaxAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","getMaxPrecision","getShaderPrecisionFormat","VERTEX_SHADER","HIGH_FLOAT","FRAGMENT_SHADER","MEDIUM_FLOAT","maxPrecision","logarithmicDepthBuffer","maxTextures","MAX_TEXTURE_IMAGE_UNITS","maxVertexTextures","MAX_VERTEX_TEXTURE_IMAGE_UNITS","maxTextureSize","MAX_TEXTURE_SIZE","maxCubemapSize","MAX_CUBE_MAP_TEXTURE_SIZE","maxAttributes","MAX_VERTEX_ATTRIBS","maxVertexUniforms","MAX_VERTEX_UNIFORM_VECTORS","maxVaryings","MAX_VARYING_VECTORS","maxFragmentUniforms","MAX_FRAGMENT_UNIFORM_VECTORS","vertexTextures","floatFragmentTextures","floatVertexTextures","WebGLClipping","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","numPlanes","numIntersection","init","enableLocalClipping","projectPlanes","beginShadows","endShadows","resetGlobalState","setState","fromCache","nGlobal","lGlobal","dstArray","clippingState","skipTransform","nPlanes","flatSize","viewMatrix","i4","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","buffergeometry","memory","_bufferGeometry","geometryAttributes","ELEMENT_ARRAY_BUFFER","ARRAY_BUFFER","getWireframeAttribute","geometryIndex","WebGLIndexedBufferRenderer","drawElements","drawElementsInstancedANGLE","WebGLInfo","calls","triangles","lines","instanceCount","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","LINES","LINE_STRIP","LINE_LOOP","POINTS","reset","programs","autoReset","absNumericalSort","WebGLMorphtargets","influencesList","program","objectInfluences","influences","getUniforms","setValue","WebGLObjects","updateList","CubeTexture","emptyTexture","emptyCubeTexture","UniformContainer","seq","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","allocTexUnits","allocTextureUnit","setValue1f","uniform1f","addr","setValue1i","uniform1i","setValue2fv","uniform2f","uniform2fv","setValue3fv","uniform3f","uniform3fv","setValue4fv","uniform4f","uniform4fv","setValue2fm","uniformMatrix2fv","setValue3fm","uniformMatrix3fv","setValue4fm","uniformMatrix4fv","setValueT1","unit","setTexture2D","setValueT6","setTextureCube","setValue2iv","uniform2iv","setValue3iv","uniform3iv","setValue4iv","uniform4iv","getSingularSetter","setValue1fv","uniform1fv","setValue1iv","uniform1iv","setValueV2a","updateCache","setValueV3a","setValueV4a","setValueM2a","setValueM3a","setValueM4a","setValueT1a","units","setValueT6a","getPureArraySetter","SingleUniform","activeInfo","PureArrayUniform","StructuredUniform","RePathPart","addUniform","container","uniformObject","parseUniform","path","pathLength","lastIndex","matchEnd","idIsIndex","subscript","next","WebGLUniforms","getProgramParameter","ACTIVE_UNIFORMS","getActiveUniform","getUniformLocation","setOptional","upload","seqWithValue","addLineNumbers","split","join","WebGLShader","shader","createShader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","programIdCount","getEncodingComponents","getTexelDecodingFunction","functionName","getTexelEncodingFunction","getToneMappingFunction","toneMapping","toneMappingName","generateExtensions","rendererExtensions","chunks","envMapCubeUV","filter","filterEmptyLine","generateDefines","fetchAttributeLocations","ACTIVE_ATTRIBUTES","getActiveAttrib","getAttribLocation","replaceLightNums","replace","numDirLights","numSpotLights","numRectAreaLights","numPointLights","numHemiLights","replaceClippingPlaneNums","numClippingPlanes","numClipIntersection","parseIncludes","pattern","include","unrollLoops","snippet","unroll","WebGLProgram","code","shadowMapTypeDefine","shadowMapType","envMapTypeDefine","envMapModeDefine","envMapBlendingDefine","gammaFactorDefine","customExtensions","customDefines","createProgram","prefixVertex","prefixFragment","isRawShaderMaterial","supportsVertexTextures","maxBones","useFog","fogExp","useVertexTexture","doubleSided","flipSided","shadowMapEnabled","physicallyCorrectLights","outputEncoding","mapEncoding","envMapEncoding","emissiveMapEncoding","depthPacking","vertexGlsl","fragmentGlsl","glVertexShader","glFragmentShader","attachShader","bindAttribLocation","linkProgram","programLog","getProgramInfoLog","trim","vertexLog","fragmentLog","runnable","haveDiagnostics","LINK_STATUS","getError","VALIDATE_STATUS","diagnostics","prefix","deleteShader","cachedUniforms","cachedAttributes","getAttributes","destroy","deleteProgram","usedTimes","WebGLPrograms","capabilities","shaderIDs","MeshDepthMaterial","MeshDistanceMaterial","MeshNormalMaterial","MeshLambertMaterial","MeshPhongMaterial","MeshToonMaterial","MeshStandardMaterial","MeshPhysicalMaterial","LineBasicMaterial","LineDashedMaterial","PointsMaterial","ShadowMaterial","parameterNames","allocateBones","skeleton","bones","nVertexUniforms","nVertexMatrices","getTextureEncodingFromMap","gammaOverrideLinear","getParameters","shadows","nClipPlanes","nClipIntersection","shaderID","isSkinnedMesh","currentRenderTarget","getRenderTarget","gammaOutput","gammaInput","envMapMode","isFogExp2","maxMorphTargets","maxMorphNormals","directional","spot","rectArea","hemi","shadowMap","getProgramCode","acquireProgram","pl","programInfo","releaseProgram","pop","WebGLProperties","painterSortStable","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","opaque","renderItem","WebGLRenderLists","lists","list","UniformsCache","light","halfWidth","halfHeight","WebGLLights","ambient","vector3","matrix42","setup","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","intensity","isAmbientLight","isDirectionalLight","bias","mapSize","isSpotLight","penumbra","isRectAreaLight","isPointLight","isHemisphereLight","WebGLRenderState","lightsArray","shadowsArray","spritesArray","pushLight","pushShadow","shadowLight","pushSprite","setupLights","WebGLRenderStates","renderStates","renderState","isMeshDepthMaterial","isMeshDistanceMaterial","WebGLShadowMap","_renderer","_objects","_frustum","_projScreenMatrix","_shadowMapSize","_maxShadowMapSize","_lookTarget","_lightPositionWorld","_MorphingFlag","_SkinningFlag","_NumberOfMaterialVariants","_depthMaterials","_distanceMaterials","_materialCache","cubeDirections","cubeUps","cube2DViewPorts","useMorphing","useSkinning","depthMaterial","distanceMaterial","autoUpdate","_gl","_state","BLEND","setTest","setScissorTest","faceCount","shadowCamera","vpWidth","vpHeight","pars","isSpotLightShadow","shadowMatrix","setRenderTarget","vpDimensions","renderObject","getDepthMaterial","lightPositionWorld","result","materialVariants","customMaterial","customDepthMaterial","customDistanceMaterial","variantIndex","keyA","keyB","materialsForVariant","cachedMaterial","groupMaterial","CanvasTexture","isCanvasTexture","WebGLSpriteRenderer","vertexBuffer","elementBuffer","spritePosition","spriteRotation","spriteScale","uvOffset","uvScale","fogType","fogDepth","fillStyle","fillRect","sprites","useProgram","initAttributes","enableAttribute","disableUnusedAttributes","CULL_FACE","vertexAttribPointer","activeTexture","TEXTURE0","oldFogType","sceneFogType","isFog","density","setBlending","setMask","WebGLState","utils","ColorBuffer","locked","currentColorMask","currentColorClear","colorMask","setLocked","lock","DepthBuffer","currentDepthMask","currentDepthFunc","currentDepthClear","DEPTH_TEST","depthMask","setFunc","NEVER","ALWAYS","LESS","LEQUAL","EQUAL","GEQUAL","GREATER","NOTEQUAL","clearDepth","StencilBuffer","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","STENCIL_TEST","stencilMask","stencilFunc","stencilRef","setOp","stencilFail","stencilZFail","stencilZPass","stencilOp","stencil","clearStencil","colorBuffer","maxVertexAttributes","newAttributes","enabledAttributes","attributeDivisors","compressedTextureFormats","currentProgram","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","MAX_COMBINED_TEXTURE_IMAGE_UNITS","lineWidthAvailable","glVersion","VERSION","currentTextureSlot","currentBoundTextures","currentScissor","currentViewport","createTexture","bindTexture","texParameteri","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","texImage2D","RGBA","emptyTextures","TEXTURE_2D","TEXTURE_CUBE_MAP","TEXTURE_CUBE_MAP_POSITIVE_X","setFlipSided","setCullFace","enableAttributeAndDivisor","meshPerAttribute","enableVertexAttribArray","vertexAttribDivisorANGLE","disableVertexAttribArray","getCompressedTextureFormats","formats","COMPRESSED_TEXTURE_FORMATS","blendEquationSeparate","FUNC_ADD","blendFuncSeparate","ONE","blendFunc","SRC_ALPHA","ZERO","ONE_MINUS_SRC_COLOR","ONE_MINUS_SRC_ALPHA","SRC_COLOR","convert","setMaterial","frontFaceCW","setPolygonOffset","frontFace","CW","CCW","cullFace","BACK","FRONT","FRONT_AND_BACK","setLineWidth","lineWidth","factor","POLYGON_OFFSET_FILL","SCISSOR_TEST","webglSlot","webglType","webglTexture","boundTexture","compressedTexImage2D","apply","WebGLTextures","_isWebGL2","WebGL2RenderingContext","_videoTextures","_canvas","clampToMaxSize","maxSize","makePowerOfTwo","HTMLImageElement","ImageBitmap","textureNeedsPowerOfTwo","textureNeedsGenerateMipmaps","generateMipmap","textureProperties","__maxMipLevel","LOG2E","filterFallback","LINEAR","onTextureDispose","deallocateTexture","isVideoTexture","onRenderTargetDispose","renderTarget","deallocateRenderTarget","__image__webglTextureCube","deleteTexture","__webglInit","__webglTexture","renderTargetProperties","deleteFramebuffer","__webglFramebuffer","__webglDepthbuffer","deleteRenderbuffer","slot","updateVideoTexture","__version","complete","uploadTexture","pixelStorei","UNPACK_FLIP_Y_WEBGL","isCompressed","isCompressedTexture","cubeImage","isPowerOfTwoImage","glFormat","glType","setTextureParameters","mipmap","setTextureCubeDynamic","textureType","TEXTURE_WRAP_S","TEXTURE_WRAP_T","CLAMP_TO_EDGE","__currentAnisotropy","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","UNPACK_PREMULTIPLY_ALPHA_WEBGL","UNPACK_ALIGNMENT","isDepthTexture","internalFormat","DEPTH_COMPONENT","DEPTH_COMPONENT32F","DEPTH_COMPONENT16","DEPTH_STENCIL","setupFrameBufferTexture","framebuffer","attachment","textureTarget","bindFramebuffer","FRAMEBUFFER","framebufferTexture2D","setupRenderBufferStorage","renderbuffer","bindRenderbuffer","RENDERBUFFER","renderbufferStorage","framebufferRenderbuffer","DEPTH_ATTACHMENT","DEPTH_STENCIL_ATTACHMENT","RGBA4","setupDepthTexture","isCube","webglDepthTexture","setupDepthRenderbuffer","createRenderbuffer","setupRenderTarget","isTargetPowerOfTwo","createFramebuffer","COLOR_ATTACHMENT0","updateRenderTargetMipmap","WebGLUtils","REPEAT","MIRRORED_REPEAT","NEAREST_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","LINEAR_MIPMAP_NEAREST","LINEAR_MIPMAP_LINEAR","UNSIGNED_SHORT_4_4_4_4","UNSIGNED_SHORT_5_5_5_1","UNSIGNED_SHORT_5_6_5","HALF_FLOAT_OES","ALPHA","RGB","LUMINANCE","LUMINANCE_ALPHA","FUNC_SUBTRACT","FUNC_REVERSE_SUBTRACT","DST_ALPHA","ONE_MINUS_DST_ALPHA","DST_COLOR","ONE_MINUS_DST_COLOR","SRC_ALPHA_SATURATE","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","COMPRESSED_RGB_PVRTC_4BPPV1_IMG","COMPRESSED_RGB_PVRTC_2BPPV1_IMG","COMPRESSED_RGBA_PVRTC_4BPPV1_IMG","COMPRESSED_RGBA_PVRTC_2BPPV1_IMG","COMPRESSED_RGB_ETC1_WEBGL","MIN_EXT","MAX_EXT","UNSIGNED_INT_24_8_WEBGL","PerspectiveCamera","fov","aspect","focus","filmGauge","filmOffset","isPerspectiveCamera","setFocalLength","focalLength","vExtentSlope","getFilmHeight","atan","getFocalLength","tan","getEffectiveFOV","getFilmWidth","skew","ArrayCamera","cameras","isArrayCamera","WebVRManager","device","frameData","poseTarget","standingMatrix","standingMatrixInverse","window","VRFrameData","onVRDisplayPresentChange","tempQuaternion","tempPosition","cameraL","bounds","cameraR","cameraVR","isPresenting","currentSize","currentPixelRatio","eyeParameters","getEyeParameters","renderWidth","renderHeight","getPixelRatio","setDrawingBufferSize","animation","userHeight","getDevice","setDevice","setPoseTarget","getCamera","depthNear","depthFar","getFrameData","stageParameters","sittingToStandingTransform","pose","poseObject","orientation","leftViewMatrix","rightViewMatrix","leftProjectionMatrix","rightProjectionMatrix","getLayers","layer","leftBounds","rightBounds","getStandingMatrix","submitFrame","WebXRManager","session","frameOfRef","setCompatibleXRDevice","setSession","setFramebuffer","baseLayer","XRWebGLLayer","requestFrameOfReference","frameOfReferenceType","then","updateCamera","onAnimationFrameCallback","getDevicePose","views","getViewport","getViewMatrix","THREE","WebGLRenderer","_context","_alpha","_depth","_stencil","_antialias","antialias","_premultipliedAlpha","_preserveDrawingBuffer","preserveDrawingBuffer","_powerPreference","powerPreference","currentRenderList","currentRenderState","domElement","sortObjects","toneMappingExposure","toneMappingWhitePoint","_this","_isContextLost","_framebuffer","_currentRenderTarget","_currentFramebuffer","_currentMaterialId","_currentGeometryProgram","_currentCamera","_currentArrayCamera","_currentViewport","_currentScissor","_currentScissorTest","_usedTextureUnits","_width","_height","_pixelRatio","_viewport","_scissor","_scissorTest","_clipping","_clippingEnabled","_localClippingEnabled","_vector3","getTargetPixelRatio","contextAttributes","onContextLost","onContextRestore","message","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","spriteRenderer","initGLContext","vr","navigator","getContextAttributes","forceContextLoss","loseContext","forceContextRestore","restoreContext","setPixelRatio","updateStyle","setViewport","getDrawingBufferSize","pixelRatio","getCurrentViewport","setScissor","boolean","bits","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","STENCIL_BUFFER_BIT","clearTarget","preventDefault","onMaterialDispose","deallocateMaterial","releaseMaterialProgramReference","renderObjectImmediate","renderBufferImmediate","hasPositions","hasNormals","hasUvs","hasColors","programAttributes","positionArray","isMeshPhongMaterial","isMeshStandardMaterial","isMeshNormalMaterial","normalArray","nx","ny","nz","uvArray","colorArray","setProgram","geometryProgram","updateBuffers","rangeFactor","setupVertexAttributes","dataCount","rangeStart","rangeCount","drawStart","drawEnd","drawCount","isLineSegments","isLineLoop","isInstancedBufferGeometry","materialDefaultAttributeValues","programAttribute","geometryAttribute","stride","isInstancedInterleavedBuffer","isInstancedBufferAttribute","vertexAttrib2fv","vertexAttrib3fv","vertexAttrib4fv","vertexAttrib1fv","compile","isLight","initMaterial","projectObject","opaqueObjects","transparentObjects","overrideMaterial","renderObjects","isSprite","isImmediateRenderObject","camera2","materialProperties","programChange","lightsHash","numSupportedMorphTargets","numSupportedMorphNormals","progUniforms","uniformsList","useCache","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","cameraPosition","isMeshLambertMaterial","boneTexture","boneMatrices","boneTextureSize","markUniformsLightsNeedsUpdate","refreshUniformsFog","refreshUniformsCommon","refreshUniformsLambert","isMeshToonMaterial","refreshUniformsToon","refreshUniformsPhong","isMeshPhysicalMaterial","refreshUniformsPhysical","refreshUniformsStandard","refreshUniformsDepth","refreshUniformsDistance","refreshUniformsNormal","isLineBasicMaterial","refreshUniformsLine","isLineDashedMaterial","refreshUniformsDash","isPointsMaterial","refreshUniformsPoints","isShadowMaterial","ltc_1","LTC_1","ltc_2","LTC_2","uvScaleMap","textureUnit","warned","setTexture","readRenderTargetPixels","restore","textureFormat","IMPLEMENTATION_COLOR_READ_FORMAT","IMPLEMENTATION_COLOR_READ_TYPE","checkFramebufferStatus","FRAMEBUFFER_COMPLETE","readPixels","copyFramebufferToTexture","level","copyTexImage2D","copyTextureToTexture","srcTexture","dstTexture","texSubImage2D","FogExp2","Fog","Scene","SpriteMaterial","isSpriteMaterial","Sprite","intersectPoint","worldPosition","worldScale","guessSizeSq","LOD","levels","addLevel","getObjectForDistance","matrixPosition","Skeleton","boneInverses","calculateInverses","bone","isBone","offsetMatrix","identityMatrix","getBoneByName","Bone","SkinnedMesh","bindMode","bindMatrix","bindMatrixInverse","initBones","bind","normalizeSkinWeights","gbone","pos","rotq","scl","sw","vec","skinWeight","linecap","linejoin","Line","LineSegments","computeLineDistances","positionAttribute","linePrecision","precisionSq","vStart","vEnd","interSegment","interRay","step","distSq","nbVertices","LineLoop","Points","threshold","params","localThreshold","localThresholdSq","testPoint","rayPointDistanceSq","distanceToRay","Group","isGroup","VideoTexture","video","readyState","HAVE_CURRENT_DATA","CompressedTexture","DepthTexture","WireframeGeometry","o","ol","edge","edges","ParametricGeometry","func","slices","stacks","ParametricBufferGeometry","pu","pv","sliceCount","PolyhedronGeometry","detail","PolyhedronBufferGeometry","uvBuffer","subdivide","appplyRadius","generateUVs","getVertexByIndex","subdivideFace","cols","aj","bj","rows","pushVertex","azimuth","inclination","correctUVs","correctSeam","centroid","azi","correctUV","TetrahedronGeometry","TetrahedronBufferGeometry","OctahedronGeometry","OctahedronBufferGeometry","IcosahedronGeometry","IcosahedronBufferGeometry","DodecahedronGeometry","DodecahedronBufferGeometry","TubeGeometry","tubularSegments","radialSegments","closed","taper","bufferGeometry","TubeBufferGeometry","tangents","binormals","frames","computeFrenetFrames","P","generateBufferData","generateSegment","generateIndices","getPointAt","N","B","TorusKnotGeometry","tube","heightScale","TorusKnotBufferGeometry","P1","P2","T","calculatePositionOnCurve","cu","su","quOverP","cs","TorusGeometry","arc","TorusBufferGeometry","Earcut","triangulate","holeIndices","dim","hasHoles","outerLen","outerNode","linkedList","invSize","eliminateHoles","earcutLinked","clockwise","last","signedArea","insertNode","removeNode","filterPoints","again","steiner","area","prev","ear","pass","indexCurve","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","zOrder","nextZ","prevZ","locallyInside","isValidDiagonal","splitPolygon","queue","getLeftmost","compareX","eliminateHole","hole","findHoleBridge","hx","hy","mx","my","tanMin","sortLinked","tail","numMerges","pSize","qSize","inSize","leftmost","px","py","intersectsPolygon","middleInside","q2","inside","Node","an","bp","sum","ShapeUtils","contour","isClockWise","pts","triangulateShape","holes","removeDupEndPts","addContour","holeIndex","forEach","ExtrudeGeometry","ExtrudeBufferGeometry","verticesArray","addShape","placeholder","curveSegments","steps","bevelEnabled","bevelThickness","bevelSize","bevelSegments","extrudePath","uvgen","UVGenerator","WorldUVGenerator","amount","extrudePts","extrudeByPath","splineTube","binormal","position2","getSpacedPoints","ahole","hl","shapePoints","extractPoints","reverse","concat","scalePt2","pt","bs","vert","vlen","flen","getBevelVec","inPt","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","ptNextShift_x","ptNextShift_y","sf","v_trans_lensq","direction_eq","contourMovements","holesMovements","oneHoleMovements","verticesMovements","buildLidFaces","buildSideFaces","f3","layeroffset","sidewalls","sl","slen1","slen2","f4","addVertex","nextIndex","generateTopUV","addUV","generateSideWallUV","vector2","indexA","indexB","indexC","a_x","a_y","b_x","b_y","c_x","c_y","indexD","a_z","b_z","c_z","d_x","d_y","d_z","TextGeometry","text","TextBufferGeometry","font","isFont","generateShapes","SphereGeometry","phiStart","phiLength","thetaStart","thetaLength","SphereBufferGeometry","thetaEnd","grid","verticesRow","RingGeometry","innerRadius","outerRadius","thetaSegments","phiSegments","RingBufferGeometry","segment","radiusStep","thetaSegmentLevel","LatheGeometry","segments","LatheBufferGeometry","base","inverseSegments","n1","n2","ShapeGeometry","ShapeBufferGeometry","toJSON$1","shapeHole","indexOffset","shapeVertices","shapeHoles","EdgesGeometry","thresholdAngle","thresholdDot","sourceVertices","face1","face2","CylinderGeometry","radiusTop","radiusBottom","openEnded","CylinderBufferGeometry","indexArray","generateTorso","generateCap","slope","indexRow","sinTheta","cosTheta","centerIndexStart","centerIndexEnd","ConeGeometry","ConeBufferGeometry","CircleGeometry","CircleBufferGeometry","Geometries","freeze","RawShaderMaterial","Materials","Cache","files","file","LoadingManager","onLoad","onProgress","onError","isLoading","itemsLoaded","itemsTotal","urlModifier","onStart","itemStart","itemEnd","itemError","resolveURL","setURLModifier","transform","DefaultLoadingManager","loading","FileLoader","manager","load","cached","setTimeout","dataUriRegex","dataUriRegexResult","mimeType","isBase64","decodeURIComponent","atob","response","responseType","toLowerCase","charCodeAt","Blob","parser","DOMParser","parseFromString","request","XMLHttpRequest","open","callbacks","status","withCredentials","overrideMimeType","header","requestHeader","setRequestHeader","send","setPath","setResponseType","setWithCredentials","setMimeType","CompressedTextureLoader","_parser","loader","loadTexture","texDatas","loaded","mipmapCount","isCubemap","DataTextureLoader","texData","ImageLoader","crossOrigin","onImageLoad","onImageError","substr","src","setCrossOrigin","CubeTextureLoader","urls","TextureLoader","isJPEG","search","Curve","arcLengthDivisions","getPoint","optionalTarget","getUtoTmapping","getPoints","divisions","getLength","lengths","getLengths","cacheArcLengths","current","updateArcLengths","arcLengths","targetArcLength","comparison","lengthBefore","lengthAfter","segmentLength","segmentFraction","getTangent","t2","pt1","pt2","getTangentAt","mat","MAX_VALUE","tz","fromJSON","json","EllipseCurve","aX","aY","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","aRotation","isEllipseCurve","twoPi","deltaAngle","samePoints","ArcCurve","aRadius","isArcCurve","CubicPoly","c0","initCatmullRom","x3","tension","initNonuniformCatmullRom","dt0","dt1","dt2","calc","t3","pz","CatmullRomCurve3","curveType","isCatmullRomCurve3","intPoint","weight","CatmullRom","QuadraticBezierP0","QuadraticBezierP1","QuadraticBezierP2","QuadraticBezier","CubicBezierP0","CubicBezierP1","CubicBezierP2","CubicBezierP3","CubicBezier","CubicBezierCurve","v3","isCubicBezierCurve","CubicBezierCurve3","isCubicBezierCurve3","LineCurve","isLineCurve","tangent","LineCurve3","isLineCurve3","QuadraticBezierCurve","isQuadraticBezierCurve","QuadraticBezierCurve3","isQuadraticBezierCurve3","SplineCurve","isSplineCurve","Curves","CurvePath","curves","autoClose","curve","closePath","startPoint","endPoint","curveLengths","getCurveLengths","lens","cacheLengths","sums","resolution","Path","currentPoint","moveTo","lineTo","quadraticCurveTo","aCPx","aCPy","bezierCurveTo","aCP1x","aCP1y","aCP2x","aCP2y","splineThru","npts","absarc","absellipse","ellipse","firstPoint","lastPoint","Shape","getPointsHoles","holesPts","Light","HemisphereLight","LightShadow","SpotLightShadow","SpotLight","power","PointLight","DirectionalLightShadow","DirectionalLight","AmbientLight","RectAreaLight","StringKeyframeTrack","times","interpolation","KeyframeTrack","ValueTypeName","ValueBufferType","DefaultInterpolation","InterpolantFactoryMethodLinear","InterpolantFactoryMethodSmooth","BooleanKeyframeTrack","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","_cachedIndex","valueSize","evaluate","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","afterEnd_","t1global","beforeStart_","mid","intervalChanged_","interpolate_","settings","DefaultSettings_","getSettings_","copySampleValue_","QuaternionLinearInterpolant","QuaternionKeyframeTrack","getValueSize","ColorKeyframeTrack","NumberKeyframeTrack","CubicInterpolant","_weightPrev","_offsetPrev","_weightNext","_offsetNext","endingStart","endingEnd","iPrev","iNext","tPrev","tNext","halfDt","o1","o0","oP","oN","wP","wN","ppp","sP","sN","LinearInterpolant","offset1","offset0","weight1","weight0","DiscreteInterpolant","AnimationUtils","arraySlice","from","to","isTypedArray","convertArray","forceClone","ArrayBuffer","isView","DataView","getKeyframeOrder","compareTime","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","TimeBufferType","setInterpolation","validate","optimize","trackType","_getTrackTypeForValueTypeName","track","getInterpolation","typeName","VectorKeyframeTrack","InterpolantFactoryMethodDiscrete","factoryMethod","createInterpolant","shift","timeOffset","timeScale","startTime","endTime","nKeys","valid","prevTime","currTime","smoothInterpolation","writeIndex","keep","timeNext","offsetP","offsetN","readOffset","writeOffset","AnimationClip","duration","tracks","resetDuration","jsonTracks","frameTime","fps","clip","clipTracks","CreateFromMorphTargetSequence","morphTargetSequence","noLoop","numMorphTargets","findByName","objectOrClipArray","clipArray","animations","CreateClipsFromMorphTargetSequences","animationToMorphTargets","parts","animationMorphTargets","clips","parseAnimation","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","hierarchy","morphTargetNames","morphTargetName","animationKey","boneName","MaterialLoader","setTextures","getTexture","shading","BufferGeometryLoader","typedArray","TYPED_ARRAYS","drawcalls","offsets","Loader","Handlers","handlers","regex","onLoadStart","onLoadProgress","onLoadComplete","initMaterials","texturePath","createMaterial","BlendingMode","textureLoader","materialLoader","fullPath","mapDiffuseRepeat","mapDiffuseOffset","mapDiffuseWrap","mapDiffuseAnisotropy","mapEmissiveRepeat","mapEmissiveOffset","mapEmissiveWrap","mapEmissiveAnisotropy","mapLightRepeat","mapLightOffset","mapLightWrap","mapLightAnisotropy","mapAORepeat","mapAOOffset","mapAOWrap","mapAOAnisotropy","mapBumpRepeat","mapBumpOffset","mapBumpWrap","mapBumpAnisotropy","mapNormalRepeat","mapNormalOffset","mapNormalWrap","mapNormalAnisotropy","mapSpecularRepeat","mapSpecularOffset","mapSpecularWrap","mapSpecularAnisotropy","mapMetalnessRepeat","mapMetalnessOffset","mapMetalnessWrap","mapMetalnessAnisotropy","mapRoughnessRepeat","mapRoughnessOffset","mapRoughnessWrap","mapRoughnessAnisotropy","mapAlphaRepeat","mapAlphaOffset","mapAlphaWrap","mapAlphaAnisotropy","LoaderUtils","decodeText","TextDecoder","decode","fromCharCode","escape","extractUrlBase","lastIndexOf","JSONLoader","setTexturePath","parseModel","isBitSet","fi","zLength","colorIndex","normalIndex","uvIndex","isQuad","faceA","faceB","uvLayer","nUvLayers","parseSkin","influencesPerVertex","parseMorphing","dstVertices","srcVertices","morphColors","parseAnimations","outputAnimations","morphAnimationClips","ObjectLoader","substring","parseShape","parseGeometries","parseImages","parseTextures","parseMaterials","parseObject","geometryLoader","bufferGeometryLoader","details","geometryShapes","loadImage","parseConstant","TEXTURE_MAPPING","TEXTURE_WRAPPING","TEXTURE_FILTER","getGeometry","getMaterial","ImageBitmapLoader","createImageBitmap","fetch","setOptions","res","blob","imageBitmap","catch","ShapePath","subPaths","currentPath","toShapes","isCCW","noHoles","toShapesNoHoles","inSubpaths","tmpPath","tmpShape","isPointInsidePolygon","inPolygon","polyLen","edgeLowPt","edgeHighPt","edgeDx","edgeDy","perpEdge","solid","holesFirst","betterShapeHoles","newShapes","newShapeHoles","mainIdx","tmpPoints","ambiguous","toChange","sIdx","sLen","sho","hIdx","ho","hole_unassigned","s2Idx","froms","tos","tmpHoles","Font","paths","createPaths","chars","line_height","yMax","yMin","underlineThickness","char","ret","createPath","glyph","glyphs","cpx","cpy","cpx1","cpy1","cpx2","cpy2","outline","_cachedOutline","action","ha","FontLoader","AudioContext","webkitAudioContext","AudioLoader","decodeAudioData","audioBuffer","StereoCamera","eyeSep","instance","eyeRight","eyeLeft","eyeSepOnProjection","ymax","xmin","xmax","CubeCamera","cubeResolution","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","AudioListener","gain","createGain","connect","destination","getInput","removeFilter","disconnect","getFilter","setFilter","getMasterVolume","setMasterVolume","setTargetAtTime","currentTime","positionX","setValueAtTime","positionY","positionZ","forwardX","forwardY","forwardZ","upX","upY","upZ","setOrientation","Audio","autoplay","loop","playbackRate","isPlaying","hasPlaybackControl","sourceType","filters","getOutput","setNodeSource","audioNode","setMediaElementSource","mediaElement","createMediaElementSource","setBuffer","play","createBufferSource","onended","onEnded","pause","getFilters","setFilters","setPlaybackRate","getPlaybackRate","getLoop","setLoop","getVolume","setVolume","PositionalAudio","panner","createPanner","getRefDistance","refDistance","setRefDistance","getRolloffFactor","rolloffFactor","setRolloffFactor","getDistanceModel","distanceModel","setDistanceModel","getMaxDistance","maxDistance","setMaxDistance","AudioAnalyser","audio","fftSize","analyser","createAnalyser","frequencyBinCount","getFrequencyData","getByteFrequencyData","getAverageFrequency","PropertyMixer","binding","mixFunction","_slerp","_select","_lerp","_mixBufferRegion","cumulativeWeight","useCount","referenceCount","accumulate","accuIndex","currentWeight","mix","originalValueOffset","saveOriginalState","getValue","restoreOriginalState","RESERVED_CHARS_RE","Composite","targetGroup","optionalParsedPath","parsedPath","PropertyBinding","parseTrackName","_targetGroup","_bindings","subscribe_","firstValidIndex","nCachedObjects_","bindings","unbind","rootNode","findNode","nodeName","root","isAnimationObjectGroup","sanitizeNodeName","reservedRe","RegExp","wordChar","wordCharOrDot","directoryRe","nodeRe","objectRe","propertyRe","trackRe","supportedObjectNames","matches","results","objectName","objectIndex","propertyIndex","lastDot","searchNodeSubtree","childNode","subTreeNode","_getValue_unavailable","_setValue_unavailable","BindingType","Direct","EntireArray","ArrayElement","HasFromToArray","Versioning","None","NeedsUpdate","MatrixWorldNeedsUpdate","GetterByBindingType","getValue_direct","getValue_array","resolvedProperty","getValue_arrayElement","getValue_toArray","SetterByBindingTypeAndVersioning","setValue_direct","targetObject","setValue_direct_setNeedsUpdate","setValue_direct_setMatrixWorldNeedsUpdate","setValue_array","dest","setValue_array_setNeedsUpdate","setValue_array_setMatrixWorldNeedsUpdate","setValue_arrayElement","setValue_arrayElement_setNeedsUpdate","setValue_arrayElement_setMatrixWorldNeedsUpdate","setValue_fromArray","setValue_fromArray_setNeedsUpdate","setValue_fromArray_setMatrixWorldNeedsUpdate","getValue_unbound","targetArray","sourceArray","nodeProperty","versioning","bindingType","_getValue_unbound","_setValue_unbound","AnimationObjectGroup","_indicesByUUID","_paths","_parsedPaths","_bindingsIndicesByPath","stats","total","inUse","bindingsPerObject","nObjects","nCachedObjects","indicesByUUID","parsedPaths","nBindings","knownObject","firstActiveIndex","lastCachedObject","bindingsForPath","lastCached","lastCachedIndex","firstActiveObject","firstActive","uncache","lastObject","indicesByPath","unsubscribe_","lastBindingsIndex","lastBindings","lastBindingsPath","AnimationAction","mixer","localRoot","_mixer","_clip","_localRoot","nTracks","interpolants","interpolantSettings","interpolant","_interpolantSettings","_interpolants","_propertyBindings","_cacheIndex","_byClipCacheIndex","_timeScaleInterpolant","_weightInterpolant","_loopCount","_startTime","_effectiveTimeScale","_effectiveWeight","repetitions","paused","clampWhenFinished","zeroSlopeAtStart","zeroSlopeAtEnd","_activateAction","_deactivateAction","stopFading","stopWarping","isRunning","_isActiveAction","isScheduled","startAt","setEffectiveWeight","getEffectiveWeight","fadeIn","_scheduleFading","fadeOut","crossFadeFrom","fadeOutAction","warp","fadeInDuration","fadeOutDuration","startEndRatio","endStartRatio","crossFadeTo","fadeInAction","weightInterpolant","_takeBackControlInterpolant","setEffectiveTimeScale","getEffectiveTimeScale","setDuration","syncWith","halt","startTimeScale","endTimeScale","now","_lendControlInterpolant","timeScaleInterpolant","getMixer","getClip","getRoot","_root","_update","deltaTime","timeDirection","_updateWeight","timeRunning","_updateTimeScale","clipTime","_updateTime","propertyMixers","interpolantValue","loopCount","_setEndings","handle_stop","pingPong","loopDelta","pending","atStart","atEnd","weightNow","weightThen","AnimationMixer","_initMemoryManager","_accuIndex","_bindAction","prototypeAction","rootUuid","bindingsByRoot","_bindingsByRootAndName","bindingsByName","_addInactiveBinding","clipUuid","actionsForClip","_actionsByClip","knownActions","_addInactiveAction","_lendBinding","_lendAction","_takeBackBinding","_takeBackAction","_actions","_nActiveActions","_nActiveBindings","_controlInterpolants","_nActiveControlInterpolants","actions","controlInterpolants","actionsByClip","actionByRoot","_removeInactiveAction","lastInactiveAction","cacheIndex","knownActionsForClip","lastKnownAction","byClipCacheIndex","_removeInactiveBindingsForAction","_removeInactiveBinding","prevIndex","lastActiveIndex","firstInactiveAction","firstInactiveIndex","lastActiveAction","bindingByName","propBinding","lastInactiveBinding","remove_empty_map","_","firstInactiveBinding","lastActiveBinding","_controlInterpolantsResultBuffer","__cacheIndex","lastActiveInterpolant","clipAction","optionalRoot","clipObject","existingAction","newAction","stopAllAction","nActions","uncacheClip","actionsToRemove","uncacheRoot","uncacheAction","Uniform","InstancedBufferGeometry","InterleavedBufferAttribute","interleavedBuffer","InterleavedBuffer","isInterleavedBuffer","InstancedInterleavedBuffer","InstancedBufferAttribute","Raycaster","PointCloud","ascSort","intersectObject","setFromCamera","coords","intersectObjects","Clock","autoStart","oldTime","elapsedTime","running","performance","Date","getElapsedTime","getDelta","newTime","Spherical","other","makeSafe","vec3","Cylindrical","Box2","ImmediateRenderObject","VertexNormalsHelper","nNormals","objGeometry","objPos","objNorm","SpotLightHelper","cone","coneLength","coneWidth","getBoneList","boneList","SkeletonHelper","boneMatrix","matrixWorldInv","PointLightHelper","sphereSize","RectAreaLightHelper","HemisphereLightHelper","GridHelper","PolarGridHelper","radials","circles","FaceNormalsHelper","DirectionalLightHelper","lightPlane","targetLine","CameraHelper","pointMap","colorFrustum","colorCone","colorUp","colorTarget","colorCross","addLine","addPoint","setPoint","BoxHelper","Box3Helper","PlaneHelper","positions2","lineGeometry","coneGeometry","ArrowHelper","headLength","headWidth","setDirection","setColor","AxesHelper","Face4","LineStrip","LinePieces","MeshFaceMaterial","MultiMaterial","Particle","ParticleSystem","PointCloudMaterial","ParticleBasicMaterial","ParticleSystemMaterial","Vertex","DynamicBufferAttribute","Int8Attribute","Uint8Attribute","Uint8ClampedAttribute","Int16Attribute","Uint16Attribute","Int32Attribute","Uint32Attribute","Float32Attribute","Float64Attribute","construct","createPointsGeometry","createGeometry","createSpacedPointsGeometry","fromPoints","ClosedSplineCurve3","SplineCurve3","Spline","initFromArray","getControlPointsArray","reparametrizeByArcLength","AxisHelper","BoundingBoxHelper","EdgesHelper","setColors","WireframeHelper","XHRLoader","BinaryTextureLoader","isIntersectionBox","isIntersectionSphere","random16","nearestPowerOfTwo","nextPowerOfTwo","flattenToArrayOffset","multiplyVector3","multiplyVector3Array","applyToBuffer","applyToVector3Array","extractPosition","getPosition","multiplyToArray","multiplyVector4","rotateAxis","crossVector","rotateByAxis","makeFrustum","isIntersectionLine","isIntersectionPlane","barycoordFromPoint","midpoint","extractAllPoints","extrude","makeGeometry","fromAttribute","distanceToManhattan","lengthManhattan","setEulerFromRotationMatrix","setEulerFromQuaternion","getPositionFromMatrix","getScaleFromMatrix","getColumnFromMatrix","applyProjection","computeTangents","getChildByName","renderDepth","getWorldRotation","eulerOrder","useQuaternion","setLens","onlyShadow","shadowCameraFov","shadowCameraLeft","shadowCameraRight","shadowCameraTop","shadowCameraBottom","shadowCameraVisible","shadowDarkness","shadowMapWidth","shadowMapHeight","copyIndicesArray","addIndex","addDrawCall","clearDrawCalls","computeOffsets","getArrays","addShapeList","wrapAround","wrapRGB","metal","animate","getCurrentRenderTarget","getPrecision","resetGLState","supportsFloatTextures","supportsHalfFloatTextures","supportsStandardDerivatives","supportsCompressedTextureS3TC","supportsCompressedTexturePVRTC","supportsBlendMinMax","supportsInstancedArrays","enableScissorTest","addPrePlugin","addPostPlugin","updateShadowMap","setFaceCulling","shadowMapCullFace","renderReverseSided","renderSingleSided","standing","audioLoader","getData","updateCubeMap","GeometryUtils","geometry1","ImageUtils","loadTextureCube","loadCompressedTexture","loadCompressedTextureCube","Projector","projectVector","unprojectVector","pickingRay","CanvasRenderer","SceneUtils","createMultiMaterialObject","detach","attach","LensFlare","CubeGeometry","process","module","exports","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","clearTimeout","runTimeout","fun","runClearTimeout","marker","draining","currentQueue","queueIndex","cleanUpNextTick","drainQueue","timeout","run","nextTick","args","Item","title","browser","env","argv","versions","noop","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","cwd","chdir","umask","undef","isFunc","isObjOrFunc","isNotVal","undefStr","tErr","MessageChannel","ntickChannel","port1","onmessage","port2","postMessage","rethrow","promise_success","fulfilled","promise_error","failed","promise_apply","defer","onlyFuncs","promise_ensure","_cb","promise_nodify","promise_rethrow","alwaysAsync","alwaysAsyncFn","fn","pendings","_promise","resolve","reject","err","execCallbacks","promise","success","otherwise","spread","ensure","nodify","isPending","getStatus","toSource","valueOf","cbs","cbIndex","_resolve","val","done","_reject","Err","fulfill","deferred","resolved","rejected","reason","wait","delay","promisify","multiPromiseResolver","callerArguments","returnPromises","promises","resolver","sequenceZenifier","zenValue","sequencePromiseResolver","funcs","all","resolveAll","sequence","nodeCapsule","subject","define","amd","oldD","D","noConflict","userDown","bgMove","indexPath","$","attr","until","handleModel","pauseVideo","parents","acceler","DeviceOrientationEvent","handleOrientation","beta","gamma","pics","getElementsByClassName","videoDom","getElementsByTagName","decr","deCodeArg","srcMap","eval","bookClick","click","successModal","append","hide","show","getElementById","toolbarClick","find","$this","hasClass","removeClass","addClass","localStorage","removeItem","location","href","shooting","huntVideo","huntVideoB","bag","ind","eq","trigger","handleReady","viewer","view_lgt","view_lat","lakeFlag","$toolbar","$progress","$nav","timer","startAutorotate","lgt","longitude","lat","latitude","attachFastClick","require","progressNum","allStep","progressFlag","mp4UrlMap","huntV","initSnowView","handleNav","getVideoSource","util","PhotoSphereViewer","panorama","Pic","min_fov","max_fov","navbar","time_anim","move_speed","anim_speed","markers","polygon_px","svgStyle","fill","anchor","glass","vids","videoEls","ajax","dataType","resouce","yuanhua","huntC","lookoutClick","playVideo","permision","getItem","html","modalShow","beerModal","css","setItem","lynxModal","foxModal","roadHtml","showFlag","hunterVideoHtml","videoHtml","lookOutHtml","eUrl","lookVideo","screenInit","entry","body","bundleURL","getBundleURLCached","getBundleURL","stack","getBaseURL","bundle","updateLink","link","newLink","cloneNode","onload","parentNode","insertBefore","nextSibling","cssTimeout","reloadCSS","links","querySelectorAll"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ASAA,IAAIwyI,YAAY,IAAhB;AACA,SAASC,kBAAT,GAA8B;AAC5B,MAAI,CAACD,SAAL,EAAgB;AACdA,gBAAYE,cAAZ;AACD;;AAED,SAAOF,SAAP;AACD;;AAED,SAASE,YAAT,GAAwB;AACtB;AACA,MAAI;AACF,UAAM,IAAIvjI,KAAJ,EAAN;AACD,GAFD,CAEE,OAAOq5H,GAAP,EAAY;AACZ,QAAIngB,UAAU,CAAC,KAAKmgB,IAAImK,KAAV,EAAiB1xI,KAAjB,CAAuB,gCAAvB,CAAd;AACA,QAAIonH,OAAJ,EAAa;AACX,aAAOuqB,WAAWvqB,QAAQ,CAAR,CAAX,CAAP;AACD;AACF;;AAED,SAAO,GAAP;AACD;;AAED,SAASuqB,UAAT,CAAoBvqH,GAApB,EAAyB;AACvB,SAAO,CAAC,KAAKA,GAAN,EAAW4sC,OAAX,CAAmB,uCAAnB,EAA4D,IAA5D,IAAoE,GAA3E;AACD;;AAEDkvE,QAAQuO,YAAR,GAAuBD,kBAAvB;AACAtO,QAAQyO,UAAR,GAAqBA,UAArB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5BA,IAAIC,SAAS1D,QAAQ,cAAR,CAAb;;AAEA,SAAS2D,UAAT,CAAoBC,IAApB,EAA0B;AACxB,MAAIC,UAAUD,KAAKE,SAAL,EAAd;AACAD,UAAQE,MAAR,GAAiB,YAAY;AAC3BH,SAAK3sG,MAAL;AACD,GAFD;AAGA4sG,UAAQpF,IAAR,GAAemF,KAAKnF,IAAL,CAAUz6E,KAAV,CAAgB,GAAhB,EAAqB,CAArB,IAA0B,GAA1B,GAAgCukE,KAAK9G,GAAL,EAA/C;AACAmiB,OAAKI,UAAL,CAAgBC,YAAhB,CAA6BJ,OAA7B,EAAsCD,KAAKM,WAA3C;AACD;;AAED,IAAIC,aAAa,IAAjB;AACA,SAASC,SAAT,GAAqB;AACnB,MAAID,UAAJ,EAAgB;AACd;AACD;;AAEDA,eAAa30C,WAAW,YAAY;AAClC,QAAI60C,QAAQjsH,SAASksH,gBAAT,CAA0B,wBAA1B,CAAZ;AACA,SAAK,IAAI5wI,IAAI,CAAb,EAAgBA,IAAI2wI,MAAMhyI,MAA1B,EAAkCqB,GAAlC,EAAuC;AACrC,UAAIgwI,OAAOD,UAAP,CAAkBY,MAAM3wI,CAAN,EAAS+qI,IAA3B,MAAqCiF,OAAOH,YAAP,EAAzC,EAAgE;AAC9DI,mBAAWU,MAAM3wI,CAAN,CAAX;AACD;AACF;;AAEDywI,iBAAa,IAAb;AACD,GATY,EASV,EATU,CAAb;AAUD;;AAEDpP,OAAOC,OAAP,GAAiBoP,SAAjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AV7BA;;AAEA,IAAKvzI,OAAOC,OAAP,KAAmBC,SAAxB,EAAoC;;AAEnCF,QAAOC,OAAP,GAAiBE,KAAKC,GAAL,CAAU,CAAV,EAAa,CAAE,EAAf,CAAjB;AAEA;;AAED,IAAKJ,OAAOK,SAAP,KAAqBH,SAA1B,EAAsC;;AAErC;AACA;;AAEAF,QAAOK,SAAP,GAAmB,UAAWC,KAAX,EAAmB;;AAErC,SAAO,OAAOA,KAAP,KAAiB,QAAjB,IAA6BC,SAAUD,KAAV,CAA7B,IAAkDH,KAAKK,KAAL,CAAYF,KAAZ,MAAwBA,KAAjF;AAEA,EAJD;AAMA;;AAED;;AAEA,IAAKH,KAAKM,IAAL,KAAcP,SAAnB,EAA+B;;AAE9B;;AAEAC,MAAKM,IAAL,GAAY,UAAWC,CAAX,EAAe;;AAE1B,SAASA,IAAI,CAAN,GAAY,CAAE,CAAd,GAAoBA,IAAI,CAAN,GAAY,CAAZ,GAAgB,CAAEA,CAA3C;AAEA,EAJD;AAMA;;AAED,IAAK,UAAUC,SAASC,SAAnB,KAAiC,KAAtC,EAA8C;;AAE7C;AACA;;AAEAC,QAAOC,cAAP,CAAuBH,SAASC,SAAhC,EAA2C,MAA3C,EAAmD;;AAElDG,OAAK,YAAY;;AAEhB,UAAO,KAAKC,QAAL,GAAgBC,KAAhB,CAAuB,2BAAvB,EAAsD,CAAtD,CAAP;AAEA;;AANiD,EAAnD;AAUA;;AAED,IAAKJ,OAAOK,MAAP,KAAkBhB,SAAvB,EAAmC;;AAElC;AACA;;AAEA,EAAE,YAAY;;AAEbW,SAAOK,MAAP,GAAgB,UAAWC,MAAX,EAAoB;;AAEnC,OAAKA,WAAWjB,SAAX,IAAwBiB,WAAW,IAAxC,EAA+C;;AAE9C,UAAM,IAAIC,SAAJ,CAAe,4CAAf,CAAN;AAEA;;AAED,OAAIC,SAASR,OAAQM,MAAR,CAAb;;AAEA,QAAM,IAAIG,QAAQ,CAAlB,EAAqBA,QAAQC,UAAUC,MAAvC,EAA+CF,OAA/C,EAA0D;;AAEzD,QAAIG,SAASF,UAAWD,KAAX,CAAb;;AAEA,QAAKG,WAAWvB,SAAX,IAAwBuB,WAAW,IAAxC,EAA+C;;AAE9C,UAAM,IAAIC,OAAV,IAAqBD,MAArB,EAA8B;;AAE7B,UAAKZ,OAAOD,SAAP,CAAiBe,cAAjB,CAAgCC,IAAhC,CAAsCH,MAAtC,EAA8CC,OAA9C,CAAL,EAA+D;;AAE9DL,cAAQK,OAAR,IAAoBD,OAAQC,OAAR,CAApB;AAEA;AAED;AAED;AAED;;AAED,UAAOL,MAAP;AAEA,GAhCD;AAkCA,EApCD;AAsCA;;AAED;;;;AAIA,SAASQ,eAAT,GAA2B,CAAE;;AAE7BhB,OAAOK,MAAP,CAAeW,gBAAgBjB,SAA/B,EAA0C;;AAEzCkB,mBAAkB,UAAWC,IAAX,EAAiBC,QAAjB,EAA4B;;AAE7C,MAAK,KAAKC,UAAL,KAAoB/B,SAAzB,EAAqC,KAAK+B,UAAL,GAAkB,EAAlB;;AAErC,MAAIC,YAAY,KAAKD,UAArB;;AAEA,MAAKC,UAAWH,IAAX,MAAsB7B,SAA3B,EAAuC;;AAEtCgC,aAAWH,IAAX,IAAoB,EAApB;AAEA;;AAED,MAAKG,UAAWH,IAAX,EAAkBI,OAAlB,CAA2BH,QAA3B,MAA0C,CAAE,CAAjD,EAAqD;;AAEpDE,aAAWH,IAAX,EAAkBK,IAAlB,CAAwBJ,QAAxB;AAEA;AAED,EApBwC;;AAsBzCK,mBAAkB,UAAWN,IAAX,EAAiBC,QAAjB,EAA4B;;AAE7C,MAAK,KAAKC,UAAL,KAAoB/B,SAAzB,EAAqC,OAAO,KAAP;;AAErC,MAAIgC,YAAY,KAAKD,UAArB;;AAEA,SAAOC,UAAWH,IAAX,MAAsB7B,SAAtB,IAAmCgC,UAAWH,IAAX,EAAkBI,OAAlB,CAA2BH,QAA3B,MAA0C,CAAE,CAAtF;AAEA,EA9BwC;;AAgCzCM,sBAAqB,UAAWP,IAAX,EAAiBC,QAAjB,EAA4B;;AAEhD,MAAK,KAAKC,UAAL,KAAoB/B,SAAzB,EAAqC;;AAErC,MAAIgC,YAAY,KAAKD,UAArB;AACA,MAAIM,gBAAgBL,UAAWH,IAAX,CAApB;;AAEA,MAAKQ,kBAAkBrC,SAAvB,EAAmC;;AAElC,OAAIoB,QAAQiB,cAAcJ,OAAd,CAAuBH,QAAvB,CAAZ;;AAEA,OAAKV,UAAU,CAAE,CAAjB,EAAqB;;AAEpBiB,kBAAcC,MAAd,CAAsBlB,KAAtB,EAA6B,CAA7B;AAEA;AAED;AAED,EAnDwC;;AAqDzCmB,gBAAe,UAAWC,KAAX,EAAmB;;AAEjC,MAAK,KAAKT,UAAL,KAAoB/B,SAAzB,EAAqC;;AAErC,MAAIgC,YAAY,KAAKD,UAArB;AACA,MAAIM,gBAAgBL,UAAWQ,MAAMX,IAAjB,CAApB;;AAEA,MAAKQ,kBAAkBrC,SAAvB,EAAmC;;AAElCwC,SAAMvB,MAAN,GAAe,IAAf;;AAEA,OAAIwB,QAAQJ,cAAcK,KAAd,CAAqB,CAArB,CAAZ;;AAEA,QAAM,IAAIC,IAAI,CAAR,EAAWC,IAAIH,MAAMnB,MAA3B,EAAmCqB,IAAIC,CAAvC,EAA0CD,GAA1C,EAAiD;;AAEhDF,UAAOE,CAAP,EAAWjB,IAAX,CAAiB,IAAjB,EAAuBc,KAAvB;AAEA;AAED;AAED;;AA1EwC,CAA1C;;AA8EA,IAAIK,WAAW,IAAf;AACA,IAAIC,QAAQ,EAAEC,MAAM,CAAR,EAAWC,QAAQ,CAAnB,EAAsBC,OAAO,CAA7B,EAAZ;AACA,IAAIC,eAAe,CAAnB;AACA,IAAIC,eAAe,CAAnB;AACA,IAAIC,gBAAgB,CAApB;AACA,IAAIC,oBAAoB,CAAxB;AACA,IAAIC,uBAAuB,CAA3B;AACA,IAAIC,wBAAwB,CAA5B;AACA,IAAIC,iBAAiB,CAArB;AACA,IAAIC,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;AACA,IAAIC,YAAY,CAAhB;AACA,IAAIC,WAAW,CAAf;AACA,IAAIC,aAAa,CAAjB;AACA,IAAIC,cAAc,CAAlB;AACA,IAAIC,gBAAgB,CAApB;AACA,IAAIC,WAAW,CAAf;AACA,IAAIC,aAAa,CAAjB;AACA,IAAIC,eAAe,CAAnB;AACA,IAAIC,aAAa,CAAjB;AACA,IAAIC,iBAAiB,CAArB;AACA,IAAIC,mBAAmB,CAAvB;AACA,IAAIC,sBAAsB,CAA1B;AACA,IAAIC,mBAAmB,CAAvB;AACA,IAAIC,iBAAiB,CAArB;AACA,IAAIC,cAAc,GAAlB;AACA,IAAIC,mBAAmB,GAAvB;AACA,IAAIC,0BAA0B,GAA9B;AACA,IAAIC,cAAc,GAAlB;AACA,IAAIC,cAAc,GAAlB;AACA,IAAIC,aAAa,GAAjB;AACA,IAAIC,YAAY,GAAhB;AACA,IAAIC,iBAAiB,GAArB;AACA,IAAIC,yBAAyB,GAA7B;AACA,IAAIC,iBAAiB,GAArB;AACA,IAAIC,yBAAyB,GAA7B;AACA,IAAIC,iBAAiB,GAArB;AACA,IAAIC,yBAAyB,GAA7B;AACA,IAAIC,iBAAiB,GAArB;AACA,IAAIC,yBAAyB,GAA7B;AACA,IAAIC,yBAAyB,GAA7B;AACA,IAAIC,aAAa,CAAjB;AACA,IAAIC,cAAc,CAAlB;AACA,IAAIC,YAAY,CAAhB;AACA,IAAIC,iBAAiB,CAArB;AACA,IAAIC,aAAa,CAAjB;AACA,IAAIC,oBAAoB,CAAxB;AACA,IAAIC,eAAe,CAAnB;AACA,IAAIC,gBAAgB,CAApB;AACA,IAAIC,oBAAoB,CAAxB;AACA,IAAIC,eAAe,CAAnB;AACA,IAAIC,eAAe,CAAnB;AACA,IAAIC,gBAAgB,CAApB;AACA,IAAIC,oBAAoB,CAAxB;AACA,IAAIC,sBAAsB,CAA1B;AACA,IAAIC,wBAAwB,CAA5B;AACA,IAAIC,oBAAoB,CAAxB;AACA,IAAIC,YAAY,GAAhB;AACA,IAAIC,wBAAwB,GAA5B;AACA,IAAIC,wBAAwB,GAA5B;AACA,IAAIC,mCAAmC,GAAvC;AACA,IAAIC,mCAAmC,GAAvC;AACA,IAAIC,6BAA6B,GAAjC;AACA,IAAIC,0BAA0B,GAA9B;AACA,IAAIC,0BAA0B,GAA9B;AACA,IAAIC,iBAAiB,IAArB;AACA,IAAIC,sBAAsB,IAA1B;AACA,IAAIC,yBAAyB,IAA7B;AACA,IAAIC,gBAAgB,IAApB;AACA,IAAIC,6BAA6B,IAAjC;AACA,IAAIC,4BAA4B,IAAhC;AACA,IAAIC,eAAe,IAAnB;AACA,IAAIC,4BAA4B,IAAhC;AACA,IAAIC,2BAA2B,IAA/B;AACA,IAAIC,mBAAmB,IAAvB;AACA,IAAIC,WAAW,IAAf;AACA,IAAIC,YAAY,IAAhB;AACA,IAAIC,oBAAoB,IAAxB;AACA,IAAIC,UAAU,IAAd;AACA,IAAIC,kBAAkB,IAAtB;AACA,IAAIC,YAAY,IAAhB;AACA,IAAIC,gBAAgB,IAApB;AACA,IAAIC,wBAAwB,IAA5B;AACA,IAAIC,wBAAwB,IAA5B;AACA,IAAIC,uBAAuB,IAA3B;AACA,IAAIC,qBAAqB,IAAzB;AACA,IAAIC,cAAc,IAAlB;AACA,IAAIC,YAAY,IAAhB;AACA,IAAIC,aAAa,IAAjB;AACA,IAAIC,kBAAkB,IAAtB;AACA,IAAIC,uBAAuB,IAA3B;AACA,IAAIC,aAAaH,UAAjB;AACA,IAAII,cAAc,IAAlB;AACA,IAAIC,qBAAqB,IAAzB;AACA,IAAIC,uBAAuB,KAA3B;AACA,IAAIC,wBAAwB,KAA5B;AACA,IAAIC,wBAAwB,KAA5B;AACA,IAAIC,wBAAwB,KAA5B;AACA,IAAIC,0BAA0B,KAA9B;AACA,IAAIC,0BAA0B,KAA9B;AACA,IAAIC,2BAA2B,KAA/B;AACA,IAAIC,2BAA2B,KAA/B;AACA,IAAIC,kBAAkB,KAAtB;AACA,IAAIC,uBAAuB,KAA3B;AACA,IAAIC,uBAAuB,KAA3B;AACA,IAAIC,uBAAuB,KAA3B;AACA,IAAIC,uBAAuB,KAA3B;AACA,IAAIC,uBAAuB,KAA3B;AACA,IAAIC,uBAAuB,KAA3B;AACA,IAAIC,uBAAuB,KAA3B;AACA,IAAIC,uBAAuB,KAA3B;AACA,IAAIC,wBAAwB,KAA5B;AACA,IAAIC,wBAAwB,KAA5B;AACA,IAAIC,wBAAwB,KAA5B;AACA,IAAIC,yBAAyB,KAA7B;AACA,IAAIC,yBAAyB,KAA7B;AACA,IAAIC,yBAAyB,KAA7B;AACA,IAAIC,WAAW,IAAf;AACA,IAAIC,aAAa,IAAjB;AACA,IAAIC,eAAe,IAAnB;AACA,IAAIC,sBAAsB,IAA1B;AACA,IAAIC,oBAAoB,IAAxB;AACA,IAAIC,oBAAoB,IAAxB;AACA,IAAIC,sBAAsB,IAA1B;AACA,IAAIC,kBAAkB,IAAtB;AACA,IAAIC,mBAAmB,IAAvB;AACA,IAAIC,oBAAoB,CAAxB;AACA,IAAIC,wBAAwB,CAA5B;AACA,IAAIC,sBAAsB,CAA1B;AACA,IAAIC,iBAAiB,IAArB;AACA,IAAIC,eAAe,IAAnB;AACA,IAAIC,gBAAgB,IAApB;AACA,IAAIC,eAAe,IAAnB;AACA,IAAIC,iBAAiB,IAArB;AACA,IAAIC,gBAAgB,IAApB;AACA,IAAIC,iBAAiB,IAArB;AACA,IAAIC,eAAe,IAAnB;AACA,IAAIC,oBAAoB,IAAxB;AACA,IAAIC,mBAAmB,IAAvB;;AAEA;;;;;AAKA,IAAIC,QAAQ;;AAEXC,UAAS3L,KAAK4L,EAAL,GAAU,GAFR;AAGXC,UAAS,MAAM7L,KAAK4L,EAHT;;AAKXE,eAAgB,YAAY;;AAE3B;;AAEA,MAAIC,MAAM,EAAV;;AAEA,OAAM,IAAIrJ,IAAI,CAAd,EAAiBA,IAAI,GAArB,EAA0BA,GAA1B,EAAiC;;AAEhCqJ,OAAKrJ,CAAL,IAAW,CAAEA,IAAI,EAAJ,GAAS,GAAT,GAAe,EAAjB,IAA0BA,CAAF,CAAM7B,QAAN,CAAgB,EAAhB,CAAnC;AAEA;;AAED,SAAO,SAASiL,YAAT,GAAwB;;AAE9B,OAAIE,KAAKhM,KAAKiM,MAAL,KAAgB,UAAhB,GAA6B,CAAtC;AACA,OAAIC,KAAKlM,KAAKiM,MAAL,KAAgB,UAAhB,GAA6B,CAAtC;AACA,OAAIE,KAAKnM,KAAKiM,MAAL,KAAgB,UAAhB,GAA6B,CAAtC;AACA,OAAIG,KAAKpM,KAAKiM,MAAL,KAAgB,UAAhB,GAA6B,CAAtC;AACA,OAAII,OAAON,IAAKC,KAAK,IAAV,IAAmBD,IAAKC,MAAM,CAAN,GAAU,IAAf,CAAnB,GAA2CD,IAAKC,MAAM,EAAN,GAAW,IAAhB,CAA3C,GAAoED,IAAKC,MAAM,EAAN,GAAW,IAAhB,CAApE,GAA6F,GAA7F,GACVD,IAAKG,KAAK,IAAV,CADU,GACSH,IAAKG,MAAM,CAAN,GAAU,IAAf,CADT,GACiC,GADjC,GACuCH,IAAKG,MAAM,EAAN,GAAW,IAAX,GAAkB,IAAvB,CADvC,GACuEH,IAAKG,MAAM,EAAN,GAAW,IAAhB,CADvE,GACgG,GADhG,GAEVH,IAAKI,KAAK,IAAL,GAAY,IAAjB,CAFU,GAEgBJ,IAAKI,MAAM,CAAN,GAAU,IAAf,CAFhB,GAEwC,GAFxC,GAE8CJ,IAAKI,MAAM,EAAN,GAAW,IAAhB,CAF9C,GAEuEJ,IAAKI,MAAM,EAAN,GAAW,IAAhB,CAFvE,GAGVJ,IAAKK,KAAK,IAAV,CAHU,GAGSL,IAAKK,MAAM,CAAN,GAAU,IAAf,CAHT,GAGiCL,IAAKK,MAAM,EAAN,GAAW,IAAhB,CAHjC,GAG0DL,IAAKK,MAAM,EAAN,GAAW,IAAhB,CAHrE;;AAKA;AACA,UAAOC,KAAKC,WAAL,EAAP;AAEA,GAdD;AAgBA,EA5Ba,EALH;;AAmCXC,QAAO,UAAWpM,KAAX,EAAkBqM,GAAlB,EAAuBC,GAAvB,EAA6B;;AAEnC,SAAOzM,KAAKyM,GAAL,CAAUD,GAAV,EAAexM,KAAKwM,GAAL,CAAUC,GAAV,EAAetM,KAAf,CAAf,CAAP;AAEA,EAvCU;;AAyCX;AACA;;AAEAuM,kBAAiB,UAAWC,CAAX,EAAcC,CAAd,EAAkB;;AAElC,SAAO,CAAID,IAAIC,CAAN,GAAYA,CAAd,IAAoBA,CAA3B;AAEA,EAhDU;;AAkDX;;AAEAC,YAAW,UAAWtM,CAAX,EAAcuM,EAAd,EAAkBC,EAAlB,EAAsBC,EAAtB,EAA0BC,EAA1B,EAA+B;;AAEzC,SAAOD,KAAK,CAAEzM,IAAIuM,EAAN,KAAeG,KAAKD,EAApB,KAA6BD,KAAKD,EAAlC,CAAZ;AAEA,EAxDU;;AA0DX;;AAEAI,OAAM,UAAW3M,CAAX,EAAc4M,CAAd,EAAiBC,CAAjB,EAAqB;;AAE1B,SAAO,CAAE,IAAIA,CAAN,IAAY7M,CAAZ,GAAgB6M,IAAID,CAA3B;AAEA,EAhEU;;AAkEX;;AAEAE,aAAY,UAAW9M,CAAX,EAAciM,GAAd,EAAmBC,GAAnB,EAAyB;;AAEpC,MAAKlM,KAAKiM,GAAV,EAAgB,OAAO,CAAP;AAChB,MAAKjM,KAAKkM,GAAV,EAAgB,OAAO,CAAP;;AAEhBlM,MAAI,CAAEA,IAAIiM,GAAN,KAAgBC,MAAMD,GAAtB,CAAJ;;AAEA,SAAOjM,IAAIA,CAAJ,IAAU,IAAI,IAAIA,CAAlB,CAAP;AAEA,EA7EU;;AA+EX+M,eAAc,UAAW/M,CAAX,EAAciM,GAAd,EAAmBC,GAAnB,EAAyB;;AAEtC,MAAKlM,KAAKiM,GAAV,EAAgB,OAAO,CAAP;AAChB,MAAKjM,KAAKkM,GAAV,EAAgB,OAAO,CAAP;;AAEhBlM,MAAI,CAAEA,IAAIiM,GAAN,KAAgBC,MAAMD,GAAtB,CAAJ;;AAEA,SAAOjM,IAAIA,CAAJ,GAAQA,CAAR,IAAcA,KAAMA,IAAI,CAAJ,GAAQ,EAAd,IAAqB,EAAnC,CAAP;AAEA,EAxFU;;AA0FX;;AAEAgN,UAAS,UAAWC,GAAX,EAAgBC,IAAhB,EAAuB;;AAE/B,SAAOD,MAAMxN,KAAKK,KAAL,CAAYL,KAAKiM,MAAL,MAAkBwB,OAAOD,GAAP,GAAa,CAA/B,CAAZ,CAAb;AAEA,EAhGU;;AAkGX;;AAEAE,YAAW,UAAWF,GAAX,EAAgBC,IAAhB,EAAuB;;AAEjC,SAAOD,MAAMxN,KAAKiM,MAAL,MAAkBwB,OAAOD,GAAzB,CAAb;AAEA,EAxGU;;AA0GX;;AAEAG,kBAAiB,UAAWC,KAAX,EAAmB;;AAEnC,SAAOA,SAAU,MAAM5N,KAAKiM,MAAL,EAAhB,CAAP;AAEA,EAhHU;;AAkHX4B,WAAU,UAAWC,OAAX,EAAqB;;AAE9B,SAAOA,UAAUpC,MAAMC,OAAvB;AAEA,EAtHU;;AAwHXoC,WAAU,UAAWC,OAAX,EAAqB;;AAE9B,SAAOA,UAAUtC,MAAMG,OAAvB;AAEA,EA5HU;;AA8HXoC,eAAc,UAAW9N,KAAX,EAAmB;;AAEhC,SAAO,CAAEA,QAAUA,QAAQ,CAApB,MAA8B,CAA9B,IAAmCA,UAAU,CAApD;AAEA,EAlIU;;AAoIX+N,iBAAgB,UAAW/N,KAAX,EAAmB;;AAElC,SAAOH,KAAKC,GAAL,CAAU,CAAV,EAAaD,KAAKmO,IAAL,CAAWnO,KAAKoO,GAAL,CAAUjO,KAAV,IAAoBH,KAAKqO,GAApC,CAAb,CAAP;AAEA,EAxIU;;AA0IXC,kBAAiB,UAAWnO,KAAX,EAAmB;;AAEnC,SAAOH,KAAKC,GAAL,CAAU,CAAV,EAAaD,KAAKK,KAAL,CAAYL,KAAKoO,GAAL,CAAUjO,KAAV,IAAoBH,KAAKqO,GAArC,CAAb,CAAP;AAEA;;AA9IU,CAAZ;;AAkJA;;;;;;;AAOA,SAASE,OAAT,CAAkBhO,CAAlB,EAAqB4M,CAArB,EAAyB;;AAExB,MAAK5M,CAAL,GAASA,KAAK,CAAd;AACA,MAAK4M,CAAL,GAASA,KAAK,CAAd;AAEA;;AAEDzM,OAAO8N,gBAAP,CAAyBD,QAAQ9N,SAAjC,EAA4C;;AAE3C,UAAS;;AAERG,OAAK,YAAY;;AAEhB,UAAO,KAAKL,CAAZ;AAEA,GANO;;AAQRkO,OAAK,UAAWtO,KAAX,EAAmB;;AAEvB,QAAKI,CAAL,GAASJ,KAAT;AAEA;;AAZO,EAFkC;;AAkB3C,WAAU;;AAETS,OAAK,YAAY;;AAEhB,UAAO,KAAKuM,CAAZ;AAEA,GANQ;;AAQTsB,OAAK,UAAWtO,KAAX,EAAmB;;AAEvB,QAAKgN,CAAL,GAAShN,KAAT;AAEA;;AAZQ;;AAlBiC,CAA5C;;AAoCAO,OAAOK,MAAP,CAAewN,QAAQ9N,SAAvB,EAAkC;;AAEjCiO,YAAW,IAFsB;;AAIjCD,MAAK,UAAWlO,CAAX,EAAc4M,CAAd,EAAkB;;AAEtB,OAAK5M,CAAL,GAASA,CAAT;AACA,OAAK4M,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EAXgC;;AAajCwB,YAAW,UAAWC,MAAX,EAAoB;;AAE9B,OAAKrO,CAAL,GAASqO,MAAT;AACA,OAAKzB,CAAL,GAASyB,MAAT;;AAEA,SAAO,IAAP;AAEA,EApBgC;;AAsBjCC,OAAM,UAAWtO,CAAX,EAAe;;AAEpB,OAAKA,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EA5BgC;;AA8BjCuO,OAAM,UAAW3B,CAAX,EAAe;;AAEpB,OAAKA,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EApCgC;;AAsCjC4B,eAAc,UAAW5N,KAAX,EAAkBhB,KAAlB,EAA0B;;AAEvC,UAASgB,KAAT;;AAEC,QAAK,CAAL;AAAQ,SAAKZ,CAAL,GAASJ,KAAT,CAAgB;AACxB,QAAK,CAAL;AAAQ,SAAKgN,CAAL,GAAShN,KAAT,CAAgB;AACxB;AAAS,UAAM,IAAI6O,KAAJ,CAAW,4BAA4B7N,KAAvC,CAAN;;AAJV;;AAQA,SAAO,IAAP;AAEA,EAlDgC;;AAoDjC8N,eAAc,UAAW9N,KAAX,EAAmB;;AAEhC,UAASA,KAAT;;AAEC,QAAK,CAAL;AAAQ,WAAO,KAAKZ,CAAZ;AACR,QAAK,CAAL;AAAQ,WAAO,KAAK4M,CAAZ;AACR;AAAS,UAAM,IAAI6B,KAAJ,CAAW,4BAA4B7N,KAAvC,CAAN;;AAJV;AAQA,EA9DgC;;AAgEjC+N,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAK5O,CAA3B,EAA8B,KAAK4M,CAAnC,CAAP;AAEA,EApEgC;;AAsEjCiC,OAAM,UAAWC,CAAX,EAAe;;AAEpB,OAAK9O,CAAL,GAAS8O,EAAE9O,CAAX;AACA,OAAK4M,CAAL,GAASkC,EAAElC,CAAX;;AAEA,SAAO,IAAP;AAEA,EA7EgC;;AA+EjCmC,MAAK,UAAWD,CAAX,EAAcE,CAAd,EAAkB;;AAEtB,MAAKA,MAAMxP,SAAX,EAAuB;;AAEtByP,WAAQC,IAAR,CAAc,uFAAd;AACA,UAAO,KAAKC,UAAL,CAAiBL,CAAjB,EAAoBE,CAApB,CAAP;AAEA;;AAED,OAAKhP,CAAL,IAAU8O,EAAE9O,CAAZ;AACA,OAAK4M,CAAL,IAAUkC,EAAElC,CAAZ;;AAEA,SAAO,IAAP;AAEA,EA7FgC;;AA+FjCwC,YAAW,UAAWC,CAAX,EAAe;;AAEzB,OAAKrP,CAAL,IAAUqP,CAAV;AACA,OAAKzC,CAAL,IAAUyC,CAAV;;AAEA,SAAO,IAAP;AAEA,EAtGgC;;AAwGjCF,aAAY,UAAWG,CAAX,EAAcC,CAAd,EAAkB;;AAE7B,OAAKvP,CAAL,GAASsP,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAjB;AACA,OAAK4M,CAAL,GAAS0C,EAAE1C,CAAF,GAAM2C,EAAE3C,CAAjB;;AAEA,SAAO,IAAP;AAEA,EA/GgC;;AAiHjC4C,kBAAiB,UAAWV,CAAX,EAAcO,CAAd,EAAkB;;AAElC,OAAKrP,CAAL,IAAU8O,EAAE9O,CAAF,GAAMqP,CAAhB;AACA,OAAKzC,CAAL,IAAUkC,EAAElC,CAAF,GAAMyC,CAAhB;;AAEA,SAAO,IAAP;AAEA,EAxHgC;;AA0HjCI,MAAK,UAAWX,CAAX,EAAcE,CAAd,EAAkB;;AAEtB,MAAKA,MAAMxP,SAAX,EAAuB;;AAEtByP,WAAQC,IAAR,CAAc,uFAAd;AACA,UAAO,KAAKQ,UAAL,CAAiBZ,CAAjB,EAAoBE,CAApB,CAAP;AAEA;;AAED,OAAKhP,CAAL,IAAU8O,EAAE9O,CAAZ;AACA,OAAK4M,CAAL,IAAUkC,EAAElC,CAAZ;;AAEA,SAAO,IAAP;AAEA,EAxIgC;;AA0IjC+C,YAAW,UAAWN,CAAX,EAAe;;AAEzB,OAAKrP,CAAL,IAAUqP,CAAV;AACA,OAAKzC,CAAL,IAAUyC,CAAV;;AAEA,SAAO,IAAP;AAEA,EAjJgC;;AAmJjCK,aAAY,UAAWJ,CAAX,EAAcC,CAAd,EAAkB;;AAE7B,OAAKvP,CAAL,GAASsP,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAjB;AACA,OAAK4M,CAAL,GAAS0C,EAAE1C,CAAF,GAAM2C,EAAE3C,CAAjB;;AAEA,SAAO,IAAP;AAEA,EA1JgC;;AA4JjCgD,WAAU,UAAWd,CAAX,EAAe;;AAExB,OAAK9O,CAAL,IAAU8O,EAAE9O,CAAZ;AACA,OAAK4M,CAAL,IAAUkC,EAAElC,CAAZ;;AAEA,SAAO,IAAP;AAEA,EAnKgC;;AAqKjCiD,iBAAgB,UAAWxB,MAAX,EAAoB;;AAEnC,OAAKrO,CAAL,IAAUqO,MAAV;AACA,OAAKzB,CAAL,IAAUyB,MAAV;;AAEA,SAAO,IAAP;AAEA,EA5KgC;;AA8KjCyB,SAAQ,UAAWhB,CAAX,EAAe;;AAEtB,OAAK9O,CAAL,IAAU8O,EAAE9O,CAAZ;AACA,OAAK4M,CAAL,IAAUkC,EAAElC,CAAZ;;AAEA,SAAO,IAAP;AAEA,EArLgC;;AAuLjCmD,eAAc,UAAW1B,MAAX,EAAoB;;AAEjC,SAAO,KAAKwB,cAAL,CAAqB,IAAIxB,MAAzB,CAAP;AAEA,EA3LgC;;AA6LjC2B,eAAc,UAAW3D,CAAX,EAAe;;AAE5B,MAAIrM,IAAI,KAAKA,CAAb;AAAA,MAAgB4M,IAAI,KAAKA,CAAzB;AACA,MAAIqD,IAAI5D,EAAE6D,QAAV;;AAEA,OAAKlQ,CAAL,GAASiQ,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,CAAnC;AACA,OAAKrD,CAAL,GAASqD,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,CAAnC;;AAEA,SAAO,IAAP;AAEA,EAvMgC;;AAyMjChE,MAAK,UAAW6C,CAAX,EAAe;;AAEnB,OAAK9O,CAAL,GAASP,KAAKwM,GAAL,CAAU,KAAKjM,CAAf,EAAkB8O,EAAE9O,CAApB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKwM,GAAL,CAAU,KAAKW,CAAf,EAAkBkC,EAAElC,CAApB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAhNgC;;AAkNjCV,MAAK,UAAW4C,CAAX,EAAe;;AAEnB,OAAK9O,CAAL,GAASP,KAAKyM,GAAL,CAAU,KAAKlM,CAAf,EAAkB8O,EAAE9O,CAApB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKyM,GAAL,CAAU,KAAKU,CAAf,EAAkBkC,EAAElC,CAApB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAzNgC;;AA2NjCZ,QAAO,UAAWC,GAAX,EAAgBC,GAAhB,EAAsB;;AAE5B;;AAEA,OAAKlM,CAAL,GAASP,KAAKyM,GAAL,CAAUD,IAAIjM,CAAd,EAAiBP,KAAKwM,GAAL,CAAUC,IAAIlM,CAAd,EAAiB,KAAKA,CAAtB,CAAjB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKyM,GAAL,CAAUD,IAAIW,CAAd,EAAiBnN,KAAKwM,GAAL,CAAUC,IAAIU,CAAd,EAAiB,KAAKA,CAAtB,CAAjB,CAAT;;AAEA,SAAO,IAAP;AAEA,EApOgC;;AAsOjCuD,cAAa,YAAY;;AAExB,MAAIlE,MAAM,IAAI+B,OAAJ,EAAV;AACA,MAAI9B,MAAM,IAAI8B,OAAJ,EAAV;;AAEA,SAAO,SAASmC,WAAT,CAAsBC,MAAtB,EAA8BC,MAA9B,EAAuC;;AAE7CpE,OAAIiC,GAAJ,CAASkC,MAAT,EAAiBA,MAAjB;AACAlE,OAAIgC,GAAJ,CAASmC,MAAT,EAAiBA,MAAjB;;AAEA,UAAO,KAAKrE,KAAL,CAAYC,GAAZ,EAAiBC,GAAjB,CAAP;AAEA,GAPD;AASA,EAdY,EAtOoB;;AAsPjCoE,cAAa,UAAWrE,GAAX,EAAgBC,GAAhB,EAAsB;;AAElC,MAAIpL,SAAS,KAAKA,MAAL,EAAb;;AAEA,SAAO,KAAKiP,YAAL,CAAmBjP,UAAU,CAA7B,EAAiC+O,cAAjC,CAAiDpQ,KAAKyM,GAAL,CAAUD,GAAV,EAAexM,KAAKwM,GAAL,CAAUC,GAAV,EAAepL,MAAf,CAAf,CAAjD,CAAP;AAEA,EA5PgC;;AA8PjChB,QAAO,YAAY;;AAElB,OAAKE,CAAL,GAASP,KAAKK,KAAL,CAAY,KAAKE,CAAjB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKK,KAAL,CAAY,KAAK8M,CAAjB,CAAT;;AAEA,SAAO,IAAP;AAEA,EArQgC;;AAuQjCgB,OAAM,YAAY;;AAEjB,OAAK5N,CAAL,GAASP,KAAKmO,IAAL,CAAW,KAAK5N,CAAhB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKmO,IAAL,CAAW,KAAKhB,CAAhB,CAAT;;AAEA,SAAO,IAAP;AAEA,EA9QgC;;AAgRjC2D,QAAO,YAAY;;AAElB,OAAKvQ,CAAL,GAASP,KAAK8Q,KAAL,CAAY,KAAKvQ,CAAjB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAK8Q,KAAL,CAAY,KAAK3D,CAAjB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAvRgC;;AAyRjC4D,cAAa,YAAY;;AAExB,OAAKxQ,CAAL,GAAW,KAAKA,CAAL,GAAS,CAAX,GAAiBP,KAAKmO,IAAL,CAAW,KAAK5N,CAAhB,CAAjB,GAAuCP,KAAKK,KAAL,CAAY,KAAKE,CAAjB,CAAhD;AACA,OAAK4M,CAAL,GAAW,KAAKA,CAAL,GAAS,CAAX,GAAiBnN,KAAKmO,IAAL,CAAW,KAAKhB,CAAhB,CAAjB,GAAuCnN,KAAKK,KAAL,CAAY,KAAK8M,CAAjB,CAAhD;;AAEA,SAAO,IAAP;AAEA,EAhSgC;;AAkSjC6D,SAAQ,YAAY;;AAEnB,OAAKzQ,CAAL,GAAS,CAAE,KAAKA,CAAhB;AACA,OAAK4M,CAAL,GAAS,CAAE,KAAKA,CAAhB;;AAEA,SAAO,IAAP;AAEA,EAzSgC;;AA2SjC8D,MAAK,UAAW5B,CAAX,EAAe;;AAEnB,SAAO,KAAK9O,CAAL,GAAS8O,EAAE9O,CAAX,GAAe,KAAK4M,CAAL,GAASkC,EAAElC,CAAjC;AAEA,EA/SgC;;AAiTjC+D,WAAU,YAAY;;AAErB,SAAO,KAAK3Q,CAAL,GAAS,KAAKA,CAAd,GAAkB,KAAK4M,CAAL,GAAS,KAAKA,CAAvC;AAEA,EArTgC;;AAuTjC9L,SAAQ,YAAY;;AAEnB,SAAOrB,KAAKmR,IAAL,CAAW,KAAK5Q,CAAL,GAAS,KAAKA,CAAd,GAAkB,KAAK4M,CAAL,GAAS,KAAKA,CAA3C,CAAP;AAEA,EA3TgC;;AA6TjCiE,kBAAiB,YAAY;;AAE5B,SAAOpR,KAAKqR,GAAL,CAAU,KAAK9Q,CAAf,IAAqBP,KAAKqR,GAAL,CAAU,KAAKlE,CAAf,CAA5B;AAEA,EAjUgC;;AAmUjCmE,YAAW,YAAY;;AAEtB,SAAO,KAAKhB,YAAL,CAAmB,KAAKjP,MAAL,MAAiB,CAApC,CAAP;AAEA,EAvUgC;;AAyUjCkQ,QAAO,YAAY;;AAElB;;AAEA,MAAIA,QAAQvR,KAAKwR,KAAL,CAAY,KAAKrE,CAAjB,EAAoB,KAAK5M,CAAzB,CAAZ;;AAEA,MAAKgR,QAAQ,CAAb,EAAiBA,SAAS,IAAIvR,KAAK4L,EAAlB;;AAEjB,SAAO2F,KAAP;AAEA,EAnVgC;;AAqVjCE,aAAY,UAAWpC,CAAX,EAAe;;AAE1B,SAAOrP,KAAKmR,IAAL,CAAW,KAAKO,iBAAL,CAAwBrC,CAAxB,CAAX,CAAP;AAEA,EAzVgC;;AA2VjCqC,oBAAmB,UAAWrC,CAAX,EAAe;;AAEjC,MAAIsC,KAAK,KAAKpR,CAAL,GAAS8O,EAAE9O,CAApB;AAAA,MAAuBqR,KAAK,KAAKzE,CAAL,GAASkC,EAAElC,CAAvC;AACA,SAAOwE,KAAKA,EAAL,GAAUC,KAAKA,EAAtB;AAEA,EAhWgC;;AAkWjCC,sBAAqB,UAAWxC,CAAX,EAAe;;AAEnC,SAAOrP,KAAKqR,GAAL,CAAU,KAAK9Q,CAAL,GAAS8O,EAAE9O,CAArB,IAA2BP,KAAKqR,GAAL,CAAU,KAAKlE,CAAL,GAASkC,EAAElC,CAArB,CAAlC;AAEA,EAtWgC;;AAwWjC2E,YAAW,UAAWzQ,MAAX,EAAoB;;AAE9B,SAAO,KAAKiQ,SAAL,GAAiBlB,cAAjB,CAAiC/O,MAAjC,CAAP;AAEA,EA5WgC;;AA8WjC6L,OAAM,UAAWmC,CAAX,EAAc0C,KAAd,EAAsB;;AAE3B,OAAKxR,CAAL,IAAU,CAAE8O,EAAE9O,CAAF,GAAM,KAAKA,CAAb,IAAmBwR,KAA7B;AACA,OAAK5E,CAAL,IAAU,CAAEkC,EAAElC,CAAF,GAAM,KAAKA,CAAb,IAAmB4E,KAA7B;;AAEA,SAAO,IAAP;AAEA,EArXgC;;AAuXjCC,cAAa,UAAWC,EAAX,EAAeC,EAAf,EAAmBH,KAAnB,EAA2B;;AAEvC,SAAO,KAAK9B,UAAL,CAAiBiC,EAAjB,EAAqBD,EAArB,EAA0B7B,cAA1B,CAA0C2B,KAA1C,EAAkDzC,GAAlD,CAAuD2C,EAAvD,CAAP;AAEA,EA3XgC;;AA6XjCE,SAAQ,UAAW9C,CAAX,EAAe;;AAEtB,SAAWA,EAAE9O,CAAF,KAAQ,KAAKA,CAAf,IAAwB8O,EAAElC,CAAF,KAAQ,KAAKA,CAA9C;AAEA,EAjYgC;;AAmYjCiF,YAAW,UAAW5P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAErC,MAAKA,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,OAAK9R,CAAL,GAASiC,MAAO6P,MAAP,CAAT;AACA,OAAKlF,CAAL,GAAS3K,MAAO6P,SAAS,CAAhB,CAAT;;AAEA,SAAO,IAAP;AAEA,EA5YgC;;AA8YjCC,UAAS,UAAW9P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEnC,MAAK7P,UAAUzC,SAAf,EAA2ByC,QAAQ,EAAR;AAC3B,MAAK6P,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B7P,QAAO6P,MAAP,IAAkB,KAAK9R,CAAvB;AACAiC,QAAO6P,SAAS,CAAhB,IAAsB,KAAKlF,CAA3B;;AAEA,SAAO3K,KAAP;AAEA,EAxZgC;;AA0ZjC+P,sBAAqB,UAAWC,SAAX,EAAsBrR,KAAtB,EAA6BkR,MAA7B,EAAsC;;AAE1D,MAAKA,WAAWtS,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,qEAAd;AAEA;;AAED,OAAKlP,CAAL,GAASiS,UAAUC,IAAV,CAAgBtR,KAAhB,CAAT;AACA,OAAKgM,CAAL,GAASqF,UAAUE,IAAV,CAAgBvR,KAAhB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAvagC;;AAyajCwR,eAAc,UAAWC,MAAX,EAAmBrB,KAAnB,EAA2B;;AAExC,MAAIsB,IAAI7S,KAAK8S,GAAL,CAAUvB,KAAV,CAAR;AAAA,MAA2B3B,IAAI5P,KAAK+S,GAAL,CAAUxB,KAAV,CAA/B;;AAEA,MAAIhR,IAAI,KAAKA,CAAL,GAASqS,OAAOrS,CAAxB;AACA,MAAI4M,IAAI,KAAKA,CAAL,GAASyF,OAAOzF,CAAxB;;AAEA,OAAK5M,CAAL,GAASA,IAAIsS,CAAJ,GAAQ1F,IAAIyC,CAAZ,GAAgBgD,OAAOrS,CAAhC;AACA,OAAK4M,CAAL,GAAS5M,IAAIqP,CAAJ,GAAQzC,IAAI0F,CAAZ,GAAgBD,OAAOzF,CAAhC;;AAEA,SAAO,IAAP;AAEA;;AArbgC,CAAlC;;AAybA;;;;;;;;;;;;;AAaA,SAAS6F,OAAT,GAAmB;;AAElB,MAAKvC,QAAL,GAAgB,CAEf,CAFe,EAEZ,CAFY,EAET,CAFS,EAEN,CAFM,EAGf,CAHe,EAGZ,CAHY,EAGT,CAHS,EAGN,CAHM,EAIf,CAJe,EAIZ,CAJY,EAIT,CAJS,EAIN,CAJM,EAKf,CALe,EAKZ,CALY,EAKT,CALS,EAKN,CALM,CAAhB;;AASA,KAAKrP,UAAUC,MAAV,GAAmB,CAAxB,EAA4B;;AAE3BmO,UAAQyD,KAAR,CAAe,+EAAf;AAEA;AAED;;AAEDvS,OAAOK,MAAP,CAAeiS,QAAQvS,SAAvB,EAAkC;;AAEjCyS,YAAW,IAFsB;;AAIjCzE,MAAK,UAAW0E,GAAX,EAAgBC,GAAhB,EAAqBC,GAArB,EAA0BC,GAA1B,EAA+BC,GAA/B,EAAoCC,GAApC,EAAyCC,GAAzC,EAA8CC,GAA9C,EAAmDC,GAAnD,EAAwDC,GAAxD,EAA6DC,GAA7D,EAAkEC,GAAlE,EAAuEC,GAAvE,EAA4EC,GAA5E,EAAiFC,GAAjF,EAAsFC,GAAtF,EAA4F;;AAEhG,MAAIC,KAAK,KAAK1D,QAAd;;AAEA0D,KAAI,CAAJ,IAAUhB,GAAV,CAAegB,GAAI,CAAJ,IAAUf,GAAV,CAAee,GAAI,CAAJ,IAAUd,GAAV,CAAec,GAAI,EAAJ,IAAWb,GAAX;AAC7Ca,KAAI,CAAJ,IAAUZ,GAAV,CAAeY,GAAI,CAAJ,IAAUX,GAAV,CAAeW,GAAI,CAAJ,IAAUV,GAAV,CAAeU,GAAI,EAAJ,IAAWT,GAAX;AAC7CS,KAAI,CAAJ,IAAUR,GAAV,CAAeQ,GAAI,CAAJ,IAAUP,GAAV,CAAeO,GAAI,EAAJ,IAAWN,GAAX,CAAgBM,GAAI,EAAJ,IAAWL,GAAX;AAC9CK,KAAI,CAAJ,IAAUJ,GAAV,CAAeI,GAAI,CAAJ,IAAUH,GAAV,CAAeG,GAAI,EAAJ,IAAWF,GAAX,CAAgBE,GAAI,EAAJ,IAAWD,GAAX;;AAE9C,SAAO,IAAP;AAEA,EAfgC;;AAiBjCE,WAAU,YAAY;;AAErB,OAAK3F,GAAL,CAEC,CAFD,EAEI,CAFJ,EAEO,CAFP,EAEU,CAFV,EAGC,CAHD,EAGI,CAHJ,EAGO,CAHP,EAGU,CAHV,EAIC,CAJD,EAII,CAJJ,EAIO,CAJP,EAIU,CAJV,EAKC,CALD,EAKI,CALJ,EAKO,CALP,EAKU,CALV;;AASA,SAAO,IAAP;AAEA,EA9BgC;;AAgCjCS,QAAO,YAAY;;AAElB,SAAO,IAAI8D,OAAJ,GAAcZ,SAAd,CAAyB,KAAK3B,QAA9B,CAAP;AAEA,EApCgC;;AAsCjCrB,OAAM,UAAWxC,CAAX,EAAe;;AAEpB,MAAIuH,KAAK,KAAK1D,QAAd;AACA,MAAI4D,KAAKzH,EAAE6D,QAAX;;AAEA0D,KAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV;AACzDF,KAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV;AACzDF,KAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,EAAJ,IAAWE,GAAI,EAAJ,CAAX,CAAqBF,GAAI,EAAJ,IAAWE,GAAI,EAAJ,CAAX;AAC3DF,KAAI,EAAJ,IAAWE,GAAI,EAAJ,CAAX,CAAqBF,GAAI,EAAJ,IAAWE,GAAI,EAAJ,CAAX,CAAqBF,GAAI,EAAJ,IAAWE,GAAI,EAAJ,CAAX,CAAqBF,GAAI,EAAJ,IAAWE,GAAI,EAAJ,CAAX;;AAE/D,SAAO,IAAP;AAEA,EAlDgC;;AAoDjCC,eAAc,UAAW1H,CAAX,EAAe;;AAE5B,MAAIuH,KAAK,KAAK1D,QAAd;AAAA,MAAwB4D,KAAKzH,EAAE6D,QAA/B;;AAEA0D,KAAI,EAAJ,IAAWE,GAAI,EAAJ,CAAX;AACAF,KAAI,EAAJ,IAAWE,GAAI,EAAJ,CAAX;AACAF,KAAI,EAAJ,IAAWE,GAAI,EAAJ,CAAX;;AAEA,SAAO,IAAP;AAEA,EA9DgC;;AAgEjCE,eAAc,UAAWC,KAAX,EAAkBC,KAAlB,EAAyBC,KAAzB,EAAiC;;AAE9CF,QAAMG,mBAAN,CAA2B,IAA3B,EAAiC,CAAjC;AACAF,QAAME,mBAAN,CAA2B,IAA3B,EAAiC,CAAjC;AACAD,QAAMC,mBAAN,CAA2B,IAA3B,EAAiC,CAAjC;;AAEA,SAAO,IAAP;AAEA,EAxEgC;;AA0EjCC,YAAW,UAAWJ,KAAX,EAAkBC,KAAlB,EAAyBC,KAAzB,EAAiC;;AAE3C,OAAKjG,GAAL,CACC+F,MAAMjU,CADP,EACUkU,MAAMlU,CADhB,EACmBmU,MAAMnU,CADzB,EAC4B,CAD5B,EAECiU,MAAMrH,CAFP,EAEUsH,MAAMtH,CAFhB,EAEmBuH,MAAMvH,CAFzB,EAE4B,CAF5B,EAGCqH,MAAMK,CAHP,EAGUJ,MAAMI,CAHhB,EAGmBH,MAAMG,CAHzB,EAG4B,CAH5B,EAIC,CAJD,EAII,CAJJ,EAIO,CAJP,EAIU,CAJV;;AAOA,SAAO,IAAP;AAEA,EArFgC;;AAuFjCC,kBAAiB,YAAY;;AAE5B,MAAI7C,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASD,eAAT,CAA0BlI,CAA1B,EAA8B;;AAEpC;;AAEA,OAAIuH,KAAK,KAAK1D,QAAd;AACA,OAAI4D,KAAKzH,EAAE6D,QAAX;;AAEA,OAAIuE,SAAS,IAAI/C,GAAG0C,mBAAH,CAAwB/H,CAAxB,EAA2B,CAA3B,EAA+BvL,MAA/B,EAAjB;AACA,OAAI4T,SAAS,IAAIhD,GAAG0C,mBAAH,CAAwB/H,CAAxB,EAA2B,CAA3B,EAA+BvL,MAA/B,EAAjB;AACA,OAAI6T,SAAS,IAAIjD,GAAG0C,mBAAH,CAAwB/H,CAAxB,EAA2B,CAA3B,EAA+BvL,MAA/B,EAAjB;;AAEA8S,MAAI,CAAJ,IAAUE,GAAI,CAAJ,IAAUW,MAApB;AACAb,MAAI,CAAJ,IAAUE,GAAI,CAAJ,IAAUW,MAApB;AACAb,MAAI,CAAJ,IAAUE,GAAI,CAAJ,IAAUW,MAApB;AACAb,MAAI,CAAJ,IAAU,CAAV;;AAEAA,MAAI,CAAJ,IAAUE,GAAI,CAAJ,IAAUY,MAApB;AACAd,MAAI,CAAJ,IAAUE,GAAI,CAAJ,IAAUY,MAApB;AACAd,MAAI,CAAJ,IAAUE,GAAI,CAAJ,IAAUY,MAApB;AACAd,MAAI,CAAJ,IAAU,CAAV;;AAEAA,MAAI,CAAJ,IAAUE,GAAI,CAAJ,IAAUa,MAApB;AACAf,MAAI,CAAJ,IAAUE,GAAI,CAAJ,IAAUa,MAApB;AACAf,MAAI,EAAJ,IAAWE,GAAI,EAAJ,IAAWa,MAAtB;AACAf,MAAI,EAAJ,IAAW,CAAX;;AAEAA,MAAI,EAAJ,IAAW,CAAX;AACAA,MAAI,EAAJ,IAAW,CAAX;AACAA,MAAI,EAAJ,IAAW,CAAX;AACAA,MAAI,EAAJ,IAAW,CAAX;;AAEA,UAAO,IAAP;AAEA,GAjCD;AAmCA,EAvCgB,EAvFgB;;AAgIjCgB,wBAAuB,UAAWC,KAAX,EAAmB;;AAEzC,MAAK,EAAIA,SAASA,MAAMC,OAAnB,CAAL,EAAoC;;AAEnC7F,WAAQyD,KAAR,CAAe,uGAAf;AAEA;;AAED,MAAIkB,KAAK,KAAK1D,QAAd;;AAEA,MAAIlQ,IAAI6U,MAAM7U,CAAd;AAAA,MAAiB4M,IAAIiI,MAAMjI,CAA3B;AAAA,MAA8B0H,IAAIO,MAAMP,CAAxC;AACA,MAAIhF,IAAI7P,KAAK8S,GAAL,CAAUvS,CAAV,CAAR;AAAA,MAAuBuP,IAAI9P,KAAK+S,GAAL,CAAUxS,CAAV,CAA3B;AACA,MAAIsS,IAAI7S,KAAK8S,GAAL,CAAU3F,CAAV,CAAR;AAAA,MAAuBmI,IAAItV,KAAK+S,GAAL,CAAU5F,CAAV,CAA3B;AACA,MAAIqD,IAAIxQ,KAAK8S,GAAL,CAAU+B,CAAV,CAAR;AAAA,MAAuBU,IAAIvV,KAAK+S,GAAL,CAAU8B,CAAV,CAA3B;;AAEA,MAAKO,MAAMI,KAAN,KAAgB,KAArB,EAA6B;;AAE5B,OAAIC,KAAK5F,IAAIW,CAAb;AAAA,OAAgBkF,KAAK7F,IAAI0F,CAAzB;AAAA,OAA4BI,KAAK7F,IAAIU,CAArC;AAAA,OAAwCoF,KAAK9F,IAAIyF,CAAjD;;AAEApB,MAAI,CAAJ,IAAUtB,IAAIrC,CAAd;AACA2D,MAAI,CAAJ,IAAU,CAAEtB,CAAF,GAAM0C,CAAhB;AACApB,MAAI,CAAJ,IAAUmB,CAAV;;AAEAnB,MAAI,CAAJ,IAAUuB,KAAKC,KAAKL,CAApB;AACAnB,MAAI,CAAJ,IAAUsB,KAAKG,KAAKN,CAApB;AACAnB,MAAI,CAAJ,IAAU,CAAErE,CAAF,GAAM+C,CAAhB;;AAEAsB,MAAI,CAAJ,IAAUyB,KAAKH,KAAKH,CAApB;AACAnB,MAAI,CAAJ,IAAUwB,KAAKD,KAAKJ,CAApB;AACAnB,MAAI,EAAJ,IAAWtE,IAAIgD,CAAf;AAEA,GAhBD,MAgBO,IAAKuC,MAAMI,KAAN,KAAgB,KAArB,EAA6B;;AAEnC,OAAIK,KAAKhD,IAAIrC,CAAb;AAAA,OAAgBsF,KAAKjD,IAAI0C,CAAzB;AAAA,OAA4BQ,KAAKT,IAAI9E,CAArC;AAAA,OAAwCwF,KAAKV,IAAIC,CAAjD;;AAEApB,MAAI,CAAJ,IAAU0B,KAAKG,KAAKlG,CAApB;AACAqE,MAAI,CAAJ,IAAU4B,KAAKjG,CAAL,GAASgG,EAAnB;AACA3B,MAAI,CAAJ,IAAUtE,IAAIyF,CAAd;;AAEAnB,MAAI,CAAJ,IAAUtE,IAAI0F,CAAd;AACApB,MAAI,CAAJ,IAAUtE,IAAIW,CAAd;AACA2D,MAAI,CAAJ,IAAU,CAAErE,CAAZ;;AAEAqE,MAAI,CAAJ,IAAU2B,KAAKhG,CAAL,GAASiG,EAAnB;AACA5B,MAAI,CAAJ,IAAU6B,KAAKH,KAAK/F,CAApB;AACAqE,MAAI,EAAJ,IAAWtE,IAAIgD,CAAf;AAEA,GAhBM,MAgBA,IAAKuC,MAAMI,KAAN,KAAgB,KAArB,EAA6B;;AAEnC,OAAIK,KAAKhD,IAAIrC,CAAb;AAAA,OAAgBsF,KAAKjD,IAAI0C,CAAzB;AAAA,OAA4BQ,KAAKT,IAAI9E,CAArC;AAAA,OAAwCwF,KAAKV,IAAIC,CAAjD;;AAEApB,MAAI,CAAJ,IAAU0B,KAAKG,KAAKlG,CAApB;AACAqE,MAAI,CAAJ,IAAU,CAAEtE,CAAF,GAAM0F,CAAhB;AACApB,MAAI,CAAJ,IAAU4B,KAAKD,KAAKhG,CAApB;;AAEAqE,MAAI,CAAJ,IAAU2B,KAAKC,KAAKjG,CAApB;AACAqE,MAAI,CAAJ,IAAUtE,IAAIW,CAAd;AACA2D,MAAI,CAAJ,IAAU6B,KAAKH,KAAK/F,CAApB;;AAEAqE,MAAI,CAAJ,IAAU,CAAEtE,CAAF,GAAMyF,CAAhB;AACAnB,MAAI,CAAJ,IAAUrE,CAAV;AACAqE,MAAI,EAAJ,IAAWtE,IAAIgD,CAAf;AAEA,GAhBM,MAgBA,IAAKuC,MAAMI,KAAN,KAAgB,KAArB,EAA6B;;AAEnC,OAAIC,KAAK5F,IAAIW,CAAb;AAAA,OAAgBkF,KAAK7F,IAAI0F,CAAzB;AAAA,OAA4BI,KAAK7F,IAAIU,CAArC;AAAA,OAAwCoF,KAAK9F,IAAIyF,CAAjD;;AAEApB,MAAI,CAAJ,IAAUtB,IAAIrC,CAAd;AACA2D,MAAI,CAAJ,IAAUwB,KAAKL,CAAL,GAASI,EAAnB;AACAvB,MAAI,CAAJ,IAAUsB,KAAKH,CAAL,GAASM,EAAnB;;AAEAzB,MAAI,CAAJ,IAAUtB,IAAI0C,CAAd;AACApB,MAAI,CAAJ,IAAUyB,KAAKN,CAAL,GAASG,EAAnB;AACAtB,MAAI,CAAJ,IAAUuB,KAAKJ,CAAL,GAASK,EAAnB;;AAEAxB,MAAI,CAAJ,IAAU,CAAEmB,CAAZ;AACAnB,MAAI,CAAJ,IAAUrE,IAAI+C,CAAd;AACAsB,MAAI,EAAJ,IAAWtE,IAAIgD,CAAf;AAEA,GAhBM,MAgBA,IAAKuC,MAAMI,KAAN,KAAgB,KAArB,EAA6B;;AAEnC,OAAIS,KAAKpG,IAAIgD,CAAb;AAAA,OAAgBqD,KAAKrG,IAAIyF,CAAzB;AAAA,OAA4Ba,KAAKrG,IAAI+C,CAArC;AAAA,OAAwCuD,KAAKtG,IAAIwF,CAAjD;;AAEAnB,MAAI,CAAJ,IAAUtB,IAAIrC,CAAd;AACA2D,MAAI,CAAJ,IAAUiC,KAAKH,KAAKV,CAApB;AACApB,MAAI,CAAJ,IAAUgC,KAAKZ,CAAL,GAASW,EAAnB;;AAEA/B,MAAI,CAAJ,IAAUoB,CAAV;AACApB,MAAI,CAAJ,IAAUtE,IAAIW,CAAd;AACA2D,MAAI,CAAJ,IAAU,CAAErE,CAAF,GAAMU,CAAhB;;AAEA2D,MAAI,CAAJ,IAAU,CAAEmB,CAAF,GAAM9E,CAAhB;AACA2D,MAAI,CAAJ,IAAU+B,KAAKX,CAAL,GAASY,EAAnB;AACAhC,MAAI,EAAJ,IAAW8B,KAAKG,KAAKb,CAArB;AAEA,GAhBM,MAgBA,IAAKH,MAAMI,KAAN,KAAgB,KAArB,EAA6B;;AAEnC,OAAIS,KAAKpG,IAAIgD,CAAb;AAAA,OAAgBqD,KAAKrG,IAAIyF,CAAzB;AAAA,OAA4Ba,KAAKrG,IAAI+C,CAArC;AAAA,OAAwCuD,KAAKtG,IAAIwF,CAAjD;;AAEAnB,MAAI,CAAJ,IAAUtB,IAAIrC,CAAd;AACA2D,MAAI,CAAJ,IAAU,CAAEoB,CAAZ;AACApB,MAAI,CAAJ,IAAUmB,IAAI9E,CAAd;;AAEA2D,MAAI,CAAJ,IAAU8B,KAAKV,CAAL,GAASa,EAAnB;AACAjC,MAAI,CAAJ,IAAUtE,IAAIW,CAAd;AACA2D,MAAI,CAAJ,IAAU+B,KAAKX,CAAL,GAASY,EAAnB;;AAEAhC,MAAI,CAAJ,IAAUgC,KAAKZ,CAAL,GAASW,EAAnB;AACA/B,MAAI,CAAJ,IAAUrE,IAAIU,CAAd;AACA2D,MAAI,EAAJ,IAAWiC,KAAKb,CAAL,GAASU,EAApB;AAEA;;AAED;AACA9B,KAAI,CAAJ,IAAU,CAAV;AACAA,KAAI,CAAJ,IAAU,CAAV;AACAA,KAAI,EAAJ,IAAW,CAAX;;AAEA;AACAA,KAAI,EAAJ,IAAW,CAAX;AACAA,KAAI,EAAJ,IAAW,CAAX;AACAA,KAAI,EAAJ,IAAW,CAAX;AACAA,KAAI,EAAJ,IAAW,CAAX;;AAEA,SAAO,IAAP;AAEA,EA9PgC;;AAgQjCkC,6BAA4B,YAAY;;AAEvC,MAAIC,OAAO,IAAIvB,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAX;AACA,MAAIwB,MAAM,IAAIxB,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAV;;AAEA,SAAO,SAASsB,0BAAT,CAAqCG,CAArC,EAAyC;;AAE/C,UAAO,KAAKC,OAAL,CAAcH,IAAd,EAAoBE,CAApB,EAAuBD,GAAvB,CAAP;AAEA,GAJD;AAMA,EAX2B,EAhQK;;AA6QjCG,SAAQ,YAAY;;AAEnB,MAAInW,IAAI,IAAIwU,OAAJ,EAAR;AACA,MAAI5H,IAAI,IAAI4H,OAAJ,EAAR;AACA,MAAIF,IAAI,IAAIE,OAAJ,EAAR;;AAEA,SAAO,SAAS2B,MAAT,CAAiBC,GAAjB,EAAsB3V,MAAtB,EAA8B4V,EAA9B,EAAmC;;AAEzC,OAAIzC,KAAK,KAAK1D,QAAd;;AAEAoE,KAAE5E,UAAF,CAAc0G,GAAd,EAAmB3V,MAAnB;;AAEA,OAAK6T,EAAE3D,QAAF,OAAiB,CAAtB,EAA0B;;AAEzB;;AAEA2D,MAAEA,CAAF,GAAM,CAAN;AAEA;;AAEDA,KAAEvD,SAAF;AACA/Q,KAAEsW,YAAF,CAAgBD,EAAhB,EAAoB/B,CAApB;;AAEA,OAAKtU,EAAE2Q,QAAF,OAAiB,CAAtB,EAA0B;;AAEzB;;AAEA,QAAKlR,KAAKqR,GAAL,CAAUuF,GAAG/B,CAAb,MAAqB,CAA1B,EAA8B;;AAE7BA,OAAEtU,CAAF,IAAO,MAAP;AAEA,KAJD,MAIO;;AAENsU,OAAEA,CAAF,IAAO,MAAP;AAEA;;AAEDA,MAAEvD,SAAF;AACA/Q,MAAEsW,YAAF,CAAgBD,EAAhB,EAAoB/B,CAApB;AAEA;;AAEDtU,KAAE+Q,SAAF;AACAnE,KAAE0J,YAAF,CAAgBhC,CAAhB,EAAmBtU,CAAnB;;AAEA4T,MAAI,CAAJ,IAAU5T,EAAEA,CAAZ,CAAe4T,GAAI,CAAJ,IAAUhH,EAAE5M,CAAZ,CAAe4T,GAAI,CAAJ,IAAUU,EAAEtU,CAAZ;AAC9B4T,MAAI,CAAJ,IAAU5T,EAAE4M,CAAZ,CAAegH,GAAI,CAAJ,IAAUhH,EAAEA,CAAZ,CAAegH,GAAI,CAAJ,IAAUU,EAAE1H,CAAZ;AAC9BgH,MAAI,CAAJ,IAAU5T,EAAEsU,CAAZ,CAAeV,GAAI,CAAJ,IAAUhH,EAAE0H,CAAZ,CAAeV,GAAI,EAAJ,IAAWU,EAAEA,CAAb;;AAE9B,UAAO,IAAP;AAEA,GA7CD;AA+CA,EArDO,EA7QyB;;AAoUjC1E,WAAU,UAAWvD,CAAX,EAAcD,CAAd,EAAkB;;AAE3B,MAAKA,MAAM5M,SAAX,EAAuB;;AAEtByP,WAAQC,IAAR,CAAc,kGAAd;AACA,UAAO,KAAKqH,gBAAL,CAAuBlK,CAAvB,EAA0BD,CAA1B,CAAP;AAEA;;AAED,SAAO,KAAKmK,gBAAL,CAAuB,IAAvB,EAA6BlK,CAA7B,CAAP;AAEA,EA/UgC;;AAiVjCmK,cAAa,UAAWnK,CAAX,EAAe;;AAE3B,SAAO,KAAKkK,gBAAL,CAAuBlK,CAAvB,EAA0B,IAA1B,CAAP;AAEA,EArVgC;;AAuVjCkK,mBAAkB,UAAWjH,CAAX,EAAcC,CAAd,EAAkB;;AAEnC,MAAI2F,KAAK5F,EAAEY,QAAX;AACA,MAAIkF,KAAK7F,EAAEW,QAAX;AACA,MAAI0D,KAAK,KAAK1D,QAAd;;AAEA,MAAIuG,MAAMvB,GAAI,CAAJ,CAAV;AAAA,MAAmBwB,MAAMxB,GAAI,CAAJ,CAAzB;AAAA,MAAkCyB,MAAMzB,GAAI,CAAJ,CAAxC;AAAA,MAAiD0B,MAAM1B,GAAI,EAAJ,CAAvD;AACA,MAAI2B,MAAM3B,GAAI,CAAJ,CAAV;AAAA,MAAmB4B,MAAM5B,GAAI,CAAJ,CAAzB;AAAA,MAAkC6B,MAAM7B,GAAI,CAAJ,CAAxC;AAAA,MAAiD8B,MAAM9B,GAAI,EAAJ,CAAvD;AACA,MAAI+B,MAAM/B,GAAI,CAAJ,CAAV;AAAA,MAAmBgC,MAAMhC,GAAI,CAAJ,CAAzB;AAAA,MAAkCiC,MAAMjC,GAAI,EAAJ,CAAxC;AAAA,MAAkDkC,MAAMlC,GAAI,EAAJ,CAAxD;AACA,MAAImC,MAAMnC,GAAI,CAAJ,CAAV;AAAA,MAAmBoC,MAAMpC,GAAI,CAAJ,CAAzB;AAAA,MAAkCqC,MAAMrC,GAAI,EAAJ,CAAxC;AAAA,MAAkDsC,MAAMtC,GAAI,EAAJ,CAAxD;;AAEA,MAAIuC,MAAMrC,GAAI,CAAJ,CAAV;AAAA,MAAmBsC,MAAMtC,GAAI,CAAJ,CAAzB;AAAA,MAAkCuC,MAAMvC,GAAI,CAAJ,CAAxC;AAAA,MAAiDwC,MAAMxC,GAAI,EAAJ,CAAvD;AACA,MAAIyC,MAAMzC,GAAI,CAAJ,CAAV;AAAA,MAAmB0C,MAAM1C,GAAI,CAAJ,CAAzB;AAAA,MAAkC2C,MAAM3C,GAAI,CAAJ,CAAxC;AAAA,MAAiD4C,MAAM5C,GAAI,EAAJ,CAAvD;AACA,MAAI6C,MAAM7C,GAAI,CAAJ,CAAV;AAAA,MAAmB8C,MAAM9C,GAAI,CAAJ,CAAzB;AAAA,MAAkC+C,MAAM/C,GAAI,EAAJ,CAAxC;AAAA,MAAkDgD,MAAMhD,GAAI,EAAJ,CAAxD;AACA,MAAIiD,MAAMjD,GAAI,CAAJ,CAAV;AAAA,MAAmBkD,MAAMlD,GAAI,CAAJ,CAAzB;AAAA,MAAkCmD,MAAMnD,GAAI,EAAJ,CAAxC;AAAA,MAAkDoD,MAAMpD,GAAI,EAAJ,CAAxD;;AAEAxB,KAAI,CAAJ,IAAU6C,MAAMgB,GAAN,GAAYf,MAAMmB,GAAlB,GAAwBlB,MAAMsB,GAA9B,GAAoCrB,MAAMyB,GAApD;AACAzE,KAAI,CAAJ,IAAU6C,MAAMiB,GAAN,GAAYhB,MAAMoB,GAAlB,GAAwBnB,MAAMuB,GAA9B,GAAoCtB,MAAM0B,GAApD;AACA1E,KAAI,CAAJ,IAAU6C,MAAMkB,GAAN,GAAYjB,MAAMqB,GAAlB,GAAwBpB,MAAMwB,GAA9B,GAAoCvB,MAAM2B,GAApD;AACA3E,KAAI,EAAJ,IAAW6C,MAAMmB,GAAN,GAAYlB,MAAMsB,GAAlB,GAAwBrB,MAAMyB,GAA9B,GAAoCxB,MAAM4B,GAArD;;AAEA5E,KAAI,CAAJ,IAAUiD,MAAMY,GAAN,GAAYX,MAAMe,GAAlB,GAAwBd,MAAMkB,GAA9B,GAAoCjB,MAAMqB,GAApD;AACAzE,KAAI,CAAJ,IAAUiD,MAAMa,GAAN,GAAYZ,MAAMgB,GAAlB,GAAwBf,MAAMmB,GAA9B,GAAoClB,MAAMsB,GAApD;AACA1E,KAAI,CAAJ,IAAUiD,MAAMc,GAAN,GAAYb,MAAMiB,GAAlB,GAAwBhB,MAAMoB,GAA9B,GAAoCnB,MAAMuB,GAApD;AACA3E,KAAI,EAAJ,IAAWiD,MAAMe,GAAN,GAAYd,MAAMkB,GAAlB,GAAwBjB,MAAMqB,GAA9B,GAAoCpB,MAAMwB,GAArD;;AAEA5E,KAAI,CAAJ,IAAUqD,MAAMQ,GAAN,GAAYP,MAAMW,GAAlB,GAAwBV,MAAMc,GAA9B,GAAoCb,MAAMiB,GAApD;AACAzE,KAAI,CAAJ,IAAUqD,MAAMS,GAAN,GAAYR,MAAMY,GAAlB,GAAwBX,MAAMe,GAA9B,GAAoCd,MAAMkB,GAApD;AACA1E,KAAI,EAAJ,IAAWqD,MAAMU,GAAN,GAAYT,MAAMa,GAAlB,GAAwBZ,MAAMgB,GAA9B,GAAoCf,MAAMmB,GAArD;AACA3E,KAAI,EAAJ,IAAWqD,MAAMW,GAAN,GAAYV,MAAMc,GAAlB,GAAwBb,MAAMiB,GAA9B,GAAoChB,MAAMoB,GAArD;;AAEA5E,KAAI,CAAJ,IAAUyD,MAAMI,GAAN,GAAYH,MAAMO,GAAlB,GAAwBN,MAAMU,GAA9B,GAAoCT,MAAMa,GAApD;AACAzE,KAAI,CAAJ,IAAUyD,MAAMK,GAAN,GAAYJ,MAAMQ,GAAlB,GAAwBP,MAAMW,GAA9B,GAAoCV,MAAMc,GAApD;AACA1E,KAAI,EAAJ,IAAWyD,MAAMM,GAAN,GAAYL,MAAMS,GAAlB,GAAwBR,MAAMY,GAA9B,GAAoCX,MAAMe,GAArD;AACA3E,KAAI,EAAJ,IAAWyD,MAAMO,GAAN,GAAYN,MAAMU,GAAlB,GAAwBT,MAAMa,GAA9B,GAAoCZ,MAAMgB,GAArD;;AAEA,SAAO,IAAP;AAEA,EA7XgC;;AA+XjC3I,iBAAgB,UAAWR,CAAX,EAAe;;AAE9B,MAAIuE,KAAK,KAAK1D,QAAd;;AAEA0D,KAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,EAAJ,KAAYvE,CAAZ;AAC1CuE,KAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,EAAJ,KAAYvE,CAAZ;AAC1CuE,KAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,EAAJ,KAAYvE,CAAZ,CAAeuE,GAAI,EAAJ,KAAYvE,CAAZ;AAC3CuE,KAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,EAAJ,KAAYvE,CAAZ,CAAeuE,GAAI,EAAJ,KAAYvE,CAAZ;;AAE3C,SAAO,IAAP;AAEA,EA1YgC;;AA4YjCoJ,yBAAwB,YAAY;;AAEnC,MAAI/G,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASiE,sBAAT,CAAiCxG,SAAjC,EAA6C;;AAEnD,QAAM,IAAI9P,IAAI,CAAR,EAAWC,IAAI6P,UAAUyG,KAA/B,EAAsCvW,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDuP,OAAG1R,CAAH,GAAOiS,UAAUC,IAAV,CAAgB/P,CAAhB,CAAP;AACAuP,OAAG9E,CAAH,GAAOqF,UAAUE,IAAV,CAAgBhQ,CAAhB,CAAP;AACAuP,OAAG4C,CAAH,GAAOrC,UAAU0G,IAAV,CAAgBxW,CAAhB,CAAP;;AAEAuP,OAAGkH,YAAH,CAAiB,IAAjB;;AAEA3G,cAAU4G,MAAV,CAAkB1W,CAAlB,EAAqBuP,GAAG1R,CAAxB,EAA2B0R,GAAG9E,CAA9B,EAAiC8E,GAAG4C,CAApC;AAEA;;AAED,UAAOrC,SAAP;AAEA,GAhBD;AAkBA,EAtBuB,EA5YS;;AAoajC6G,cAAa,YAAY;;AAExB,MAAIlF,KAAK,KAAK1D,QAAd;;AAEA,MAAI0C,MAAMgB,GAAI,CAAJ,CAAV;AAAA,MAAmBf,MAAMe,GAAI,CAAJ,CAAzB;AAAA,MAAkCd,MAAMc,GAAI,CAAJ,CAAxC;AAAA,MAAiDb,MAAMa,GAAI,EAAJ,CAAvD;AACA,MAAIZ,MAAMY,GAAI,CAAJ,CAAV;AAAA,MAAmBX,MAAMW,GAAI,CAAJ,CAAzB;AAAA,MAAkCV,MAAMU,GAAI,CAAJ,CAAxC;AAAA,MAAiDT,MAAMS,GAAI,EAAJ,CAAvD;AACA,MAAIR,MAAMQ,GAAI,CAAJ,CAAV;AAAA,MAAmBP,MAAMO,GAAI,CAAJ,CAAzB;AAAA,MAAkCN,MAAMM,GAAI,EAAJ,CAAxC;AAAA,MAAkDL,MAAMK,GAAI,EAAJ,CAAxD;AACA,MAAIJ,MAAMI,GAAI,CAAJ,CAAV;AAAA,MAAmBH,MAAMG,GAAI,CAAJ,CAAzB;AAAA,MAAkCF,MAAME,GAAI,EAAJ,CAAxC;AAAA,MAAkDD,MAAMC,GAAI,EAAJ,CAAxD;;AAEA;AACA;;AAEA,SACCJ,OACC,CAAET,GAAF,GAAQG,GAAR,GAAcG,GAAd,GACGP,MAAMK,GAAN,GAAYE,GADf,GAEGN,MAAME,GAAN,GAAYK,GAFf,GAGGT,MAAMM,GAAN,GAAYG,GAHf,GAIGR,MAAMG,GAAN,GAAYM,GAJf,GAKGV,MAAMK,GAAN,GAAYK,GANhB,IAQAE,OACC,CAAEb,GAAF,GAAQM,GAAR,GAAcK,GAAd,GACGX,MAAMO,GAAN,GAAYG,GADf,GAEGP,MAAMC,GAAN,GAAYM,GAFf,GAGGR,MAAME,GAAN,GAAYO,GAHf,GAIGT,MAAMK,GAAN,GAAYC,GAJf,GAKGL,MAAMG,GAAN,GAAYE,GANhB,CARA,GAgBAM,OACC,CAAEd,GAAF,GAAQO,GAAR,GAAcE,GAAd,GACGT,MAAMK,GAAN,GAAYM,GADf,GAEGR,MAAMC,GAAN,GAAYK,GAFf,GAGGR,MAAMG,GAAN,GAAYO,GAHf,GAIGR,MAAME,GAAN,GAAYG,GAJf,GAKGP,MAAMM,GAAN,GAAYC,GANhB,CAhBA,GAwBAO,OACC,CAAEb,GAAF,GAAQG,GAAR,GAAcG,GAAd,GACGR,MAAMM,GAAN,GAAYG,GADf,GAEGT,MAAMK,GAAN,GAAYK,GAFf,GAGGR,MAAME,GAAN,GAAYK,GAHf,GAIGR,MAAMG,GAAN,GAAYM,GAJf,GAKGT,MAAMK,GAAN,GAAYE,GANhB,CAzBD;AAoCA,EApdgC;;AAsdjC2F,YAAW,YAAY;;AAEtB,MAAInF,KAAK,KAAK1D,QAAd;AACA,MAAI8I,GAAJ;;AAEAA,QAAMpF,GAAI,CAAJ,CAAN,CAAeA,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAAV,CAAmBA,GAAI,CAAJ,IAAUoF,GAAV;AAClCA,QAAMpF,GAAI,CAAJ,CAAN,CAAeA,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAAV,CAAmBA,GAAI,CAAJ,IAAUoF,GAAV;AAClCA,QAAMpF,GAAI,CAAJ,CAAN,CAAeA,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAAV,CAAmBA,GAAI,CAAJ,IAAUoF,GAAV;;AAElCA,QAAMpF,GAAI,CAAJ,CAAN,CAAeA,GAAI,CAAJ,IAAUA,GAAI,EAAJ,CAAV,CAAoBA,GAAI,EAAJ,IAAWoF,GAAX;AACnCA,QAAMpF,GAAI,CAAJ,CAAN,CAAeA,GAAI,CAAJ,IAAUA,GAAI,EAAJ,CAAV,CAAoBA,GAAI,EAAJ,IAAWoF,GAAX;AACnCA,QAAMpF,GAAI,EAAJ,CAAN,CAAgBA,GAAI,EAAJ,IAAWA,GAAI,EAAJ,CAAX,CAAqBA,GAAI,EAAJ,IAAWoF,GAAX;;AAErC,SAAO,IAAP;AAEA,EAregC;;AAuejCC,cAAa,UAAWnK,CAAX,EAAe;;AAE3B,MAAI8E,KAAK,KAAK1D,QAAd;;AAEA0D,KAAI,EAAJ,IAAW9E,EAAE9O,CAAb;AACA4T,KAAI,EAAJ,IAAW9E,EAAElC,CAAb;AACAgH,KAAI,EAAJ,IAAW9E,EAAEwF,CAAb;;AAEA,SAAO,IAAP;AAEA,EAjfgC;;AAmfjC4E,aAAY,UAAW7M,CAAX,EAAc8M,iBAAd,EAAkC;;AAE7C;AACA,MAAIvF,KAAK,KAAK1D,QAAd;AAAA,MACC4D,KAAKzH,EAAE6D,QADR;AAAA,MAGC0C,MAAMkB,GAAI,CAAJ,CAHP;AAAA,MAGgBd,MAAMc,GAAI,CAAJ,CAHtB;AAAA,MAG+BV,MAAMU,GAAI,CAAJ,CAHrC;AAAA,MAG8CN,MAAMM,GAAI,CAAJ,CAHpD;AAAA,MAICjB,MAAMiB,GAAI,CAAJ,CAJP;AAAA,MAIgBb,MAAMa,GAAI,CAAJ,CAJtB;AAAA,MAI+BT,MAAMS,GAAI,CAAJ,CAJrC;AAAA,MAI8CL,MAAMK,GAAI,CAAJ,CAJpD;AAAA,MAKChB,MAAMgB,GAAI,CAAJ,CALP;AAAA,MAKgBZ,MAAMY,GAAI,CAAJ,CALtB;AAAA,MAK+BR,MAAMQ,GAAI,EAAJ,CALrC;AAAA,MAK+CJ,MAAMI,GAAI,EAAJ,CALrD;AAAA,MAMCf,MAAMe,GAAI,EAAJ,CANP;AAAA,MAMiBX,MAAMW,GAAI,EAAJ,CANvB;AAAA,MAMiCP,MAAMO,GAAI,EAAJ,CANvC;AAAA,MAMiDH,MAAMG,GAAI,EAAJ,CANvD;AAAA,MAQCsF,MAAMlG,MAAMK,GAAN,GAAYE,GAAZ,GAAkBN,MAAMG,GAAN,GAAYG,GAA9B,GAAoCN,MAAME,GAAN,GAAYK,GAAhD,GAAsDT,MAAMM,GAAN,GAAYG,GAAlE,GAAwER,MAAMG,GAAN,GAAYM,GAApF,GAA0FV,MAAMK,GAAN,GAAYK,GAR7G;AAAA,MASC0F,MAAMtG,MAAMO,GAAN,GAAYG,GAAZ,GAAkBX,MAAMS,GAAN,GAAYE,GAA9B,GAAoCV,MAAMM,GAAN,GAAYK,GAAhD,GAAsDb,MAAMU,GAAN,GAAYG,GAAlE,GAAwEZ,MAAMO,GAAN,GAAYM,GAApF,GAA0Fd,MAAMS,GAAN,GAAYK,GAT7G;AAAA,MAUC2F,MAAMxG,MAAMK,GAAN,GAAYM,GAAZ,GAAkBV,MAAMG,GAAN,GAAYO,GAA9B,GAAoCV,MAAME,GAAN,GAAYS,GAAhD,GAAsDb,MAAMM,GAAN,GAAYO,GAAlE,GAAwEZ,MAAMG,GAAN,GAAYU,GAApF,GAA0Fd,MAAMK,GAAN,GAAYS,GAV7G;AAAA,MAWC4F,MAAMxG,MAAMG,GAAN,GAAYG,GAAZ,GAAkBP,MAAMK,GAAN,GAAYE,GAA9B,GAAoCN,MAAME,GAAN,GAAYK,GAAhD,GAAsDT,MAAMM,GAAN,GAAYG,GAAlE,GAAwER,MAAMG,GAAN,GAAYM,GAApF,GAA0FV,MAAMK,GAAN,GAAYK,GAX7G;;AAaA,MAAIiG,MAAM5G,MAAMwG,GAAN,GAAYpG,MAAMqG,GAAlB,GAAwBjG,MAAMkG,GAA9B,GAAoC9F,MAAM+F,GAApD;;AAEA,MAAKC,QAAQ,CAAb,EAAiB;;AAEhB,OAAIC,MAAM,oEAAV;;AAEA,OAAKN,sBAAsB,IAA3B,EAAkC;;AAEjC,UAAM,IAAI1K,KAAJ,CAAWgL,GAAX,CAAN;AAEA,IAJD,MAIO;;AAENxK,YAAQC,IAAR,CAAcuK,GAAd;AAEA;;AAED,UAAO,KAAK5F,QAAL,EAAP;AAEA;;AAED,MAAI6F,SAAS,IAAIF,GAAjB;;AAEA5F,KAAI,CAAJ,IAAUwF,MAAMM,MAAhB;AACA9F,KAAI,CAAJ,IAAU,CAAET,MAAMG,GAAN,GAAYE,GAAZ,GAAkBN,MAAMK,GAAN,GAAYC,GAA9B,GAAoCL,MAAMC,GAAN,GAAYM,GAAhD,GAAsDV,MAAMO,GAAN,GAAYG,GAAlE,GAAwER,MAAME,GAAN,GAAYO,GAApF,GAA0FX,MAAMM,GAAN,GAAYK,GAAxG,IAAgH+F,MAA1H;AACA9F,KAAI,CAAJ,IAAU,CAAEX,MAAMM,GAAN,GAAYC,GAAZ,GAAkBL,MAAME,GAAN,GAAYG,GAA9B,GAAoCL,MAAMC,GAAN,GAAYK,GAAhD,GAAsDT,MAAMO,GAAN,GAAYE,GAAlE,GAAwER,MAAMG,GAAN,GAAYO,GAApF,GAA0FX,MAAMK,GAAN,GAAYM,GAAxG,IAAgH+F,MAA1H;AACA9F,KAAI,CAAJ,IAAU,CAAEV,MAAMG,GAAN,GAAYG,GAAZ,GAAkBP,MAAMK,GAAN,GAAYE,GAA9B,GAAoCN,MAAME,GAAN,GAAYK,GAAhD,GAAsDT,MAAMM,GAAN,GAAYG,GAAlE,GAAwER,MAAMG,GAAN,GAAYM,GAApF,GAA0FV,MAAMK,GAAN,GAAYK,GAAxG,IAAgHgG,MAA1H;;AAEA9F,KAAI,CAAJ,IAAUyF,MAAMK,MAAhB;AACA9F,KAAI,CAAJ,IAAU,CAAEd,MAAMS,GAAN,GAAYC,GAAZ,GAAkBT,MAAMO,GAAN,GAAYE,GAA9B,GAAoCT,MAAMK,GAAN,GAAYM,GAAhD,GAAsDd,MAAMW,GAAN,GAAYG,GAAlE,GAAwEZ,MAAMM,GAAN,GAAYO,GAApF,GAA0Ff,MAAMU,GAAN,GAAYK,GAAxG,IAAgH+F,MAA1H;AACA9F,KAAI,CAAJ,IAAU,CAAEb,MAAMM,GAAN,GAAYG,GAAZ,GAAkBX,MAAMU,GAAN,GAAYC,GAA9B,GAAoCT,MAAMK,GAAN,GAAYK,GAAhD,GAAsDb,MAAMW,GAAN,GAAYE,GAAlE,GAAwEZ,MAAMO,GAAN,GAAYO,GAApF,GAA0Ff,MAAMS,GAAN,GAAYM,GAAxG,IAAgH+F,MAA1H;AACA9F,KAAI,CAAJ,IAAU,CAAEf,MAAMS,GAAN,GAAYE,GAAZ,GAAkBV,MAAMO,GAAN,GAAYG,GAA9B,GAAoCV,MAAMM,GAAN,GAAYK,GAAhD,GAAsDb,MAAMU,GAAN,GAAYG,GAAlE,GAAwEZ,MAAMO,GAAN,GAAYM,GAApF,GAA0Fd,MAAMS,GAAN,GAAYK,GAAxG,IAAgHgG,MAA1H;;AAEA9F,KAAI,CAAJ,IAAU0F,MAAMI,MAAhB;AACA9F,KAAI,CAAJ,IAAU,CAAEb,MAAMG,GAAN,GAAYM,GAAZ,GAAkBV,MAAMK,GAAN,GAAYK,GAA9B,GAAoCT,MAAMC,GAAN,GAAYU,GAAhD,GAAsDd,MAAMO,GAAN,GAAYO,GAAlE,GAAwEZ,MAAME,GAAN,GAAYW,GAApF,GAA0Ff,MAAMM,GAAN,GAAYS,GAAxG,IAAgH+F,MAA1H;AACA9F,KAAI,EAAJ,IAAW,CAAEf,MAAMM,GAAN,GAAYK,GAAZ,GAAkBT,MAAME,GAAN,GAAYO,GAA9B,GAAoCT,MAAMC,GAAN,GAAYS,GAAhD,GAAsDb,MAAMO,GAAN,GAAYM,GAAlE,GAAwEZ,MAAMG,GAAN,GAAYW,GAApF,GAA0Ff,MAAMK,GAAN,GAAYU,GAAxG,IAAgH+F,MAA3H;AACA9F,KAAI,EAAJ,IAAW,CAAEd,MAAMG,GAAN,GAAYO,GAAZ,GAAkBX,MAAMK,GAAN,GAAYM,GAA9B,GAAoCV,MAAME,GAAN,GAAYS,GAAhD,GAAsDb,MAAMM,GAAN,GAAYO,GAAlE,GAAwEZ,MAAMG,GAAN,GAAYU,GAApF,GAA0Fd,MAAMK,GAAN,GAAYS,GAAxG,IAAgHgG,MAA3H;;AAEA9F,KAAI,EAAJ,IAAW2F,MAAMG,MAAjB;AACA9F,KAAI,EAAJ,IAAW,CAAEd,MAAMK,GAAN,GAAYC,GAAZ,GAAkBL,MAAMG,GAAN,GAAYE,GAA9B,GAAoCL,MAAMC,GAAN,GAAYM,GAAhD,GAAsDV,MAAMO,GAAN,GAAYG,GAAlE,GAAwER,MAAME,GAAN,GAAYO,GAApF,GAA0FX,MAAMM,GAAN,GAAYK,GAAxG,IAAgHmG,MAA3H;AACA9F,KAAI,EAAJ,IAAW,CAAEb,MAAME,GAAN,GAAYG,GAAZ,GAAkBP,MAAMM,GAAN,GAAYC,GAA9B,GAAoCL,MAAMC,GAAN,GAAYK,GAAhD,GAAsDT,MAAMO,GAAN,GAAYE,GAAlE,GAAwER,MAAMG,GAAN,GAAYO,GAApF,GAA0FX,MAAMK,GAAN,GAAYM,GAAxG,IAAgHmG,MAA3H;AACA9F,KAAI,EAAJ,IAAW,CAAEf,MAAMK,GAAN,GAAYE,GAAZ,GAAkBN,MAAMG,GAAN,GAAYG,GAA9B,GAAoCN,MAAME,GAAN,GAAYK,GAAhD,GAAsDT,MAAMM,GAAN,GAAYG,GAAlE,GAAwER,MAAMG,GAAN,GAAYM,GAApF,GAA0FV,MAAMK,GAAN,GAAYK,GAAxG,IAAgHoG,MAA3H;;AAEA,SAAO,IAAP;AAEA,EA/iBgC;;AAijBjCC,QAAO,UAAW7K,CAAX,EAAe;;AAErB,MAAI8E,KAAK,KAAK1D,QAAd;AACA,MAAIlQ,IAAI8O,EAAE9O,CAAV;AAAA,MAAa4M,IAAIkC,EAAElC,CAAnB;AAAA,MAAsB0H,IAAIxF,EAAEwF,CAA5B;;AAEAV,KAAI,CAAJ,KAAW5T,CAAX,CAAc4T,GAAI,CAAJ,KAAWhH,CAAX,CAAcgH,GAAI,CAAJ,KAAWU,CAAX;AAC5BV,KAAI,CAAJ,KAAW5T,CAAX,CAAc4T,GAAI,CAAJ,KAAWhH,CAAX,CAAcgH,GAAI,CAAJ,KAAWU,CAAX;AAC5BV,KAAI,CAAJ,KAAW5T,CAAX,CAAc4T,GAAI,CAAJ,KAAWhH,CAAX,CAAcgH,GAAI,EAAJ,KAAYU,CAAZ;AAC5BV,KAAI,CAAJ,KAAW5T,CAAX,CAAc4T,GAAI,CAAJ,KAAWhH,CAAX,CAAcgH,GAAI,EAAJ,KAAYU,CAAZ;;AAE5B,SAAO,IAAP;AAEA,EA7jBgC;;AA+jBjCsF,oBAAmB,YAAY;;AAE9B,MAAIhG,KAAK,KAAK1D,QAAd;;AAEA,MAAI2J,WAAWjG,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAAV,GAAoBA,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAA9B,GAAwCA,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAAjE;AACA,MAAIkG,WAAWlG,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAAV,GAAoBA,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAA9B,GAAwCA,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAAjE;AACA,MAAImG,WAAWnG,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAAV,GAAoBA,GAAI,CAAJ,IAAUA,GAAI,CAAJ,CAA9B,GAAwCA,GAAI,EAAJ,IAAWA,GAAI,EAAJ,CAAlE;;AAEA,SAAOnU,KAAKmR,IAAL,CAAWnR,KAAKyM,GAAL,CAAU2N,QAAV,EAAoBC,QAApB,EAA8BC,QAA9B,CAAX,CAAP;AAEA,EAzkBgC;;AA2kBjCC,kBAAiB,UAAWha,CAAX,EAAc4M,CAAd,EAAiB0H,CAAjB,EAAqB;;AAErC,OAAKpG,GAAL,CAEC,CAFD,EAEI,CAFJ,EAEO,CAFP,EAEUlO,CAFV,EAGC,CAHD,EAGI,CAHJ,EAGO,CAHP,EAGU4M,CAHV,EAIC,CAJD,EAII,CAJJ,EAIO,CAJP,EAIU0H,CAJV,EAKC,CALD,EAKI,CALJ,EAKO,CALP,EAKU,CALV;;AASA,SAAO,IAAP;AAEA,EAxlBgC;;AA0lBjC2F,gBAAe,UAAWC,KAAX,EAAmB;;AAEjC,MAAI5H,IAAI7S,KAAK8S,GAAL,CAAU2H,KAAV,CAAR;AAAA,MAA2B7K,IAAI5P,KAAK+S,GAAL,CAAU0H,KAAV,CAA/B;;AAEA,OAAKhM,GAAL,CAEC,CAFD,EAEI,CAFJ,EAEO,CAFP,EAEU,CAFV,EAGC,CAHD,EAGIoE,CAHJ,EAGO,CAAEjD,CAHT,EAGY,CAHZ,EAIC,CAJD,EAIIA,CAJJ,EAIOiD,CAJP,EAIU,CAJV,EAKC,CALD,EAKI,CALJ,EAKO,CALP,EAKU,CALV;;AASA,SAAO,IAAP;AAEA,EAzmBgC;;AA2mBjC6H,gBAAe,UAAWD,KAAX,EAAmB;;AAEjC,MAAI5H,IAAI7S,KAAK8S,GAAL,CAAU2H,KAAV,CAAR;AAAA,MAA2B7K,IAAI5P,KAAK+S,GAAL,CAAU0H,KAAV,CAA/B;;AAEA,OAAKhM,GAAL,CAEEoE,CAFF,EAEK,CAFL,EAEQjD,CAFR,EAEW,CAFX,EAGE,CAHF,EAGK,CAHL,EAGQ,CAHR,EAGW,CAHX,EAIC,CAAEA,CAJH,EAIM,CAJN,EAISiD,CAJT,EAIY,CAJZ,EAKE,CALF,EAKK,CALL,EAKQ,CALR,EAKW,CALX;;AASA,SAAO,IAAP;AAEA,EA1nBgC;;AA4nBjC8H,gBAAe,UAAWF,KAAX,EAAmB;;AAEjC,MAAI5H,IAAI7S,KAAK8S,GAAL,CAAU2H,KAAV,CAAR;AAAA,MAA2B7K,IAAI5P,KAAK+S,GAAL,CAAU0H,KAAV,CAA/B;;AAEA,OAAKhM,GAAL,CAECoE,CAFD,EAEI,CAAEjD,CAFN,EAES,CAFT,EAEY,CAFZ,EAGCA,CAHD,EAGIiD,CAHJ,EAGO,CAHP,EAGU,CAHV,EAIC,CAJD,EAII,CAJJ,EAIO,CAJP,EAIU,CAJV,EAKC,CALD,EAKI,CALJ,EAKO,CALP,EAKU,CALV;;AASA,SAAO,IAAP;AAEA,EA3oBgC;;AA6oBjC+H,mBAAkB,UAAWC,IAAX,EAAiBtJ,KAAjB,EAAyB;;AAE1C;;AAEA,MAAIsB,IAAI7S,KAAK8S,GAAL,CAAUvB,KAAV,CAAR;AACA,MAAI3B,IAAI5P,KAAK+S,GAAL,CAAUxB,KAAV,CAAR;AACA,MAAInE,IAAI,IAAIyF,CAAZ;AACA,MAAItS,IAAIsa,KAAKta,CAAb;AAAA,MAAgB4M,IAAI0N,KAAK1N,CAAzB;AAAA,MAA4B0H,IAAIgG,KAAKhG,CAArC;AACA,MAAIiG,KAAK1N,IAAI7M,CAAb;AAAA,MAAgBwa,KAAK3N,IAAID,CAAzB;;AAEA,OAAKsB,GAAL,CAECqM,KAAKva,CAAL,GAASsS,CAFV,EAEaiI,KAAK3N,CAAL,GAASyC,IAAIiF,CAF1B,EAE6BiG,KAAKjG,CAAL,GAASjF,IAAIzC,CAF1C,EAE6C,CAF7C,EAGC2N,KAAK3N,CAAL,GAASyC,IAAIiF,CAHd,EAGiBkG,KAAK5N,CAAL,GAAS0F,CAH1B,EAG6BkI,KAAKlG,CAAL,GAASjF,IAAIrP,CAH1C,EAG6C,CAH7C,EAICua,KAAKjG,CAAL,GAASjF,IAAIzC,CAJd,EAIiB4N,KAAKlG,CAAL,GAASjF,IAAIrP,CAJ9B,EAIiC6M,IAAIyH,CAAJ,GAAQA,CAAR,GAAYhC,CAJ7C,EAIgD,CAJhD,EAKC,CALD,EAKI,CALJ,EAKO,CALP,EAKU,CALV;;AASC,SAAO,IAAP;AAED,EAlqBgC;;AAoqBjCmI,YAAW,UAAWza,CAAX,EAAc4M,CAAd,EAAiB0H,CAAjB,EAAqB;;AAE/B,OAAKpG,GAAL,CAEClO,CAFD,EAEI,CAFJ,EAEO,CAFP,EAEU,CAFV,EAGC,CAHD,EAGI4M,CAHJ,EAGO,CAHP,EAGU,CAHV,EAIC,CAJD,EAII,CAJJ,EAIO0H,CAJP,EAIU,CAJV,EAKC,CALD,EAKI,CALJ,EAKO,CALP,EAKU,CALV;;AASA,SAAO,IAAP;AAEA,EAjrBgC;;AAmrBjCoG,YAAW,UAAW1a,CAAX,EAAc4M,CAAd,EAAiB0H,CAAjB,EAAqB;;AAE/B,OAAKpG,GAAL,CAEC,CAFD,EAEItB,CAFJ,EAEO0H,CAFP,EAEU,CAFV,EAGCtU,CAHD,EAGI,CAHJ,EAGOsU,CAHP,EAGU,CAHV,EAICtU,CAJD,EAII4M,CAJJ,EAIO,CAJP,EAIU,CAJV,EAKC,CALD,EAKI,CALJ,EAKO,CALP,EAKU,CALV;;AASA,SAAO,IAAP;AAEA,EAhsBgC;;AAksBjCsJ,UAAS,UAAWyE,QAAX,EAAqBC,UAArB,EAAiCjB,KAAjC,EAAyC;;AAEjD,MAAI/F,KAAK,KAAK1D,QAAd;;AAEA,MAAIlQ,IAAI4a,WAAWC,EAAnB;AAAA,MAAuBjO,IAAIgO,WAAWE,EAAtC;AAAA,MAA0CxG,IAAIsG,WAAWG,EAAzD;AAAA,MAA6D/L,IAAI4L,WAAWI,EAA5E;AACA,MAAIC,KAAKjb,IAAIA,CAAb;AAAA,MAAgBkb,KAAKtO,IAAIA,CAAzB;AAAA,MAA4BuO,KAAK7G,IAAIA,CAArC;AACA,MAAI8G,KAAKpb,IAAIib,EAAb;AAAA,MAAiBI,KAAKrb,IAAIkb,EAA1B;AAAA,MAA8BI,KAAKtb,IAAImb,EAAvC;AACA,MAAII,KAAK3O,IAAIsO,EAAb;AAAA,MAAiBM,KAAK5O,IAAIuO,EAA1B;AAAA,MAA8BM,KAAKnH,IAAI6G,EAAvC;AACA,MAAIO,KAAK1M,IAAIiM,EAAb;AAAA,MAAiBU,KAAK3M,IAAIkM,EAA1B;AAAA,MAA8BU,KAAK5M,IAAImM,EAAvC;;AAEA,MAAIU,KAAKlC,MAAM3Z,CAAf;AAAA,MAAkB8b,KAAKnC,MAAM/M,CAA7B;AAAA,MAAgCmP,KAAKpC,MAAMrF,CAA3C;;AAEOV,KAAI,CAAJ,IAAU,CAAE,KAAM2H,KAAKE,EAAX,CAAF,IAAsBI,EAAhC;AACAjI,KAAI,CAAJ,IAAU,CAAEyH,KAAKO,EAAP,IAAcC,EAAxB;AACAjI,KAAI,CAAJ,IAAU,CAAE0H,KAAKK,EAAP,IAAcE,EAAxB;AACAjI,KAAI,CAAJ,IAAU,CAAV;;AAEAA,KAAI,CAAJ,IAAU,CAAEyH,KAAKO,EAAP,IAAcE,EAAxB;AACAlI,KAAI,CAAJ,IAAU,CAAE,KAAMwH,KAAKK,EAAX,CAAF,IAAsBK,EAAhC;AACAlI,KAAI,CAAJ,IAAU,CAAE4H,KAAKE,EAAP,IAAcI,EAAxB;AACAlI,KAAI,CAAJ,IAAU,CAAV;;AAEAA,KAAI,CAAJ,IAAU,CAAE0H,KAAKK,EAAP,IAAcI,EAAxB;AACAnI,KAAI,CAAJ,IAAU,CAAE4H,KAAKE,EAAP,IAAcK,EAAxB;AACAnI,KAAI,EAAJ,IAAW,CAAE,KAAMwH,KAAKG,EAAX,CAAF,IAAsBQ,EAAjC;AACAnI,KAAI,EAAJ,IAAW,CAAX;;AAEAA,KAAI,EAAJ,IAAW+G,SAAS3a,CAApB;AACA4T,KAAI,EAAJ,IAAW+G,SAAS/N,CAApB;AACAgH,KAAI,EAAJ,IAAW+G,SAASrG,CAApB;AACAV,KAAI,EAAJ,IAAW,CAAX;;AAEA,SAAO,IAAP;AAEP,EApuBgC;;AAsuBjCoI,YAAW,YAAY;;AAEtB,MAAIC,SAAS,IAAIzH,OAAJ,EAAb;AACA,MAAI0H,SAAS,IAAIzJ,OAAJ,EAAb;;AAEA,SAAO,SAASuJ,SAAT,CAAoBrB,QAApB,EAA8BC,UAA9B,EAA0CjB,KAA1C,EAAkD;;AAExD,OAAI/F,KAAK,KAAK1D,QAAd;;AAEA,OAAI2L,KAAKI,OAAO/N,GAAP,CAAY0F,GAAI,CAAJ,CAAZ,EAAqBA,GAAI,CAAJ,CAArB,EAA8BA,GAAI,CAAJ,CAA9B,EAAwC9S,MAAxC,EAAT;AACA,OAAIgb,KAAKG,OAAO/N,GAAP,CAAY0F,GAAI,CAAJ,CAAZ,EAAqBA,GAAI,CAAJ,CAArB,EAA8BA,GAAI,CAAJ,CAA9B,EAAwC9S,MAAxC,EAAT;AACA,OAAIib,KAAKE,OAAO/N,GAAP,CAAY0F,GAAI,CAAJ,CAAZ,EAAqBA,GAAI,CAAJ,CAArB,EAA8BA,GAAI,EAAJ,CAA9B,EAAyC9S,MAAzC,EAAT;;AAEA;AACA,OAAI0Y,MAAM,KAAKV,WAAL,EAAV;AACA,OAAKU,MAAM,CAAX,EAAeqC,KAAK,CAAEA,EAAP;;AAEflB,YAAS3a,CAAT,GAAa4T,GAAI,EAAJ,CAAb;AACA+G,YAAS/N,CAAT,GAAagH,GAAI,EAAJ,CAAb;AACA+G,YAASrG,CAAT,GAAaV,GAAI,EAAJ,CAAb;;AAEA;AACAsI,UAAOrN,IAAP,CAAa,IAAb;;AAEA,OAAIsN,QAAQ,IAAIN,EAAhB;AACA,OAAIO,QAAQ,IAAIN,EAAhB;AACA,OAAIO,QAAQ,IAAIN,EAAhB;;AAEAG,UAAOhM,QAAP,CAAiB,CAAjB,KAAwBiM,KAAxB;AACAD,UAAOhM,QAAP,CAAiB,CAAjB,KAAwBiM,KAAxB;AACAD,UAAOhM,QAAP,CAAiB,CAAjB,KAAwBiM,KAAxB;;AAEAD,UAAOhM,QAAP,CAAiB,CAAjB,KAAwBkM,KAAxB;AACAF,UAAOhM,QAAP,CAAiB,CAAjB,KAAwBkM,KAAxB;AACAF,UAAOhM,QAAP,CAAiB,CAAjB,KAAwBkM,KAAxB;;AAEAF,UAAOhM,QAAP,CAAiB,CAAjB,KAAwBmM,KAAxB;AACAH,UAAOhM,QAAP,CAAiB,CAAjB,KAAwBmM,KAAxB;AACAH,UAAOhM,QAAP,CAAiB,EAAjB,KAAyBmM,KAAzB;;AAEAzB,cAAW0B,qBAAX,CAAkCJ,MAAlC;;AAEAvC,SAAM3Z,CAAN,GAAU6b,EAAV;AACAlC,SAAM/M,CAAN,GAAUkP,EAAV;AACAnC,SAAMrF,CAAN,GAAUyH,EAAV;;AAEA,UAAO,IAAP;AAEA,GA3CD;AA6CA,EAlDU,EAtuBsB;;AA0xBjCQ,kBAAiB,UAAWC,IAAX,EAAiBC,KAAjB,EAAwBC,GAAxB,EAA6BC,MAA7B,EAAqCC,IAArC,EAA2CC,GAA3C,EAAiD;;AAEjE,MAAKA,QAAQrd,SAAb,EAAyB;;AAExByP,WAAQC,IAAR,CAAc,sGAAd;AAEA;;AAED,MAAI0E,KAAK,KAAK1D,QAAd;AACA,MAAIlQ,IAAI,IAAI4c,IAAJ,IAAaH,QAAQD,IAArB,CAAR;AACA,MAAI5P,IAAI,IAAIgQ,IAAJ,IAAaF,MAAMC,MAAnB,CAAR;;AAEA,MAAIrN,IAAI,CAAEmN,QAAQD,IAAV,KAAqBC,QAAQD,IAA7B,CAAR;AACA,MAAIjN,IAAI,CAAEmN,MAAMC,MAAR,KAAqBD,MAAMC,MAA3B,CAAR;AACA,MAAIrK,IAAI,EAAIuK,MAAMD,IAAV,KAAqBC,MAAMD,IAA3B,CAAR;AACA,MAAI7H,IAAI,CAAE,CAAF,GAAM8H,GAAN,GAAYD,IAAZ,IAAqBC,MAAMD,IAA3B,CAAR;;AAEAhJ,KAAI,CAAJ,IAAU5T,CAAV,CAAa4T,GAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,CAAJ,IAAUtE,CAAV,CAAasE,GAAI,EAAJ,IAAW,CAAX;AACvCA,KAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,CAAJ,IAAUhH,CAAV,CAAagH,GAAI,CAAJ,IAAUrE,CAAV,CAAaqE,GAAI,EAAJ,IAAW,CAAX;AACvCA,KAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,EAAJ,IAAWtB,CAAX,CAAcsB,GAAI,EAAJ,IAAWmB,CAAX;AACxCnB,KAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,EAAJ,IAAW,CAAE,CAAb,CAAgBA,GAAI,EAAJ,IAAW,CAAX;;AAE1C,SAAO,IAAP;AAEA,EAlzBgC;;AAozBjCkJ,mBAAkB,UAAWN,IAAX,EAAiBC,KAAjB,EAAwBC,GAAxB,EAA6BC,MAA7B,EAAqCC,IAArC,EAA2CC,GAA3C,EAAiD;;AAElE,MAAIjJ,KAAK,KAAK1D,QAAd;AACA,MAAIlB,IAAI,OAAQyN,QAAQD,IAAhB,CAAR;AACA,MAAIO,IAAI,OAAQL,MAAMC,MAAd,CAAR;AACA,MAAIK,IAAI,OAAQH,MAAMD,IAAd,CAAR;;AAEA,MAAI5c,IAAI,CAAEyc,QAAQD,IAAV,IAAmBxN,CAA3B;AACA,MAAIpC,IAAI,CAAE8P,MAAMC,MAAR,IAAmBI,CAA3B;AACA,MAAIzI,IAAI,CAAEuI,MAAMD,IAAR,IAAiBI,CAAzB;;AAEApJ,KAAI,CAAJ,IAAU,IAAI5E,CAAd,CAAiB4E,GAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,EAAJ,IAAW,CAAE5T,CAAb;AAC3C4T,KAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,CAAJ,IAAU,IAAImJ,CAAd,CAAiBnJ,GAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,EAAJ,IAAW,CAAEhH,CAAb;AAC3CgH,KAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,EAAJ,IAAW,CAAE,CAAF,GAAMoJ,CAAjB,CAAoBpJ,GAAI,EAAJ,IAAW,CAAEU,CAAb;AAC9CV,KAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,CAAJ,IAAU,CAAV,CAAaA,GAAI,EAAJ,IAAW,CAAX,CAAcA,GAAI,EAAJ,IAAW,CAAX;;AAExC,SAAO,IAAP;AAEA,EAt0BgC;;AAw0BjChC,SAAQ,UAAWsK,MAAX,EAAoB;;AAE3B,MAAItI,KAAK,KAAK1D,QAAd;AACA,MAAI4D,KAAKoI,OAAOhM,QAAhB;;AAEA,OAAM,IAAI/N,IAAI,CAAd,EAAiBA,IAAI,EAArB,EAAyBA,GAAzB,EAAgC;;AAE/B,OAAKyR,GAAIzR,CAAJ,MAAY2R,GAAI3R,CAAJ,CAAjB,EAA2B,OAAO,KAAP;AAE3B;;AAED,SAAO,IAAP;AAEA,EAr1BgC;;AAu1BjC0P,YAAW,UAAW5P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAErC,MAAKA,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,OAAM,IAAI3P,IAAI,CAAd,EAAiBA,IAAI,EAArB,EAAyBA,GAAzB,EAAgC;;AAE/B,QAAK+N,QAAL,CAAe/N,CAAf,IAAqBF,MAAOE,IAAI2P,MAAX,CAArB;AAEA;;AAED,SAAO,IAAP;AAEA,EAn2BgC;;AAq2BjCC,UAAS,UAAW9P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEnC,MAAK7P,UAAUzC,SAAf,EAA2ByC,QAAQ,EAAR;AAC3B,MAAK6P,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,MAAI8B,KAAK,KAAK1D,QAAd;;AAEAjO,QAAO6P,MAAP,IAAkB8B,GAAI,CAAJ,CAAlB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;;AAEA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;;AAEA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,EAAhB,IAAuB8B,GAAI,EAAJ,CAAvB;AACA3R,QAAO6P,SAAS,EAAhB,IAAuB8B,GAAI,EAAJ,CAAvB;;AAEA3R,QAAO6P,SAAS,EAAhB,IAAuB8B,GAAI,EAAJ,CAAvB;AACA3R,QAAO6P,SAAS,EAAhB,IAAuB8B,GAAI,EAAJ,CAAvB;AACA3R,QAAO6P,SAAS,EAAhB,IAAuB8B,GAAI,EAAJ,CAAvB;AACA3R,QAAO6P,SAAS,EAAhB,IAAuB8B,GAAI,EAAJ,CAAvB;;AAEA,SAAO3R,KAAP;AAEA;;AAl4BgC,CAAlC;;AAs4BA;;;;;;;AAOA,SAASgb,UAAT,CAAqBjd,CAArB,EAAwB4M,CAAxB,EAA2B0H,CAA3B,EAA8BtF,CAA9B,EAAkC;;AAEjC,MAAK6L,EAAL,GAAU7a,KAAK,CAAf;AACA,MAAK8a,EAAL,GAAUlO,KAAK,CAAf;AACA,MAAKmO,EAAL,GAAUzG,KAAK,CAAf;AACA,MAAK0G,EAAL,GAAYhM,MAAMxP,SAAR,GAAsBwP,CAAtB,GAA0B,CAApC;AAEA;;AAED7O,OAAOK,MAAP,CAAeyc,UAAf,EAA2B;;AAE1BC,QAAO,UAAWC,EAAX,EAAeC,EAAf,EAAmBC,EAAnB,EAAuBxQ,CAAvB,EAA2B;;AAEjC,SAAOwQ,GAAGxO,IAAH,CAASsO,EAAT,EAAcD,KAAd,CAAqBE,EAArB,EAAyBvQ,CAAzB,CAAP;AAEA,EANyB;;AAQ1ByQ,YAAW,UAAWC,GAAX,EAAgBC,SAAhB,EAA2BC,IAA3B,EAAiCC,UAAjC,EAA6CC,IAA7C,EAAmDC,UAAnD,EAA+D/Q,CAA/D,EAAmE;;AAE7E;;AAEA,MAAIgR,KAAKJ,KAAMC,aAAa,CAAnB,CAAT;AAAA,MACCI,KAAKL,KAAMC,aAAa,CAAnB,CADN;AAAA,MAECK,KAAKN,KAAMC,aAAa,CAAnB,CAFN;AAAA,MAGCM,KAAKP,KAAMC,aAAa,CAAnB,CAHN;AAAA,MAKCO,KAAKN,KAAMC,aAAa,CAAnB,CALN;AAAA,MAMCM,KAAKP,KAAMC,aAAa,CAAnB,CANN;AAAA,MAOCO,KAAKR,KAAMC,aAAa,CAAnB,CAPN;AAAA,MAQCQ,KAAKT,KAAMC,aAAa,CAAnB,CARN;;AAUA,MAAKI,OAAOI,EAAP,IAAaP,OAAOI,EAApB,IAA0BH,OAAOI,EAAjC,IAAuCH,OAAOI,EAAnD,EAAwD;;AAEvD,OAAI9O,IAAI,IAAIxC,CAAZ;AAAA,OAEC0F,MAAMsL,KAAKI,EAAL,GAAUH,KAAKI,EAAf,GAAoBH,KAAKI,EAAzB,GAA8BH,KAAKI,EAF1C;AAAA,OAICC,MAAQ9L,OAAO,CAAP,GAAW,CAAX,GAAe,CAAE,CAJ1B;AAAA,OAKC+L,SAAS,IAAI/L,MAAMA,GALpB;;AAOA;AACA,OAAK+L,SAAShf,OAAOC,OAArB,EAA+B;;AAE9B,QAAIiT,MAAM/S,KAAKmR,IAAL,CAAW0N,MAAX,CAAV;AAAA,QACCC,MAAM9e,KAAKwR,KAAL,CAAYuB,GAAZ,EAAiBD,MAAM8L,GAAvB,CADP;;AAGAhP,QAAI5P,KAAK+S,GAAL,CAAUnD,IAAIkP,GAAd,IAAsB/L,GAA1B;AACA3F,QAAIpN,KAAK+S,GAAL,CAAU3F,IAAI0R,GAAd,IAAsB/L,GAA1B;AAEA;;AAED,OAAIgM,OAAO3R,IAAIwR,GAAf;;AAEAR,QAAKA,KAAKxO,CAAL,GAAS4O,KAAKO,IAAnB;AACAV,QAAKA,KAAKzO,CAAL,GAAS6O,KAAKM,IAAnB;AACAT,QAAKA,KAAK1O,CAAL,GAAS8O,KAAKK,IAAnB;AACAR,QAAKA,KAAK3O,CAAL,GAAS+O,KAAKI,IAAnB;;AAEA;AACA,OAAKnP,MAAM,IAAIxC,CAAf,EAAmB;;AAElB,QAAImI,IAAI,IAAIvV,KAAKmR,IAAL,CAAWiN,KAAKA,EAAL,GAAUC,KAAKA,EAAf,GAAoBC,KAAKA,EAAzB,GAA8BC,KAAKA,EAA9C,CAAZ;;AAEAH,UAAM7I,CAAN;AACA8I,UAAM9I,CAAN;AACA+I,UAAM/I,CAAN;AACAgJ,UAAMhJ,CAAN;AAEA;AAED;;AAEDuI,MAAKC,SAAL,IAAmBK,EAAnB;AACAN,MAAKC,YAAY,CAAjB,IAAuBM,EAAvB;AACAP,MAAKC,YAAY,CAAjB,IAAuBO,EAAvB;AACAR,MAAKC,YAAY,CAAjB,IAAuBQ,EAAvB;AAEA;;AApEyB,CAA3B;;AAwEA7d,OAAO8N,gBAAP,CAAyBgP,WAAW/c,SAApC,EAA+C;;AAE9CF,IAAG;;AAEFK,OAAK,YAAY;;AAEhB,UAAO,KAAKwa,EAAZ;AAEA,GANC;;AAQF3M,OAAK,UAAWtO,KAAX,EAAmB;;AAEvB,QAAKib,EAAL,GAAUjb,KAAV;AACA,QAAK6e,gBAAL;AAEA;;AAbC,EAF2C;;AAmB9C7R,IAAG;;AAEFvM,OAAK,YAAY;;AAEhB,UAAO,KAAKya,EAAZ;AAEA,GANC;;AAQF5M,OAAK,UAAWtO,KAAX,EAAmB;;AAEvB,QAAKkb,EAAL,GAAUlb,KAAV;AACA,QAAK6e,gBAAL;AAEA;;AAbC,EAnB2C;;AAoC9CnK,IAAG;;AAEFjU,OAAK,YAAY;;AAEhB,UAAO,KAAK0a,EAAZ;AAEA,GANC;;AAQF7M,OAAK,UAAWtO,KAAX,EAAmB;;AAEvB,QAAKmb,EAAL,GAAUnb,KAAV;AACA,QAAK6e,gBAAL;AAEA;;AAbC,EApC2C;;AAqD9CzP,IAAG;;AAEF3O,OAAK,YAAY;;AAEhB,UAAO,KAAK2a,EAAZ;AAEA,GANC;;AAQF9M,OAAK,UAAWtO,KAAX,EAAmB;;AAEvB,QAAKob,EAAL,GAAUpb,KAAV;AACA,QAAK6e,gBAAL;AAEA;;AAbC;;AArD2C,CAA/C;;AAwEAte,OAAOK,MAAP,CAAeyc,WAAW/c,SAA1B,EAAqC;;AAEpCgO,MAAK,UAAWlO,CAAX,EAAc4M,CAAd,EAAiB0H,CAAjB,EAAoBtF,CAApB,EAAwB;;AAE5B,OAAK6L,EAAL,GAAU7a,CAAV;AACA,OAAK8a,EAAL,GAAUlO,CAAV;AACA,OAAKmO,EAAL,GAAUzG,CAAV;AACA,OAAK0G,EAAL,GAAUhM,CAAV;;AAEA,OAAKyP,gBAAL;;AAEA,SAAO,IAAP;AAEA,EAbmC;;AAepC9P,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAKiM,EAA3B,EAA+B,KAAKC,EAApC,EAAwC,KAAKC,EAA7C,EAAiD,KAAKC,EAAtD,CAAP;AAEA,EAnBmC;;AAqBpCnM,OAAM,UAAW+L,UAAX,EAAwB;;AAE7B,OAAKC,EAAL,GAAUD,WAAW5a,CAArB;AACA,OAAK8a,EAAL,GAAUF,WAAWhO,CAArB;AACA,OAAKmO,EAAL,GAAUH,WAAWtG,CAArB;AACA,OAAK0G,EAAL,GAAUJ,WAAW5L,CAArB;;AAEA,OAAKyP,gBAAL;;AAEA,SAAO,IAAP;AAEA,EAhCmC;;AAkCpCC,eAAc,UAAW7J,KAAX,EAAkB8J,MAAlB,EAA2B;;AAExC,MAAK,EAAI9J,SAASA,MAAMC,OAAnB,CAAL,EAAoC;;AAEnC,SAAM,IAAIrG,KAAJ,CAAW,kGAAX,CAAN;AAEA;;AAED,MAAIzO,IAAI6U,MAAMgG,EAAd;AAAA,MAAkBjO,IAAIiI,MAAMiG,EAA5B;AAAA,MAAgCxG,IAAIO,MAAMkG,EAA1C;AAAA,MAA8C9F,QAAQJ,MAAMI,KAA5D;;AAEA;AACA;AACA;;AAEA,MAAI1C,MAAM9S,KAAK8S,GAAf;AACA,MAAIC,MAAM/S,KAAK+S,GAAf;;AAEA,MAAIoM,KAAKrM,IAAKvS,IAAI,CAAT,CAAT;AACA,MAAI6e,KAAKtM,IAAK3F,IAAI,CAAT,CAAT;AACA,MAAIkS,KAAKvM,IAAK+B,IAAI,CAAT,CAAT;;AAEA,MAAIyK,KAAKvM,IAAKxS,IAAI,CAAT,CAAT;AACA,MAAIgf,KAAKxM,IAAK5F,IAAI,CAAT,CAAT;AACA,MAAIqS,KAAKzM,IAAK8B,IAAI,CAAT,CAAT;;AAEA,MAAKW,UAAU,KAAf,EAAuB;;AAEtB,QAAK4F,EAAL,GAAUkE,KAAKF,EAAL,GAAUC,EAAV,GAAeF,KAAKI,EAAL,GAAUC,EAAnC;AACA,QAAKnE,EAAL,GAAU8D,KAAKI,EAAL,GAAUF,EAAV,GAAeC,KAAKF,EAAL,GAAUI,EAAnC;AACA,QAAKlE,EAAL,GAAU6D,KAAKC,EAAL,GAAUI,EAAV,GAAeF,KAAKC,EAAL,GAAUF,EAAnC;AACA,QAAK9D,EAAL,GAAU4D,KAAKC,EAAL,GAAUC,EAAV,GAAeC,KAAKC,EAAL,GAAUC,EAAnC;AAEA,GAPD,MAOO,IAAKhK,UAAU,KAAf,EAAuB;;AAE7B,QAAK4F,EAAL,GAAUkE,KAAKF,EAAL,GAAUC,EAAV,GAAeF,KAAKI,EAAL,GAAUC,EAAnC;AACA,QAAKnE,EAAL,GAAU8D,KAAKI,EAAL,GAAUF,EAAV,GAAeC,KAAKF,EAAL,GAAUI,EAAnC;AACA,QAAKlE,EAAL,GAAU6D,KAAKC,EAAL,GAAUI,EAAV,GAAeF,KAAKC,EAAL,GAAUF,EAAnC;AACA,QAAK9D,EAAL,GAAU4D,KAAKC,EAAL,GAAUC,EAAV,GAAeC,KAAKC,EAAL,GAAUC,EAAnC;AAEA,GAPM,MAOA,IAAKhK,UAAU,KAAf,EAAuB;;AAE7B,QAAK4F,EAAL,GAAUkE,KAAKF,EAAL,GAAUC,EAAV,GAAeF,KAAKI,EAAL,GAAUC,EAAnC;AACA,QAAKnE,EAAL,GAAU8D,KAAKI,EAAL,GAAUF,EAAV,GAAeC,KAAKF,EAAL,GAAUI,EAAnC;AACA,QAAKlE,EAAL,GAAU6D,KAAKC,EAAL,GAAUI,EAAV,GAAeF,KAAKC,EAAL,GAAUF,EAAnC;AACA,QAAK9D,EAAL,GAAU4D,KAAKC,EAAL,GAAUC,EAAV,GAAeC,KAAKC,EAAL,GAAUC,EAAnC;AAEA,GAPM,MAOA,IAAKhK,UAAU,KAAf,EAAuB;;AAE7B,QAAK4F,EAAL,GAAUkE,KAAKF,EAAL,GAAUC,EAAV,GAAeF,KAAKI,EAAL,GAAUC,EAAnC;AACA,QAAKnE,EAAL,GAAU8D,KAAKI,EAAL,GAAUF,EAAV,GAAeC,KAAKF,EAAL,GAAUI,EAAnC;AACA,QAAKlE,EAAL,GAAU6D,KAAKC,EAAL,GAAUI,EAAV,GAAeF,KAAKC,EAAL,GAAUF,EAAnC;AACA,QAAK9D,EAAL,GAAU4D,KAAKC,EAAL,GAAUC,EAAV,GAAeC,KAAKC,EAAL,GAAUC,EAAnC;AAEA,GAPM,MAOA,IAAKhK,UAAU,KAAf,EAAuB;;AAE7B,QAAK4F,EAAL,GAAUkE,KAAKF,EAAL,GAAUC,EAAV,GAAeF,KAAKI,EAAL,GAAUC,EAAnC;AACA,QAAKnE,EAAL,GAAU8D,KAAKI,EAAL,GAAUF,EAAV,GAAeC,KAAKF,EAAL,GAAUI,EAAnC;AACA,QAAKlE,EAAL,GAAU6D,KAAKC,EAAL,GAAUI,EAAV,GAAeF,KAAKC,EAAL,GAAUF,EAAnC;AACA,QAAK9D,EAAL,GAAU4D,KAAKC,EAAL,GAAUC,EAAV,GAAeC,KAAKC,EAAL,GAAUC,EAAnC;AAEA,GAPM,MAOA,IAAKhK,UAAU,KAAf,EAAuB;;AAE7B,QAAK4F,EAAL,GAAUkE,KAAKF,EAAL,GAAUC,EAAV,GAAeF,KAAKI,EAAL,GAAUC,EAAnC;AACA,QAAKnE,EAAL,GAAU8D,KAAKI,EAAL,GAAUF,EAAV,GAAeC,KAAKF,EAAL,GAAUI,EAAnC;AACA,QAAKlE,EAAL,GAAU6D,KAAKC,EAAL,GAAUI,EAAV,GAAeF,KAAKC,EAAL,GAAUF,EAAnC;AACA,QAAK9D,EAAL,GAAU4D,KAAKC,EAAL,GAAUC,EAAV,GAAeC,KAAKC,EAAL,GAAUC,EAAnC;AAEA;;AAED,MAAKN,WAAW,KAAhB,EAAwB,KAAKF,gBAAL;;AAExB,SAAO,IAAP;AAEA,EA3GmC;;AA6GpCS,mBAAkB,UAAW5E,IAAX,EAAiBtJ,KAAjB,EAAyB;;AAE1C;;AAEA;;AAEA,MAAImO,YAAYnO,QAAQ,CAAxB;AAAA,MAA2B3B,IAAI5P,KAAK+S,GAAL,CAAU2M,SAAV,CAA/B;;AAEA,OAAKtE,EAAL,GAAUP,KAAKta,CAAL,GAASqP,CAAnB;AACA,OAAKyL,EAAL,GAAUR,KAAK1N,CAAL,GAASyC,CAAnB;AACA,OAAK0L,EAAL,GAAUT,KAAKhG,CAAL,GAASjF,CAAnB;AACA,OAAK2L,EAAL,GAAUvb,KAAK8S,GAAL,CAAU4M,SAAV,CAAV;;AAEA,OAAKV,gBAAL;;AAEA,SAAO,IAAP;AAEA,EA9HmC;;AAgIpCnC,wBAAuB,UAAWjQ,CAAX,EAAe;;AAErC;;AAEA;;AAEA,MAAIuH,KAAKvH,EAAE6D,QAAX;AAAA,MAECkP,MAAMxL,GAAI,CAAJ,CAFP;AAAA,MAEgByL,MAAMzL,GAAI,CAAJ,CAFtB;AAAA,MAE+B0L,MAAM1L,GAAI,CAAJ,CAFrC;AAAA,MAGC2L,MAAM3L,GAAI,CAAJ,CAHP;AAAA,MAGgB4L,MAAM5L,GAAI,CAAJ,CAHtB;AAAA,MAG+B6L,MAAM7L,GAAI,CAAJ,CAHrC;AAAA,MAIC8L,MAAM9L,GAAI,CAAJ,CAJP;AAAA,MAIgB+L,MAAM/L,GAAI,CAAJ,CAJtB;AAAA,MAI+BgM,MAAMhM,GAAI,EAAJ,CAJrC;AAAA,MAMCiM,QAAQT,MAAMI,GAAN,GAAYI,GANrB;AAAA,MAOCvQ,CAPD;;AASA,MAAKwQ,QAAQ,CAAb,EAAiB;;AAEhBxQ,OAAI,MAAM5P,KAAKmR,IAAL,CAAWiP,QAAQ,GAAnB,CAAV;;AAEA,QAAK7E,EAAL,GAAU,OAAO3L,CAAjB;AACA,QAAKwL,EAAL,GAAU,CAAE8E,MAAMF,GAAR,IAAgBpQ,CAA1B;AACA,QAAKyL,EAAL,GAAU,CAAEwE,MAAMI,GAAR,IAAgBrQ,CAA1B;AACA,QAAK0L,EAAL,GAAU,CAAEwE,MAAMF,GAAR,IAAgBhQ,CAA1B;AAEA,GATD,MASO,IAAK+P,MAAMI,GAAN,IAAaJ,MAAMQ,GAAxB,EAA8B;;AAEpCvQ,OAAI,MAAM5P,KAAKmR,IAAL,CAAW,MAAMwO,GAAN,GAAYI,GAAZ,GAAkBI,GAA7B,CAAV;;AAEA,QAAK5E,EAAL,GAAU,CAAE2E,MAAMF,GAAR,IAAgBpQ,CAA1B;AACA,QAAKwL,EAAL,GAAU,OAAOxL,CAAjB;AACA,QAAKyL,EAAL,GAAU,CAAEuE,MAAME,GAAR,IAAgBlQ,CAA1B;AACA,QAAK0L,EAAL,GAAU,CAAEuE,MAAMI,GAAR,IAAgBrQ,CAA1B;AAEA,GATM,MASA,IAAKmQ,MAAMI,GAAX,EAAiB;;AAEvBvQ,OAAI,MAAM5P,KAAKmR,IAAL,CAAW,MAAM4O,GAAN,GAAYJ,GAAZ,GAAkBQ,GAA7B,CAAV;;AAEA,QAAK5E,EAAL,GAAU,CAAEsE,MAAMI,GAAR,IAAgBrQ,CAA1B;AACA,QAAKwL,EAAL,GAAU,CAAEwE,MAAME,GAAR,IAAgBlQ,CAA1B;AACA,QAAKyL,EAAL,GAAU,OAAOzL,CAAjB;AACA,QAAK0L,EAAL,GAAU,CAAE0E,MAAME,GAAR,IAAgBtQ,CAA1B;AAEA,GATM,MASA;;AAENA,OAAI,MAAM5P,KAAKmR,IAAL,CAAW,MAAMgP,GAAN,GAAYR,GAAZ,GAAkBI,GAA7B,CAAV;;AAEA,QAAKxE,EAAL,GAAU,CAAEuE,MAAMF,GAAR,IAAgBhQ,CAA1B;AACA,QAAKwL,EAAL,GAAU,CAAEyE,MAAMI,GAAR,IAAgBrQ,CAA1B;AACA,QAAKyL,EAAL,GAAU,CAAE2E,MAAME,GAAR,IAAgBtQ,CAA1B;AACA,QAAK0L,EAAL,GAAU,OAAO1L,CAAjB;AAEA;;AAED,OAAKoP,gBAAL;;AAEA,SAAO,IAAP;AAEA,EAzLmC;;AA2LpCqB,qBAAoB,YAAY;;AAE/B;;AAEA,MAAIpO,KAAK,IAAI8C,OAAJ,EAAT;AACA,MAAIuL,CAAJ;;AAEA,MAAIC,MAAM,QAAV;;AAEA,SAAO,SAASF,kBAAT,CAA6BG,KAA7B,EAAoCC,GAApC,EAA0C;;AAEhD,OAAKxO,OAAOlS,SAAZ,EAAwBkS,KAAK,IAAI8C,OAAJ,EAAL;;AAExBuL,OAAIE,MAAMvP,GAAN,CAAWwP,GAAX,IAAmB,CAAvB;;AAEA,OAAKH,IAAIC,GAAT,EAAe;;AAEdD,QAAI,CAAJ;;AAEA,QAAKtgB,KAAKqR,GAAL,CAAUmP,MAAMjgB,CAAhB,IAAsBP,KAAKqR,GAAL,CAAUmP,MAAM3L,CAAhB,CAA3B,EAAiD;;AAEhD5C,QAAGxD,GAAH,CAAQ,CAAE+R,MAAMrT,CAAhB,EAAmBqT,MAAMjgB,CAAzB,EAA4B,CAA5B;AAEA,KAJD,MAIO;;AAEN0R,QAAGxD,GAAH,CAAQ,CAAR,EAAW,CAAE+R,MAAM3L,CAAnB,EAAsB2L,MAAMrT,CAA5B;AAEA;AAED,IAdD,MAcO;;AAEN8E,OAAG4E,YAAH,CAAiB2J,KAAjB,EAAwBC,GAAxB;AAEA;;AAED,QAAKrF,EAAL,GAAUnJ,GAAG1R,CAAb;AACA,QAAK8a,EAAL,GAAUpJ,GAAG9E,CAAb;AACA,QAAKmO,EAAL,GAAUrJ,GAAG4C,CAAb;AACA,QAAK0G,EAAL,GAAU+E,CAAV;;AAEA,UAAO,KAAKhP,SAAL,EAAP;AAEA,GAjCD;AAmCA,EA5CmB,EA3LgB;;AAyOpCoP,UAAS,YAAY;;AAEpB;;AAEA,SAAO,KAAKC,SAAL,EAAP;AAEA,EA/OmC;;AAiPpCA,YAAW,YAAY;;AAEtB,OAAKvF,EAAL,IAAW,CAAE,CAAb;AACA,OAAKC,EAAL,IAAW,CAAE,CAAb;AACA,OAAKC,EAAL,IAAW,CAAE,CAAb;;AAEA,OAAK0D,gBAAL;;AAEA,SAAO,IAAP;AAEA,EA3PmC;;AA6PpC/N,MAAK,UAAW5B,CAAX,EAAe;;AAEnB,SAAO,KAAK+L,EAAL,GAAU/L,EAAE+L,EAAZ,GAAiB,KAAKC,EAAL,GAAUhM,EAAEgM,EAA7B,GAAkC,KAAKC,EAAL,GAAUjM,EAAEiM,EAA9C,GAAmD,KAAKC,EAAL,GAAUlM,EAAEkM,EAAtE;AAEA,EAjQmC;;AAmQpCrK,WAAU,YAAY;;AAErB,SAAO,KAAKkK,EAAL,GAAU,KAAKA,EAAf,GAAoB,KAAKC,EAAL,GAAU,KAAKA,EAAnC,GAAwC,KAAKC,EAAL,GAAU,KAAKA,EAAvD,GAA4D,KAAKC,EAAL,GAAU,KAAKA,EAAlF;AAEA,EAvQmC;;AAyQpCla,SAAQ,YAAY;;AAEnB,SAAOrB,KAAKmR,IAAL,CAAW,KAAKiK,EAAL,GAAU,KAAKA,EAAf,GAAoB,KAAKC,EAAL,GAAU,KAAKA,EAAnC,GAAwC,KAAKC,EAAL,GAAU,KAAKA,EAAvD,GAA4D,KAAKC,EAAL,GAAU,KAAKA,EAAtF,CAAP;AAEA,EA7QmC;;AA+QpCjK,YAAW,YAAY;;AAEtB,MAAI3O,IAAI,KAAKtB,MAAL,EAAR;;AAEA,MAAKsB,MAAM,CAAX,EAAe;;AAEd,QAAKyY,EAAL,GAAU,CAAV;AACA,QAAKC,EAAL,GAAU,CAAV;AACA,QAAKC,EAAL,GAAU,CAAV;AACA,QAAKC,EAAL,GAAU,CAAV;AAEA,GAPD,MAOO;;AAEN5Y,OAAI,IAAIA,CAAR;;AAEA,QAAKyY,EAAL,GAAU,KAAKA,EAAL,GAAUzY,CAApB;AACA,QAAK0Y,EAAL,GAAU,KAAKA,EAAL,GAAU1Y,CAApB;AACA,QAAK2Y,EAAL,GAAU,KAAKA,EAAL,GAAU3Y,CAApB;AACA,QAAK4Y,EAAL,GAAU,KAAKA,EAAL,GAAU5Y,CAApB;AAEA;;AAED,OAAKqc,gBAAL;;AAEA,SAAO,IAAP;AAEA,EAzSmC;;AA2SpC7O,WAAU,UAAWqG,CAAX,EAAc+G,CAAd,EAAkB;;AAE3B,MAAKA,MAAMxd,SAAX,EAAuB;;AAEtByP,WAAQC,IAAR,CAAc,wGAAd;AACA,UAAO,KAAKmR,mBAAL,CAA0BpK,CAA1B,EAA6B+G,CAA7B,CAAP;AAEA;;AAED,SAAO,KAAKqD,mBAAL,CAA0B,IAA1B,EAAgCpK,CAAhC,CAAP;AAEA,EAtTmC;;AAwTpCO,cAAa,UAAWP,CAAX,EAAe;;AAE3B,SAAO,KAAKoK,mBAAL,CAA0BpK,CAA1B,EAA6B,IAA7B,CAAP;AAEA,EA5TmC;;AA8TpCoK,sBAAqB,UAAW/Q,CAAX,EAAcC,CAAd,EAAkB;;AAEtC;;AAEA,MAAI+Q,MAAMhR,EAAEuL,EAAZ;AAAA,MAAgB0F,MAAMjR,EAAEwL,EAAxB;AAAA,MAA4B0F,MAAMlR,EAAEyL,EAApC;AAAA,MAAwC0F,MAAMnR,EAAE0L,EAAhD;AACA,MAAI0F,MAAMnR,EAAEsL,EAAZ;AAAA,MAAgB8F,MAAMpR,EAAEuL,EAAxB;AAAA,MAA4B8F,MAAMrR,EAAEwL,EAApC;AAAA,MAAwC8F,MAAMtR,EAAEyL,EAAhD;;AAEA,OAAKH,EAAL,GAAUyF,MAAMO,GAAN,GAAYJ,MAAMC,GAAlB,GAAwBH,MAAMK,GAA9B,GAAoCJ,MAAMG,GAApD;AACA,OAAK7F,EAAL,GAAUyF,MAAMM,GAAN,GAAYJ,MAAME,GAAlB,GAAwBH,MAAME,GAA9B,GAAoCJ,MAAMM,GAApD;AACA,OAAK7F,EAAL,GAAUyF,MAAMK,GAAN,GAAYJ,MAAMG,GAAlB,GAAwBN,MAAMK,GAA9B,GAAoCJ,MAAMG,GAApD;AACA,OAAK1F,EAAL,GAAUyF,MAAMI,GAAN,GAAYP,MAAMI,GAAlB,GAAwBH,MAAMI,GAA9B,GAAoCH,MAAMI,GAApD;;AAEA,OAAKnC,gBAAL;;AAEA,SAAO,IAAP;AAEA,EA9UmC;;AAgVpCvB,QAAO,UAAWE,EAAX,EAAevQ,CAAf,EAAmB;;AAEzB,MAAKA,MAAM,CAAX,EAAe,OAAO,IAAP;AACf,MAAKA,MAAM,CAAX,EAAe,OAAO,KAAKgC,IAAL,CAAWuO,EAAX,CAAP;;AAEf,MAAIpd,IAAI,KAAK6a,EAAb;AAAA,MAAiBjO,IAAI,KAAKkO,EAA1B;AAAA,MAA8BxG,IAAI,KAAKyG,EAAvC;AAAA,MAA2C/L,IAAI,KAAKgM,EAApD;;AAEA;;AAEA,MAAI8F,eAAe9R,IAAIoO,GAAGpC,EAAP,GAAYhb,IAAIod,GAAGvC,EAAnB,GAAwBjO,IAAIwQ,GAAGtC,EAA/B,GAAoCxG,IAAI8I,GAAGrC,EAA9D;;AAEA,MAAK+F,eAAe,CAApB,EAAwB;;AAEvB,QAAK9F,EAAL,GAAU,CAAEoC,GAAGpC,EAAf;AACA,QAAKH,EAAL,GAAU,CAAEuC,GAAGvC,EAAf;AACA,QAAKC,EAAL,GAAU,CAAEsC,GAAGtC,EAAf;AACA,QAAKC,EAAL,GAAU,CAAEqC,GAAGrC,EAAf;;AAEA+F,kBAAe,CAAEA,YAAjB;AAEA,GATD,MASO;;AAEN,QAAKjS,IAAL,CAAWuO,EAAX;AAEA;;AAED,MAAK0D,gBAAgB,GAArB,EAA2B;;AAE1B,QAAK9F,EAAL,GAAUhM,CAAV;AACA,QAAK6L,EAAL,GAAU7a,CAAV;AACA,QAAK8a,EAAL,GAAUlO,CAAV;AACA,QAAKmO,EAAL,GAAUzG,CAAV;;AAEA,UAAO,IAAP;AAEA;;AAED,MAAIyM,eAAethB,KAAKmR,IAAL,CAAW,MAAMkQ,eAAeA,YAAhC,CAAnB;;AAEA,MAAKrhB,KAAKqR,GAAL,CAAUiQ,YAAV,IAA2B,KAAhC,EAAwC;;AAEvC,QAAK/F,EAAL,GAAU,OAAQhM,IAAI,KAAKgM,EAAjB,CAAV;AACA,QAAKH,EAAL,GAAU,OAAQ7a,IAAI,KAAK6a,EAAjB,CAAV;AACA,QAAKC,EAAL,GAAU,OAAQlO,IAAI,KAAKkO,EAAjB,CAAV;AACA,QAAKC,EAAL,GAAU,OAAQzG,IAAI,KAAKyG,EAAjB,CAAV;;AAEA,UAAO,IAAP;AAEA;;AAED,MAAIiG,YAAYvhB,KAAKwR,KAAL,CAAY8P,YAAZ,EAA0BD,YAA1B,CAAhB;AACA,MAAIG,SAASxhB,KAAK+S,GAAL,CAAU,CAAE,IAAI3F,CAAN,IAAYmU,SAAtB,IAAoCD,YAAjD;AAAA,MACCG,SAASzhB,KAAK+S,GAAL,CAAU3F,IAAImU,SAAd,IAA4BD,YADtC;;AAGA,OAAK/F,EAAL,GAAYhM,IAAIiS,MAAJ,GAAa,KAAKjG,EAAL,GAAUkG,MAAnC;AACA,OAAKrG,EAAL,GAAY7a,IAAIihB,MAAJ,GAAa,KAAKpG,EAAL,GAAUqG,MAAnC;AACA,OAAKpG,EAAL,GAAYlO,IAAIqU,MAAJ,GAAa,KAAKnG,EAAL,GAAUoG,MAAnC;AACA,OAAKnG,EAAL,GAAYzG,IAAI2M,MAAJ,GAAa,KAAKlG,EAAL,GAAUmG,MAAnC;;AAEA,OAAKzC,gBAAL;;AAEA,SAAO,IAAP;AAEA,EA/YmC;;AAiZpC7M,SAAQ,UAAWgJ,UAAX,EAAwB;;AAE/B,SAASA,WAAWC,EAAX,KAAkB,KAAKA,EAAzB,IAAmCD,WAAWE,EAAX,KAAkB,KAAKA,EAA1D,IAAoEF,WAAWG,EAAX,KAAkB,KAAKA,EAA3F,IAAqGH,WAAWI,EAAX,KAAkB,KAAKA,EAAnI;AAEA,EArZmC;;AAuZpCnJ,YAAW,UAAW5P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAErC,MAAKA,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,OAAK+I,EAAL,GAAU5Y,MAAO6P,MAAP,CAAV;AACA,OAAKgJ,EAAL,GAAU7Y,MAAO6P,SAAS,CAAhB,CAAV;AACA,OAAKiJ,EAAL,GAAU9Y,MAAO6P,SAAS,CAAhB,CAAV;AACA,OAAKkJ,EAAL,GAAU/Y,MAAO6P,SAAS,CAAhB,CAAV;;AAEA,OAAK2M,gBAAL;;AAEA,SAAO,IAAP;AAEA,EApamC;;AAsapC1M,UAAS,UAAW9P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEnC,MAAK7P,UAAUzC,SAAf,EAA2ByC,QAAQ,EAAR;AAC3B,MAAK6P,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B7P,QAAO6P,MAAP,IAAkB,KAAK+I,EAAvB;AACA5Y,QAAO6P,SAAS,CAAhB,IAAsB,KAAKgJ,EAA3B;AACA7Y,QAAO6P,SAAS,CAAhB,IAAsB,KAAKiJ,EAA3B;AACA9Y,QAAO6P,SAAS,CAAhB,IAAsB,KAAKkJ,EAA3B;;AAEA,SAAO/Y,KAAP;AAEA,EAlbmC;;AAobpCkf,WAAU,UAAWC,QAAX,EAAsB;;AAE/B,OAAK3C,gBAAL,GAAwB2C,QAAxB;;AAEA,SAAO,IAAP;AAEA,EA1bmC;;AA4bpC3C,mBAAkB,YAAY,CAAE;;AA5bI,CAArC;;AAgcA;;;;;;;;;AASA,SAASjK,OAAT,CAAkBxU,CAAlB,EAAqB4M,CAArB,EAAwB0H,CAAxB,EAA4B;;AAE3B,MAAKtU,CAAL,GAASA,KAAK,CAAd;AACA,MAAK4M,CAAL,GAASA,KAAK,CAAd;AACA,MAAK0H,CAAL,GAASA,KAAK,CAAd;AAEA;;AAEDnU,OAAOK,MAAP,CAAegU,QAAQtU,SAAvB,EAAkC;;AAEjCmhB,YAAW,IAFsB;;AAIjCnT,MAAK,UAAWlO,CAAX,EAAc4M,CAAd,EAAiB0H,CAAjB,EAAqB;;AAEzB,OAAKtU,CAAL,GAASA,CAAT;AACA,OAAK4M,CAAL,GAASA,CAAT;AACA,OAAK0H,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EAZgC;;AAcjClG,YAAW,UAAWC,MAAX,EAAoB;;AAE9B,OAAKrO,CAAL,GAASqO,MAAT;AACA,OAAKzB,CAAL,GAASyB,MAAT;AACA,OAAKiG,CAAL,GAASjG,MAAT;;AAEA,SAAO,IAAP;AAEA,EAtBgC;;AAwBjCC,OAAM,UAAWtO,CAAX,EAAe;;AAEpB,OAAKA,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EA9BgC;;AAgCjCuO,OAAM,UAAW3B,CAAX,EAAe;;AAEpB,OAAKA,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EAtCgC;;AAwCjC0U,OAAM,UAAWhN,CAAX,EAAe;;AAEpB,OAAKA,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EA9CgC;;AAgDjC9F,eAAc,UAAW5N,KAAX,EAAkBhB,KAAlB,EAA0B;;AAEvC,UAASgB,KAAT;;AAEC,QAAK,CAAL;AAAQ,SAAKZ,CAAL,GAASJ,KAAT,CAAgB;AACxB,QAAK,CAAL;AAAQ,SAAKgN,CAAL,GAAShN,KAAT,CAAgB;AACxB,QAAK,CAAL;AAAQ,SAAK0U,CAAL,GAAS1U,KAAT,CAAgB;AACxB;AAAS,UAAM,IAAI6O,KAAJ,CAAW,4BAA4B7N,KAAvC,CAAN;;AALV;;AASA,SAAO,IAAP;AAEA,EA7DgC;;AA+DjC8N,eAAc,UAAW9N,KAAX,EAAmB;;AAEhC,UAASA,KAAT;;AAEC,QAAK,CAAL;AAAQ,WAAO,KAAKZ,CAAZ;AACR,QAAK,CAAL;AAAQ,WAAO,KAAK4M,CAAZ;AACR,QAAK,CAAL;AAAQ,WAAO,KAAK0H,CAAZ;AACR;AAAS,UAAM,IAAI7F,KAAJ,CAAW,4BAA4B7N,KAAvC,CAAN;;AALV;AASA,EA1EgC;;AA4EjC+N,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAK5O,CAA3B,EAA8B,KAAK4M,CAAnC,EAAsC,KAAK0H,CAA3C,CAAP;AAEA,EAhFgC;;AAkFjCzF,OAAM,UAAWC,CAAX,EAAe;;AAEpB,OAAK9O,CAAL,GAAS8O,EAAE9O,CAAX;AACA,OAAK4M,CAAL,GAASkC,EAAElC,CAAX;AACA,OAAK0H,CAAL,GAASxF,EAAEwF,CAAX;;AAEA,SAAO,IAAP;AAEA,EA1FgC;;AA4FjCvF,MAAK,UAAWD,CAAX,EAAcE,CAAd,EAAkB;;AAEtB,MAAKA,MAAMxP,SAAX,EAAuB;;AAEtByP,WAAQC,IAAR,CAAc,uFAAd;AACA,UAAO,KAAKC,UAAL,CAAiBL,CAAjB,EAAoBE,CAApB,CAAP;AAEA;;AAED,OAAKhP,CAAL,IAAU8O,EAAE9O,CAAZ;AACA,OAAK4M,CAAL,IAAUkC,EAAElC,CAAZ;AACA,OAAK0H,CAAL,IAAUxF,EAAEwF,CAAZ;;AAEA,SAAO,IAAP;AAEA,EA3GgC;;AA6GjClF,YAAW,UAAWC,CAAX,EAAe;;AAEzB,OAAKrP,CAAL,IAAUqP,CAAV;AACA,OAAKzC,CAAL,IAAUyC,CAAV;AACA,OAAKiF,CAAL,IAAUjF,CAAV;;AAEA,SAAO,IAAP;AAEA,EArHgC;;AAuHjCF,aAAY,UAAWG,CAAX,EAAcC,CAAd,EAAkB;;AAE7B,OAAKvP,CAAL,GAASsP,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAjB;AACA,OAAK4M,CAAL,GAAS0C,EAAE1C,CAAF,GAAM2C,EAAE3C,CAAjB;AACA,OAAK0H,CAAL,GAAShF,EAAEgF,CAAF,GAAM/E,EAAE+E,CAAjB;;AAEA,SAAO,IAAP;AAEA,EA/HgC;;AAiIjC9E,kBAAiB,UAAWV,CAAX,EAAcO,CAAd,EAAkB;;AAElC,OAAKrP,CAAL,IAAU8O,EAAE9O,CAAF,GAAMqP,CAAhB;AACA,OAAKzC,CAAL,IAAUkC,EAAElC,CAAF,GAAMyC,CAAhB;AACA,OAAKiF,CAAL,IAAUxF,EAAEwF,CAAF,GAAMjF,CAAhB;;AAEA,SAAO,IAAP;AAEA,EAzIgC;;AA2IjCI,MAAK,UAAWX,CAAX,EAAcE,CAAd,EAAkB;;AAEtB,MAAKA,MAAMxP,SAAX,EAAuB;;AAEtByP,WAAQC,IAAR,CAAc,uFAAd;AACA,UAAO,KAAKQ,UAAL,CAAiBZ,CAAjB,EAAoBE,CAApB,CAAP;AAEA;;AAED,OAAKhP,CAAL,IAAU8O,EAAE9O,CAAZ;AACA,OAAK4M,CAAL,IAAUkC,EAAElC,CAAZ;AACA,OAAK0H,CAAL,IAAUxF,EAAEwF,CAAZ;;AAEA,SAAO,IAAP;AAEA,EA1JgC;;AA4JjC3E,YAAW,UAAWN,CAAX,EAAe;;AAEzB,OAAKrP,CAAL,IAAUqP,CAAV;AACA,OAAKzC,CAAL,IAAUyC,CAAV;AACA,OAAKiF,CAAL,IAAUjF,CAAV;;AAEA,SAAO,IAAP;AAEA,EApKgC;;AAsKjCK,aAAY,UAAWJ,CAAX,EAAcC,CAAd,EAAkB;;AAE7B,OAAKvP,CAAL,GAASsP,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAjB;AACA,OAAK4M,CAAL,GAAS0C,EAAE1C,CAAF,GAAM2C,EAAE3C,CAAjB;AACA,OAAK0H,CAAL,GAAShF,EAAEgF,CAAF,GAAM/E,EAAE+E,CAAjB;;AAEA,SAAO,IAAP;AAEA,EA9KgC;;AAgLjC1E,WAAU,UAAWd,CAAX,EAAcE,CAAd,EAAkB;;AAE3B,MAAKA,MAAMxP,SAAX,EAAuB;;AAEtByP,WAAQC,IAAR,CAAc,iGAAd;AACA,UAAO,KAAKqS,eAAL,CAAsBzS,CAAtB,EAAyBE,CAAzB,CAAP;AAEA;;AAED,OAAKhP,CAAL,IAAU8O,EAAE9O,CAAZ;AACA,OAAK4M,CAAL,IAAUkC,EAAElC,CAAZ;AACA,OAAK0H,CAAL,IAAUxF,EAAEwF,CAAZ;;AAEA,SAAO,IAAP;AAEA,EA/LgC;;AAiMjCzE,iBAAgB,UAAWxB,MAAX,EAAoB;;AAEnC,OAAKrO,CAAL,IAAUqO,MAAV;AACA,OAAKzB,CAAL,IAAUyB,MAAV;AACA,OAAKiG,CAAL,IAAUjG,MAAV;;AAEA,SAAO,IAAP;AAEA,EAzMgC;;AA2MjCkT,kBAAiB,UAAWjS,CAAX,EAAcC,CAAd,EAAkB;;AAElC,OAAKvP,CAAL,GAASsP,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAjB;AACA,OAAK4M,CAAL,GAAS0C,EAAE1C,CAAF,GAAM2C,EAAE3C,CAAjB;AACA,OAAK0H,CAAL,GAAShF,EAAEgF,CAAF,GAAM/E,EAAE+E,CAAjB;;AAEA,SAAO,IAAP;AAEA,EAnNgC;;AAqNjCkN,aAAY,YAAY;;AAEvB,MAAI5G,aAAa,IAAIqC,UAAJ,EAAjB;;AAEA,SAAO,SAASuE,UAAT,CAAqB3M,KAArB,EAA6B;;AAEnC,OAAK,EAAIA,SAASA,MAAMC,OAAnB,CAAL,EAAoC;;AAEnC7F,YAAQyD,KAAR,CAAe,6FAAf;AAEA;;AAED,UAAO,KAAK+O,eAAL,CAAsB7G,WAAW8D,YAAX,CAAyB7J,KAAzB,CAAtB,CAAP;AAEA,GAVD;AAYA,EAhBW,EArNqB;;AAuOjC6M,iBAAgB,YAAY;;AAE3B,MAAI9G,aAAa,IAAIqC,UAAJ,EAAjB;;AAEA,SAAO,SAASyE,cAAT,CAAyBpH,IAAzB,EAA+BtJ,KAA/B,EAAuC;;AAE7C,UAAO,KAAKyQ,eAAL,CAAsB7G,WAAWsE,gBAAX,CAA6B5E,IAA7B,EAAmCtJ,KAAnC,CAAtB,CAAP;AAEA,GAJD;AAMA,EAVe,EAvOiB;;AAmPjChB,eAAc,UAAW3D,CAAX,EAAe;;AAE5B,MAAIrM,IAAI,KAAKA,CAAb;AAAA,MAAgB4M,IAAI,KAAKA,CAAzB;AAAA,MAA4B0H,IAAI,KAAKA,CAArC;AACA,MAAIrE,IAAI5D,EAAE6D,QAAV;;AAEA,OAAKlQ,CAAL,GAASiQ,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,IAASqE,CAA5C;AACA,OAAK1H,CAAL,GAASqD,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,IAASqE,CAA5C;AACA,OAAKA,CAAL,GAASrE,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,IAASqE,CAA5C;;AAEA,SAAO,IAAP;AAEA,EA9PgC;;AAgQjCsE,eAAc,UAAWvM,CAAX,EAAe;;AAE5B,MAAIrM,IAAI,KAAKA,CAAb;AAAA,MAAgB4M,IAAI,KAAKA,CAAzB;AAAA,MAA4B0H,IAAI,KAAKA,CAArC;AACA,MAAIrE,IAAI5D,EAAE6D,QAAV;;AAEA,MAAIlB,IAAI,KAAMiB,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,EAAH,IAAUqE,CAApC,GAAwCrE,EAAG,EAAH,CAA9C,CAAR;;AAEA,OAAKjQ,CAAL,GAAS,CAAEiQ,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,IAASqE,CAAnC,GAAuCrE,EAAG,EAAH,CAAzC,IAAqDjB,CAA9D;AACA,OAAKpC,CAAL,GAAS,CAAEqD,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,IAASqE,CAAnC,GAAuCrE,EAAG,EAAH,CAAzC,IAAqDjB,CAA9D;AACA,OAAKsF,CAAL,GAAS,CAAErE,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,EAAH,IAAUqE,CAApC,GAAwCrE,EAAG,EAAH,CAA1C,IAAsDjB,CAA/D;;AAEA,SAAO,IAAP;AAEA,EA7QgC;;AA+QjCyS,kBAAiB,UAAWxL,CAAX,EAAe;;AAE/B,MAAIjW,IAAI,KAAKA,CAAb;AAAA,MAAgB4M,IAAI,KAAKA,CAAzB;AAAA,MAA4B0H,IAAI,KAAKA,CAArC;AACA,MAAIqN,KAAK1L,EAAEjW,CAAX;AAAA,MAAc4hB,KAAK3L,EAAErJ,CAArB;AAAA,MAAwBiV,KAAK5L,EAAE3B,CAA/B;AAAA,MAAkCwN,KAAK7L,EAAEjH,CAAzC;;AAEA;;AAEA,MAAI+S,KAAKD,KAAK9hB,CAAL,GAAS4hB,KAAKtN,CAAd,GAAkBuN,KAAKjV,CAAhC;AACA,MAAIoV,KAAKF,KAAKlV,CAAL,GAASiV,KAAK7hB,CAAd,GAAkB2hB,KAAKrN,CAAhC;AACA,MAAI2N,KAAKH,KAAKxN,CAAL,GAASqN,KAAK/U,CAAd,GAAkBgV,KAAK5hB,CAAhC;AACA,MAAIkiB,KAAK,CAAEP,EAAF,GAAO3hB,CAAP,GAAW4hB,KAAKhV,CAAhB,GAAoBiV,KAAKvN,CAAlC;;AAEA;;AAEA,OAAKtU,CAAL,GAAS+hB,KAAKD,EAAL,GAAUI,KAAK,CAAEP,EAAjB,GAAsBK,KAAK,CAAEH,EAA7B,GAAkCI,KAAK,CAAEL,EAAlD;AACA,OAAKhV,CAAL,GAASoV,KAAKF,EAAL,GAAUI,KAAK,CAAEN,EAAjB,GAAsBK,KAAK,CAAEN,EAA7B,GAAkCI,KAAK,CAAEF,EAAlD;AACA,OAAKvN,CAAL,GAAS2N,KAAKH,EAAL,GAAUI,KAAK,CAAEL,EAAjB,GAAsBE,KAAK,CAAEH,EAA7B,GAAkCI,KAAK,CAAEL,EAAlD;;AAEA,SAAO,IAAP;AAEA,EAnSgC;;AAqSjCQ,UAAS,YAAY;;AAEpB,MAAIjG,SAAS,IAAIzJ,OAAJ,EAAb;;AAEA,SAAO,SAAS0P,OAAT,CAAkBC,MAAlB,EAA2B;;AAEjClG,UAAO3F,gBAAP,CAAyB6L,OAAOC,gBAAhC,EAAkDnG,OAAOhD,UAAP,CAAmBkJ,OAAOE,WAA1B,CAAlD;AACA,UAAO,KAAK1J,YAAL,CAAmBsD,MAAnB,CAAP;AAEA,GALD;AAOA,EAXQ,EArSwB;;AAkTjCqG,YAAW,YAAY;;AAEtB,MAAIrG,SAAS,IAAIzJ,OAAJ,EAAb;;AAEA,SAAO,SAAS8P,SAAT,CAAoBH,MAApB,EAA6B;;AAEnClG,UAAO3F,gBAAP,CAAyB6L,OAAOE,WAAhC,EAA6CpG,OAAOhD,UAAP,CAAmBkJ,OAAOC,gBAA1B,CAA7C;AACA,UAAO,KAAKzJ,YAAL,CAAmBsD,MAAnB,CAAP;AAEA,GALD;AAOA,EAXU,EAlTsB;;AA+TjCsG,qBAAoB,UAAWnW,CAAX,EAAe;;AAElC;AACA;;AAEA,MAAIrM,IAAI,KAAKA,CAAb;AAAA,MAAgB4M,IAAI,KAAKA,CAAzB;AAAA,MAA4B0H,IAAI,KAAKA,CAArC;AACA,MAAIrE,IAAI5D,EAAE6D,QAAV;;AAEA,OAAKlQ,CAAL,GAASiQ,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,IAASqE,CAA5C;AACA,OAAK1H,CAAL,GAASqD,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,IAASqE,CAA5C;AACA,OAAKA,CAAL,GAASrE,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,EAAH,IAAUqE,CAA7C;;AAEA,SAAO,KAAKvD,SAAL,EAAP;AAEA,EA7UgC;;AA+UjCjB,SAAQ,UAAWhB,CAAX,EAAe;;AAEtB,OAAK9O,CAAL,IAAU8O,EAAE9O,CAAZ;AACA,OAAK4M,CAAL,IAAUkC,EAAElC,CAAZ;AACA,OAAK0H,CAAL,IAAUxF,EAAEwF,CAAZ;;AAEA,SAAO,IAAP;AAEA,EAvVgC;;AAyVjCvE,eAAc,UAAW1B,MAAX,EAAoB;;AAEjC,SAAO,KAAKwB,cAAL,CAAqB,IAAIxB,MAAzB,CAAP;AAEA,EA7VgC;;AA+VjCpC,MAAK,UAAW6C,CAAX,EAAe;;AAEnB,OAAK9O,CAAL,GAASP,KAAKwM,GAAL,CAAU,KAAKjM,CAAf,EAAkB8O,EAAE9O,CAApB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKwM,GAAL,CAAU,KAAKW,CAAf,EAAkBkC,EAAElC,CAApB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAKwM,GAAL,CAAU,KAAKqI,CAAf,EAAkBxF,EAAEwF,CAApB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAvWgC;;AAyWjCpI,MAAK,UAAW4C,CAAX,EAAe;;AAEnB,OAAK9O,CAAL,GAASP,KAAKyM,GAAL,CAAU,KAAKlM,CAAf,EAAkB8O,EAAE9O,CAApB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKyM,GAAL,CAAU,KAAKU,CAAf,EAAkBkC,EAAElC,CAApB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAKyM,GAAL,CAAU,KAAKoI,CAAf,EAAkBxF,EAAEwF,CAApB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAjXgC;;AAmXjCtI,QAAO,UAAWC,GAAX,EAAgBC,GAAhB,EAAsB;;AAE5B;;AAEA,OAAKlM,CAAL,GAASP,KAAKyM,GAAL,CAAUD,IAAIjM,CAAd,EAAiBP,KAAKwM,GAAL,CAAUC,IAAIlM,CAAd,EAAiB,KAAKA,CAAtB,CAAjB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKyM,GAAL,CAAUD,IAAIW,CAAd,EAAiBnN,KAAKwM,GAAL,CAAUC,IAAIU,CAAd,EAAiB,KAAKA,CAAtB,CAAjB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAKyM,GAAL,CAAUD,IAAIqI,CAAd,EAAiB7U,KAAKwM,GAAL,CAAUC,IAAIoI,CAAd,EAAiB,KAAKA,CAAtB,CAAjB,CAAT;;AAEA,SAAO,IAAP;AAEA,EA7XgC;;AA+XjCnE,cAAa,YAAY;;AAExB,MAAIlE,MAAM,IAAIuI,OAAJ,EAAV;AACA,MAAItI,MAAM,IAAIsI,OAAJ,EAAV;;AAEA,SAAO,SAASrE,WAAT,CAAsBC,MAAtB,EAA8BC,MAA9B,EAAuC;;AAE7CpE,OAAIiC,GAAJ,CAASkC,MAAT,EAAiBA,MAAjB,EAAyBA,MAAzB;AACAlE,OAAIgC,GAAJ,CAASmC,MAAT,EAAiBA,MAAjB,EAAyBA,MAAzB;;AAEA,UAAO,KAAKrE,KAAL,CAAYC,GAAZ,EAAiBC,GAAjB,CAAP;AAEA,GAPD;AASA,EAdY,EA/XoB;;AA+YjCoE,cAAa,UAAWrE,GAAX,EAAgBC,GAAhB,EAAsB;;AAElC,MAAIpL,SAAS,KAAKA,MAAL,EAAb;;AAEA,SAAO,KAAKiP,YAAL,CAAmBjP,UAAU,CAA7B,EAAiC+O,cAAjC,CAAiDpQ,KAAKyM,GAAL,CAAUD,GAAV,EAAexM,KAAKwM,GAAL,CAAUC,GAAV,EAAepL,MAAf,CAAf,CAAjD,CAAP;AAEA,EArZgC;;AAuZjChB,QAAO,YAAY;;AAElB,OAAKE,CAAL,GAASP,KAAKK,KAAL,CAAY,KAAKE,CAAjB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKK,KAAL,CAAY,KAAK8M,CAAjB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAKK,KAAL,CAAY,KAAKwU,CAAjB,CAAT;;AAEA,SAAO,IAAP;AAEA,EA/ZgC;;AAiajC1G,OAAM,YAAY;;AAEjB,OAAK5N,CAAL,GAASP,KAAKmO,IAAL,CAAW,KAAK5N,CAAhB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKmO,IAAL,CAAW,KAAKhB,CAAhB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAKmO,IAAL,CAAW,KAAK0G,CAAhB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAzagC;;AA2ajC/D,QAAO,YAAY;;AAElB,OAAKvQ,CAAL,GAASP,KAAK8Q,KAAL,CAAY,KAAKvQ,CAAjB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAK8Q,KAAL,CAAY,KAAK3D,CAAjB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAK8Q,KAAL,CAAY,KAAK+D,CAAjB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAnbgC;;AAqbjC9D,cAAa,YAAY;;AAExB,OAAKxQ,CAAL,GAAW,KAAKA,CAAL,GAAS,CAAX,GAAiBP,KAAKmO,IAAL,CAAW,KAAK5N,CAAhB,CAAjB,GAAuCP,KAAKK,KAAL,CAAY,KAAKE,CAAjB,CAAhD;AACA,OAAK4M,CAAL,GAAW,KAAKA,CAAL,GAAS,CAAX,GAAiBnN,KAAKmO,IAAL,CAAW,KAAKhB,CAAhB,CAAjB,GAAuCnN,KAAKK,KAAL,CAAY,KAAK8M,CAAjB,CAAhD;AACA,OAAK0H,CAAL,GAAW,KAAKA,CAAL,GAAS,CAAX,GAAiB7U,KAAKmO,IAAL,CAAW,KAAK0G,CAAhB,CAAjB,GAAuC7U,KAAKK,KAAL,CAAY,KAAKwU,CAAjB,CAAhD;;AAEA,SAAO,IAAP;AAEA,EA7bgC;;AA+bjC7D,SAAQ,YAAY;;AAEnB,OAAKzQ,CAAL,GAAS,CAAE,KAAKA,CAAhB;AACA,OAAK4M,CAAL,GAAS,CAAE,KAAKA,CAAhB;AACA,OAAK0H,CAAL,GAAS,CAAE,KAAKA,CAAhB;;AAEA,SAAO,IAAP;AAEA,EAvcgC;;AAycjC5D,MAAK,UAAW5B,CAAX,EAAe;;AAEnB,SAAO,KAAK9O,CAAL,GAAS8O,EAAE9O,CAAX,GAAe,KAAK4M,CAAL,GAASkC,EAAElC,CAA1B,GAA8B,KAAK0H,CAAL,GAASxF,EAAEwF,CAAhD;AAEA,EA7cgC;;AA+cjC;;AAEA3D,WAAU,YAAY;;AAErB,SAAO,KAAK3Q,CAAL,GAAS,KAAKA,CAAd,GAAkB,KAAK4M,CAAL,GAAS,KAAKA,CAAhC,GAAoC,KAAK0H,CAAL,GAAS,KAAKA,CAAzD;AAEA,EArdgC;;AAudjCxT,SAAQ,YAAY;;AAEnB,SAAOrB,KAAKmR,IAAL,CAAW,KAAK5Q,CAAL,GAAS,KAAKA,CAAd,GAAkB,KAAK4M,CAAL,GAAS,KAAKA,CAAhC,GAAoC,KAAK0H,CAAL,GAAS,KAAKA,CAA7D,CAAP;AAEA,EA3dgC;;AA6djCzD,kBAAiB,YAAY;;AAE5B,SAAOpR,KAAKqR,GAAL,CAAU,KAAK9Q,CAAf,IAAqBP,KAAKqR,GAAL,CAAU,KAAKlE,CAAf,CAArB,GAA0CnN,KAAKqR,GAAL,CAAU,KAAKwD,CAAf,CAAjD;AAEA,EAjegC;;AAmejCvD,YAAW,YAAY;;AAEtB,SAAO,KAAKhB,YAAL,CAAmB,KAAKjP,MAAL,MAAiB,CAApC,CAAP;AAEA,EAvegC;;AAyejCyQ,YAAW,UAAWzQ,MAAX,EAAoB;;AAE9B,SAAO,KAAKiQ,SAAL,GAAiBlB,cAAjB,CAAiC/O,MAAjC,CAAP;AAEA,EA7egC;;AA+ejC6L,OAAM,UAAWmC,CAAX,EAAc0C,KAAd,EAAsB;;AAE3B,OAAKxR,CAAL,IAAU,CAAE8O,EAAE9O,CAAF,GAAM,KAAKA,CAAb,IAAmBwR,KAA7B;AACA,OAAK5E,CAAL,IAAU,CAAEkC,EAAElC,CAAF,GAAM,KAAKA,CAAb,IAAmB4E,KAA7B;AACA,OAAK8C,CAAL,IAAU,CAAExF,EAAEwF,CAAF,GAAM,KAAKA,CAAb,IAAmB9C,KAA7B;;AAEA,SAAO,IAAP;AAEA,EAvfgC;;AAyfjCC,cAAa,UAAWC,EAAX,EAAeC,EAAf,EAAmBH,KAAnB,EAA2B;;AAEvC,SAAO,KAAK9B,UAAL,CAAiBiC,EAAjB,EAAqBD,EAArB,EAA0B7B,cAA1B,CAA0C2B,KAA1C,EAAkDzC,GAAlD,CAAuD2C,EAAvD,CAAP;AAEA,EA7fgC;;AA+fjC+Q,QAAO,UAAW3T,CAAX,EAAcE,CAAd,EAAkB;;AAExB,MAAKA,MAAMxP,SAAX,EAAuB;;AAEtByP,WAAQC,IAAR,CAAc,2FAAd;AACA,UAAO,KAAKoH,YAAL,CAAmBxH,CAAnB,EAAsBE,CAAtB,CAAP;AAEA;;AAED,SAAO,KAAKsH,YAAL,CAAmB,IAAnB,EAAyBxH,CAAzB,CAAP;AAEA,EA1gBgC;;AA4gBjCwH,eAAc,UAAWhH,CAAX,EAAcC,CAAd,EAAkB;;AAE/B,MAAImT,KAAKpT,EAAEtP,CAAX;AAAA,MAAc2iB,KAAKrT,EAAE1C,CAArB;AAAA,MAAwBgW,KAAKtT,EAAEgF,CAA/B;AACA,MAAIuO,KAAKtT,EAAEvP,CAAX;AAAA,MAAc8iB,KAAKvT,EAAE3C,CAArB;AAAA,MAAwBmW,KAAKxT,EAAE+E,CAA/B;;AAEA,OAAKtU,CAAL,GAAS2iB,KAAKI,EAAL,GAAUH,KAAKE,EAAxB;AACA,OAAKlW,CAAL,GAASgW,KAAKC,EAAL,GAAUH,KAAKK,EAAxB;AACA,OAAKzO,CAAL,GAASoO,KAAKI,EAAL,GAAUH,KAAKE,EAAxB;;AAEA,SAAO,IAAP;AAEA,EAvhBgC;;AAyhBjCG,kBAAiB,UAAW/G,MAAX,EAAoB;;AAEpC,MAAI5N,SAAS4N,OAAOvL,GAAP,CAAY,IAAZ,IAAqBuL,OAAOtL,QAAP,EAAlC;;AAEA,SAAO,KAAK9B,IAAL,CAAWoN,MAAX,EAAoBpM,cAApB,CAAoCxB,MAApC,CAAP;AAEA,EA/hBgC;;AAiiBjC4U,iBAAgB,YAAY;;AAE3B,MAAIvR,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASyO,cAAT,CAAyBC,WAAzB,EAAuC;;AAE7CxR,MAAG7C,IAAH,CAAS,IAAT,EAAgBmU,eAAhB,CAAiCE,WAAjC;;AAEA,UAAO,KAAKzT,GAAL,CAAUiC,EAAV,CAAP;AAEA,GAND;AAQA,EAZe,EAjiBiB;;AA+iBjCyR,UAAS,YAAY;;AAEpB;AACA;;AAEA,MAAIzR,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAAS2O,OAAT,CAAkBC,MAAlB,EAA2B;;AAEjC,UAAO,KAAK3T,GAAL,CAAUiC,GAAG7C,IAAH,CAASuU,MAAT,EAAkBvT,cAAlB,CAAkC,IAAI,KAAKa,GAAL,CAAU0S,MAAV,CAAtC,CAAV,CAAP;AAEA,GAJD;AAMA,EAbQ,EA/iBwB;;AA8jBjCC,UAAS,UAAWvU,CAAX,EAAe;;AAEvB,MAAIoL,QAAQ,KAAKxJ,GAAL,CAAU5B,CAAV,IAAkBrP,KAAKmR,IAAL,CAAW,KAAKD,QAAL,KAAkB7B,EAAE6B,QAAF,EAA7B,CAA9B;;AAEA;;AAEA,SAAOlR,KAAK6jB,IAAL,CAAWnY,MAAMa,KAAN,CAAakO,KAAb,EAAoB,CAAE,CAAtB,EAAyB,CAAzB,CAAX,CAAP;AAEA,EAtkBgC;;AAwkBjChJ,aAAY,UAAWpC,CAAX,EAAe;;AAE1B,SAAOrP,KAAKmR,IAAL,CAAW,KAAKO,iBAAL,CAAwBrC,CAAxB,CAAX,CAAP;AAEA,EA5kBgC;;AA8kBjCqC,oBAAmB,UAAWrC,CAAX,EAAe;;AAEjC,MAAIsC,KAAK,KAAKpR,CAAL,GAAS8O,EAAE9O,CAApB;AAAA,MAAuBqR,KAAK,KAAKzE,CAAL,GAASkC,EAAElC,CAAvC;AAAA,MAA0C2W,KAAK,KAAKjP,CAAL,GAASxF,EAAEwF,CAA1D;;AAEA,SAAOlD,KAAKA,EAAL,GAAUC,KAAKA,EAAf,GAAoBkS,KAAKA,EAAhC;AAEA,EAplBgC;;AAslBjCjS,sBAAqB,UAAWxC,CAAX,EAAe;;AAEnC,SAAOrP,KAAKqR,GAAL,CAAU,KAAK9Q,CAAL,GAAS8O,EAAE9O,CAArB,IAA2BP,KAAKqR,GAAL,CAAU,KAAKlE,CAAL,GAASkC,EAAElC,CAArB,CAA3B,GAAsDnN,KAAKqR,GAAL,CAAU,KAAKwD,CAAL,GAASxF,EAAEwF,CAArB,CAA7D;AAEA,EA1lBgC;;AA4lBjCkP,mBAAkB,UAAWnU,CAAX,EAAe;;AAEhC,MAAIoU,eAAehkB,KAAK+S,GAAL,CAAUnD,EAAEqU,GAAZ,IAAoBrU,EAAEsU,MAAzC;;AAEA,OAAK3jB,CAAL,GAASyjB,eAAehkB,KAAK+S,GAAL,CAAUnD,EAAE6K,KAAZ,CAAxB;AACA,OAAKtN,CAAL,GAASnN,KAAK8S,GAAL,CAAUlD,EAAEqU,GAAZ,IAAoBrU,EAAEsU,MAA/B;AACA,OAAKrP,CAAL,GAASmP,eAAehkB,KAAK8S,GAAL,CAAUlD,EAAE6K,KAAZ,CAAxB;;AAEA,SAAO,IAAP;AAEA,EAtmBgC;;AAwmBjC0J,qBAAoB,UAAWtR,CAAX,EAAe;;AAElC,OAAKtS,CAAL,GAASsS,EAAEqR,MAAF,GAAWlkB,KAAK+S,GAAL,CAAUF,EAAE4H,KAAZ,CAApB;AACA,OAAKtN,CAAL,GAAS0F,EAAE1F,CAAX;AACA,OAAK0H,CAAL,GAAShC,EAAEqR,MAAF,GAAWlkB,KAAK8S,GAAL,CAAUD,EAAE4H,KAAZ,CAApB;;AAEA,SAAO,IAAP;AAEA,EAhnBgC;;AAknBjC2J,wBAAuB,UAAWxX,CAAX,EAAe;;AAErC,MAAI4D,IAAI5D,EAAE6D,QAAV;;AAEA,OAAKlQ,CAAL,GAASiQ,EAAG,EAAH,CAAT;AACA,OAAKrD,CAAL,GAASqD,EAAG,EAAH,CAAT;AACA,OAAKqE,CAAL,GAASrE,EAAG,EAAH,CAAT;;AAEA,SAAO,IAAP;AAEA,EA5nBgC;;AA8nBjC6T,qBAAoB,UAAWzX,CAAX,EAAe;;AAElC,MAAIwP,KAAK,KAAKzH,mBAAL,CAA0B/H,CAA1B,EAA6B,CAA7B,EAAiCvL,MAAjC,EAAT;AACA,MAAIgb,KAAK,KAAK1H,mBAAL,CAA0B/H,CAA1B,EAA6B,CAA7B,EAAiCvL,MAAjC,EAAT;AACA,MAAIib,KAAK,KAAK3H,mBAAL,CAA0B/H,CAA1B,EAA6B,CAA7B,EAAiCvL,MAAjC,EAAT;;AAEA,OAAKd,CAAL,GAAS6b,EAAT;AACA,OAAKjP,CAAL,GAASkP,EAAT;AACA,OAAKxH,CAAL,GAASyH,EAAT;;AAEA,SAAO,IAAP;AAEA,EA1oBgC;;AA4oBjC3H,sBAAqB,UAAW/H,CAAX,EAAczL,KAAd,EAAsB;;AAE1C,SAAO,KAAKiR,SAAL,CAAgBxF,EAAE6D,QAAlB,EAA4BtP,QAAQ,CAApC,CAAP;AAEA,EAhpBgC;;AAkpBjCgR,SAAQ,UAAW9C,CAAX,EAAe;;AAEtB,SAAWA,EAAE9O,CAAF,KAAQ,KAAKA,CAAf,IAAwB8O,EAAElC,CAAF,KAAQ,KAAKA,CAArC,IAA8CkC,EAAEwF,CAAF,KAAQ,KAAKA,CAApE;AAEA,EAtpBgC;;AAwpBjCzC,YAAW,UAAW5P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAErC,MAAKA,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,OAAK9R,CAAL,GAASiC,MAAO6P,MAAP,CAAT;AACA,OAAKlF,CAAL,GAAS3K,MAAO6P,SAAS,CAAhB,CAAT;AACA,OAAKwC,CAAL,GAASrS,MAAO6P,SAAS,CAAhB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAlqBgC;;AAoqBjCC,UAAS,UAAW9P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEnC,MAAK7P,UAAUzC,SAAf,EAA2ByC,QAAQ,EAAR;AAC3B,MAAK6P,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B7P,QAAO6P,MAAP,IAAkB,KAAK9R,CAAvB;AACAiC,QAAO6P,SAAS,CAAhB,IAAsB,KAAKlF,CAA3B;AACA3K,QAAO6P,SAAS,CAAhB,IAAsB,KAAKwC,CAA3B;;AAEA,SAAOrS,KAAP;AAEA,EA/qBgC;;AAirBjC+P,sBAAqB,UAAWC,SAAX,EAAsBrR,KAAtB,EAA6BkR,MAA7B,EAAsC;;AAE1D,MAAKA,WAAWtS,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,qEAAd;AAEA;;AAED,OAAKlP,CAAL,GAASiS,UAAUC,IAAV,CAAgBtR,KAAhB,CAAT;AACA,OAAKgM,CAAL,GAASqF,UAAUE,IAAV,CAAgBvR,KAAhB,CAAT;AACA,OAAK0T,CAAL,GAASrC,UAAU0G,IAAV,CAAgB/X,KAAhB,CAAT;;AAEA,SAAO,IAAP;AAEA;;AA/rBgC,CAAlC;;AAmsBA;;;;;;;AAOA,SAASmjB,OAAT,GAAmB;;AAElB,MAAK7T,QAAL,GAAgB,CAEf,CAFe,EAEZ,CAFY,EAET,CAFS,EAGf,CAHe,EAGZ,CAHY,EAGT,CAHS,EAIf,CAJe,EAIZ,CAJY,EAIT,CAJS,CAAhB;;AAQA,KAAKrP,UAAUC,MAAV,GAAmB,CAAxB,EAA4B;;AAE3BmO,UAAQyD,KAAR,CAAe,+EAAf;AAEA;AAED;;AAEDvS,OAAOK,MAAP,CAAeujB,QAAQ7jB,SAAvB,EAAkC;;AAEjC8jB,YAAW,IAFsB;;AAIjC9V,MAAK,UAAW0E,GAAX,EAAgBC,GAAhB,EAAqBC,GAArB,EAA0BE,GAA1B,EAA+BC,GAA/B,EAAoCC,GAApC,EAAyCE,GAAzC,EAA8CC,GAA9C,EAAmDC,GAAnD,EAAyD;;AAE7D,MAAIM,KAAK,KAAK1D,QAAd;;AAEA0D,KAAI,CAAJ,IAAUhB,GAAV,CAAegB,GAAI,CAAJ,IAAUZ,GAAV,CAAeY,GAAI,CAAJ,IAAUR,GAAV;AAC9BQ,KAAI,CAAJ,IAAUf,GAAV,CAAee,GAAI,CAAJ,IAAUX,GAAV,CAAeW,GAAI,CAAJ,IAAUP,GAAV;AAC9BO,KAAI,CAAJ,IAAUd,GAAV,CAAec,GAAI,CAAJ,IAAUV,GAAV,CAAeU,GAAI,CAAJ,IAAUN,GAAV;;AAE9B,SAAO,IAAP;AAEA,EAdgC;;AAgBjCO,WAAU,YAAY;;AAErB,OAAK3F,GAAL,CAEC,CAFD,EAEI,CAFJ,EAEO,CAFP,EAGC,CAHD,EAGI,CAHJ,EAGO,CAHP,EAIC,CAJD,EAII,CAJJ,EAIO,CAJP;;AAQA,SAAO,IAAP;AAEA,EA5BgC;;AA8BjCS,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBiD,SAAvB,CAAkC,KAAK3B,QAAvC,CAAP;AAEA,EAlCgC;;AAoCjCrB,OAAM,UAAWxC,CAAX,EAAe;;AAEpB,MAAIuH,KAAK,KAAK1D,QAAd;AACA,MAAI4D,KAAKzH,EAAE6D,QAAX;;AAEA0D,KAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV;AACtCF,KAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV;AACtCF,KAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV,CAAmBF,GAAI,CAAJ,IAAUE,GAAI,CAAJ,CAAV;;AAEtC,SAAO,IAAP;AAEA,EA/CgC;;AAiDjCmQ,iBAAgB,UAAW5X,CAAX,EAAe;;AAE9B,MAAIyH,KAAKzH,EAAE6D,QAAX;;AAEA,OAAKhC,GAAL,CAEC4F,GAAI,CAAJ,CAFD,EAEUA,GAAI,CAAJ,CAFV,EAEmBA,GAAI,CAAJ,CAFnB,EAGCA,GAAI,CAAJ,CAHD,EAGUA,GAAI,CAAJ,CAHV,EAGmBA,GAAI,CAAJ,CAHnB,EAICA,GAAI,CAAJ,CAJD,EAIUA,GAAI,CAAJ,CAJV,EAImBA,GAAI,EAAJ,CAJnB;;AAQA,SAAO,IAAP;AAEA,EA/DgC;;AAiEjC2E,yBAAwB,YAAY;;AAEnC,MAAI/G,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASiE,sBAAT,CAAiCxG,SAAjC,EAA6C;;AAEnD,QAAM,IAAI9P,IAAI,CAAR,EAAWC,IAAI6P,UAAUyG,KAA/B,EAAsCvW,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDuP,OAAG1R,CAAH,GAAOiS,UAAUC,IAAV,CAAgB/P,CAAhB,CAAP;AACAuP,OAAG9E,CAAH,GAAOqF,UAAUE,IAAV,CAAgBhQ,CAAhB,CAAP;AACAuP,OAAG4C,CAAH,GAAOrC,UAAU0G,IAAV,CAAgBxW,CAAhB,CAAP;;AAEAuP,OAAG1B,YAAH,CAAiB,IAAjB;;AAEAiC,cAAU4G,MAAV,CAAkB1W,CAAlB,EAAqBuP,GAAG1R,CAAxB,EAA2B0R,GAAG9E,CAA9B,EAAiC8E,GAAG4C,CAApC;AAEA;;AAED,UAAOrC,SAAP;AAEA,GAhBD;AAkBA,EAtBuB,EAjES;;AAyFjCrC,WAAU,UAAWvD,CAAX,EAAe;;AAExB,SAAO,KAAKkK,gBAAL,CAAuB,IAAvB,EAA6BlK,CAA7B,CAAP;AAEA,EA7FgC;;AA+FjCmK,cAAa,UAAWnK,CAAX,EAAe;;AAE3B,SAAO,KAAKkK,gBAAL,CAAuBlK,CAAvB,EAA0B,IAA1B,CAAP;AAEA,EAnGgC;;AAqGjCkK,mBAAkB,UAAWjH,CAAX,EAAcC,CAAd,EAAkB;;AAEnC,MAAI2F,KAAK5F,EAAEY,QAAX;AACA,MAAIkF,KAAK7F,EAAEW,QAAX;AACA,MAAI0D,KAAK,KAAK1D,QAAd;;AAEA,MAAIuG,MAAMvB,GAAI,CAAJ,CAAV;AAAA,MAAmBwB,MAAMxB,GAAI,CAAJ,CAAzB;AAAA,MAAkCyB,MAAMzB,GAAI,CAAJ,CAAxC;AACA,MAAI2B,MAAM3B,GAAI,CAAJ,CAAV;AAAA,MAAmB4B,MAAM5B,GAAI,CAAJ,CAAzB;AAAA,MAAkC6B,MAAM7B,GAAI,CAAJ,CAAxC;AACA,MAAI+B,MAAM/B,GAAI,CAAJ,CAAV;AAAA,MAAmBgC,MAAMhC,GAAI,CAAJ,CAAzB;AAAA,MAAkCiC,MAAMjC,GAAI,CAAJ,CAAxC;;AAEA,MAAIuC,MAAMrC,GAAI,CAAJ,CAAV;AAAA,MAAmBsC,MAAMtC,GAAI,CAAJ,CAAzB;AAAA,MAAkCuC,MAAMvC,GAAI,CAAJ,CAAxC;AACA,MAAIyC,MAAMzC,GAAI,CAAJ,CAAV;AAAA,MAAmB0C,MAAM1C,GAAI,CAAJ,CAAzB;AAAA,MAAkC2C,MAAM3C,GAAI,CAAJ,CAAxC;AACA,MAAI6C,MAAM7C,GAAI,CAAJ,CAAV;AAAA,MAAmB8C,MAAM9C,GAAI,CAAJ,CAAzB;AAAA,MAAkC+C,MAAM/C,GAAI,CAAJ,CAAxC;;AAEAxB,KAAI,CAAJ,IAAU6C,MAAMgB,GAAN,GAAYf,MAAMmB,GAAlB,GAAwBlB,MAAMsB,GAAxC;AACArE,KAAI,CAAJ,IAAU6C,MAAMiB,GAAN,GAAYhB,MAAMoB,GAAlB,GAAwBnB,MAAMuB,GAAxC;AACAtE,KAAI,CAAJ,IAAU6C,MAAMkB,GAAN,GAAYjB,MAAMqB,GAAlB,GAAwBpB,MAAMwB,GAAxC;;AAEAvE,KAAI,CAAJ,IAAUiD,MAAMY,GAAN,GAAYX,MAAMe,GAAlB,GAAwBd,MAAMkB,GAAxC;AACArE,KAAI,CAAJ,IAAUiD,MAAMa,GAAN,GAAYZ,MAAMgB,GAAlB,GAAwBf,MAAMmB,GAAxC;AACAtE,KAAI,CAAJ,IAAUiD,MAAMc,GAAN,GAAYb,MAAMiB,GAAlB,GAAwBhB,MAAMoB,GAAxC;;AAEAvE,KAAI,CAAJ,IAAUqD,MAAMQ,GAAN,GAAYP,MAAMW,GAAlB,GAAwBV,MAAMc,GAAxC;AACArE,KAAI,CAAJ,IAAUqD,MAAMS,GAAN,GAAYR,MAAMY,GAAlB,GAAwBX,MAAMe,GAAxC;AACAtE,KAAI,CAAJ,IAAUqD,MAAMU,GAAN,GAAYT,MAAMa,GAAlB,GAAwBZ,MAAMgB,GAAxC;;AAEA,SAAO,IAAP;AAEA,EAjIgC;;AAmIjCtI,iBAAgB,UAAWR,CAAX,EAAe;;AAE9B,MAAIuE,KAAK,KAAK1D,QAAd;;AAEA0D,KAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX;AAC5BuE,KAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX;AAC5BuE,KAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX,CAAcuE,GAAI,CAAJ,KAAWvE,CAAX;;AAE5B,SAAO,IAAP;AAEA,EA7IgC;;AA+IjCyJ,cAAa,YAAY;;AAExB,MAAIlF,KAAK,KAAK1D,QAAd;;AAEA,MAAIZ,IAAIsE,GAAI,CAAJ,CAAR;AAAA,MAAiBrE,IAAIqE,GAAI,CAAJ,CAArB;AAAA,MAA8BtB,IAAIsB,GAAI,CAAJ,CAAlC;AAAA,MACCmB,IAAInB,GAAI,CAAJ,CADL;AAAA,MACc3D,IAAI2D,GAAI,CAAJ,CADlB;AAAA,MAC2BoB,IAAIpB,GAAI,CAAJ,CAD/B;AAAA,MAECsQ,IAAItQ,GAAI,CAAJ,CAFL;AAAA,MAEcmJ,IAAInJ,GAAI,CAAJ,CAFlB;AAAA,MAE2BzR,IAAIyR,GAAI,CAAJ,CAF/B;;AAIA,SAAOtE,IAAIW,CAAJ,GAAQ9N,CAAR,GAAYmN,IAAI0F,CAAJ,GAAQ+H,CAApB,GAAwBxN,IAAIwF,CAAJ,GAAQ5S,CAAhC,GAAoCoN,IAAIyF,CAAJ,GAAQkP,CAA5C,GAAgD5R,IAAIyC,CAAJ,GAAQgI,CAAxD,GAA4DzK,IAAIrC,CAAJ,GAAQiU,CAA3E;AAEA,EAzJgC;;AA2JjChL,aAAY,UAAWgD,MAAX,EAAmB/C,iBAAnB,EAAuC;;AAElD,MAAK+C,UAAUA,OAAOvJ,SAAtB,EAAkC;;AAEjC1D,WAAQyD,KAAR,CAAe,kEAAf;AAEA;;AAED,MAAIoB,KAAKoI,OAAOhM,QAAhB;AAAA,MACC0D,KAAK,KAAK1D,QADX;AAAA,MAGC0C,MAAMkB,GAAI,CAAJ,CAHP;AAAA,MAGgBd,MAAMc,GAAI,CAAJ,CAHtB;AAAA,MAG+BV,MAAMU,GAAI,CAAJ,CAHrC;AAAA,MAICjB,MAAMiB,GAAI,CAAJ,CAJP;AAAA,MAIgBb,MAAMa,GAAI,CAAJ,CAJtB;AAAA,MAI+BT,MAAMS,GAAI,CAAJ,CAJrC;AAAA,MAKChB,MAAMgB,GAAI,CAAJ,CALP;AAAA,MAKgBZ,MAAMY,GAAI,CAAJ,CALtB;AAAA,MAK+BR,MAAMQ,GAAI,CAAJ,CALrC;AAAA,MAOCsF,MAAM9F,MAAML,GAAN,GAAYI,MAAMH,GAPzB;AAAA,MAQCmG,MAAMhG,MAAMP,GAAN,GAAYQ,MAAMT,GARzB;AAAA,MASCyG,MAAMpG,MAAML,GAAN,GAAYI,MAAMH,GATzB;AAAA,MAWC0G,MAAM5G,MAAMwG,GAAN,GAAYpG,MAAMqG,GAAlB,GAAwBjG,MAAMkG,GAXrC;;AAaA,MAAKE,QAAQ,CAAb,EAAiB;;AAEhB,OAAIC,MAAM,oEAAV;;AAEA,OAAKN,sBAAsB,IAA3B,EAAkC;;AAEjC,UAAM,IAAI1K,KAAJ,CAAWgL,GAAX,CAAN;AAEA,IAJD,MAIO;;AAENxK,YAAQC,IAAR,CAAcuK,GAAd;AAEA;;AAED,UAAO,KAAK5F,QAAL,EAAP;AAEA;;AAED,MAAI6F,SAAS,IAAIF,GAAjB;;AAEA5F,KAAI,CAAJ,IAAUwF,MAAMM,MAAhB;AACA9F,KAAI,CAAJ,IAAU,CAAER,MAAMF,GAAN,GAAYI,MAAMN,GAApB,IAA4B0G,MAAtC;AACA9F,KAAI,CAAJ,IAAU,CAAEP,MAAML,GAAN,GAAYI,MAAMH,GAApB,IAA4ByG,MAAtC;;AAEA9F,KAAI,CAAJ,IAAUyF,MAAMK,MAAhB;AACA9F,KAAI,CAAJ,IAAU,CAAEN,MAAMV,GAAN,GAAYQ,MAAMN,GAApB,IAA4B4G,MAAtC;AACA9F,KAAI,CAAJ,IAAU,CAAER,MAAMP,GAAN,GAAYQ,MAAMT,GAApB,IAA4B8G,MAAtC;;AAEA9F,KAAI,CAAJ,IAAU0F,MAAMI,MAAhB;AACA9F,KAAI,CAAJ,IAAU,CAAEZ,MAAMF,GAAN,GAAYI,MAAMN,GAApB,IAA4B8G,MAAtC;AACA9F,KAAI,CAAJ,IAAU,CAAEX,MAAML,GAAN,GAAYI,MAAMH,GAApB,IAA4B6G,MAAtC;;AAEA,SAAO,IAAP;AAEA,EAlNgC;;AAoNjCX,YAAW,YAAY;;AAEtB,MAAIC,GAAJ;AAAA,MAAS3M,IAAI,KAAK6D,QAAlB;;AAEA8I,QAAM3M,EAAG,CAAH,CAAN,CAAcA,EAAG,CAAH,IAASA,EAAG,CAAH,CAAT,CAAiBA,EAAG,CAAH,IAAS2M,GAAT;AAC/BA,QAAM3M,EAAG,CAAH,CAAN,CAAcA,EAAG,CAAH,IAASA,EAAG,CAAH,CAAT,CAAiBA,EAAG,CAAH,IAAS2M,GAAT;AAC/BA,QAAM3M,EAAG,CAAH,CAAN,CAAcA,EAAG,CAAH,IAASA,EAAG,CAAH,CAAT,CAAiBA,EAAG,CAAH,IAAS2M,GAAT;;AAE/B,SAAO,IAAP;AAEA,EA9NgC;;AAgOjCmL,kBAAiB,UAAWC,OAAX,EAAqB;;AAErC,SAAO,KAAKH,cAAL,CAAqBG,OAArB,EAA+BlL,UAA/B,CAA2C,IAA3C,EAAkDH,SAAlD,EAAP;AAEA,EApOgC;;AAsOjCsL,qBAAoB,UAAWtE,CAAX,EAAe;;AAElC,MAAI1T,IAAI,KAAK6D,QAAb;;AAEA6P,IAAG,CAAH,IAAS1T,EAAG,CAAH,CAAT;AACA0T,IAAG,CAAH,IAAS1T,EAAG,CAAH,CAAT;AACA0T,IAAG,CAAH,IAAS1T,EAAG,CAAH,CAAT;AACA0T,IAAG,CAAH,IAAS1T,EAAG,CAAH,CAAT;AACA0T,IAAG,CAAH,IAAS1T,EAAG,CAAH,CAAT;AACA0T,IAAG,CAAH,IAAS1T,EAAG,CAAH,CAAT;AACA0T,IAAG,CAAH,IAAS1T,EAAG,CAAH,CAAT;AACA0T,IAAG,CAAH,IAAS1T,EAAG,CAAH,CAAT;AACA0T,IAAG,CAAH,IAAS1T,EAAG,CAAH,CAAT;;AAEA,SAAO,IAAP;AAEA,EAtPgC;;AAwPjCiY,iBAAgB,UAAW/J,EAAX,EAAeC,EAAf,EAAmBqB,EAAnB,EAAuBC,EAAvB,EAA2ByI,QAA3B,EAAqCC,EAArC,EAAyCC,EAAzC,EAA8C;;AAE7D,MAAInS,IAAI7S,KAAK8S,GAAL,CAAUgS,QAAV,CAAR;AACA,MAAIlV,IAAI5P,KAAK+S,GAAL,CAAU+R,QAAV,CAAR;;AAEA,OAAKrW,GAAL,CACC2N,KAAKvJ,CADN,EACSuJ,KAAKxM,CADd,EACiB,CAAEwM,EAAF,IAASvJ,IAAIkS,EAAJ,GAASnV,IAAIoV,EAAtB,IAA6BD,EAA7B,GAAkCjK,EADnD,EAEC,CAAEuB,EAAF,GAAOzM,CAFR,EAEWyM,KAAKxJ,CAFhB,EAEmB,CAAEwJ,EAAF,IAAS,CAAEzM,CAAF,GAAMmV,EAAN,GAAWlS,IAAImS,EAAxB,IAA+BA,EAA/B,GAAoCjK,EAFvD,EAGC,CAHD,EAGI,CAHJ,EAGO,CAHP;AAMA,EAnQgC;;AAqQjCb,QAAO,UAAWkC,EAAX,EAAeC,EAAf,EAAoB;;AAE1B,MAAIlI,KAAK,KAAK1D,QAAd;;AAEA0D,KAAI,CAAJ,KAAWiI,EAAX,CAAejI,GAAI,CAAJ,KAAWiI,EAAX,CAAejI,GAAI,CAAJ,KAAWiI,EAAX;AAC9BjI,KAAI,CAAJ,KAAWkI,EAAX,CAAelI,GAAI,CAAJ,KAAWkI,EAAX,CAAelI,GAAI,CAAJ,KAAWkI,EAAX;;AAE9B,SAAO,IAAP;AAEA,EA9QgC;;AAgRjC4I,SAAQ,UAAWxK,KAAX,EAAmB;;AAE1B,MAAI5H,IAAI7S,KAAK8S,GAAL,CAAU2H,KAAV,CAAR;AACA,MAAI7K,IAAI5P,KAAK+S,GAAL,CAAU0H,KAAV,CAAR;;AAEA,MAAItG,KAAK,KAAK1D,QAAd;;AAEA,MAAIuG,MAAM7C,GAAI,CAAJ,CAAV;AAAA,MAAmB8C,MAAM9C,GAAI,CAAJ,CAAzB;AAAA,MAAkC+C,MAAM/C,GAAI,CAAJ,CAAxC;AACA,MAAIiD,MAAMjD,GAAI,CAAJ,CAAV;AAAA,MAAmBkD,MAAMlD,GAAI,CAAJ,CAAzB;AAAA,MAAkCmD,MAAMnD,GAAI,CAAJ,CAAxC;;AAEAA,KAAI,CAAJ,IAAUtB,IAAImE,GAAJ,GAAUpH,IAAIwH,GAAxB;AACAjD,KAAI,CAAJ,IAAUtB,IAAIoE,GAAJ,GAAUrH,IAAIyH,GAAxB;AACAlD,KAAI,CAAJ,IAAUtB,IAAIqE,GAAJ,GAAUtH,IAAI0H,GAAxB;;AAEAnD,KAAI,CAAJ,IAAU,CAAEvE,CAAF,GAAMoH,GAAN,GAAYnE,IAAIuE,GAA1B;AACAjD,KAAI,CAAJ,IAAU,CAAEvE,CAAF,GAAMqH,GAAN,GAAYpE,IAAIwE,GAA1B;AACAlD,KAAI,CAAJ,IAAU,CAAEvE,CAAF,GAAMsH,GAAN,GAAYrE,IAAIyE,GAA1B;;AAEA,SAAO,IAAP;AAEA,EApSgC;;AAsSjC4N,YAAW,UAAWpK,EAAX,EAAeC,EAAf,EAAoB;;AAE9B,MAAI5G,KAAK,KAAK1D,QAAd;;AAEA0D,KAAI,CAAJ,KAAW2G,KAAK3G,GAAI,CAAJ,CAAhB,CAAyBA,GAAI,CAAJ,KAAW2G,KAAK3G,GAAI,CAAJ,CAAhB,CAAyBA,GAAI,CAAJ,KAAW2G,KAAK3G,GAAI,CAAJ,CAAhB;AAClDA,KAAI,CAAJ,KAAW4G,KAAK5G,GAAI,CAAJ,CAAhB,CAAyBA,GAAI,CAAJ,KAAW4G,KAAK5G,GAAI,CAAJ,CAAhB,CAAyBA,GAAI,CAAJ,KAAW4G,KAAK5G,GAAI,CAAJ,CAAhB;;AAElD,SAAO,IAAP;AAEA,EA/SgC;;AAiTjChC,SAAQ,UAAWsK,MAAX,EAAoB;;AAE3B,MAAItI,KAAK,KAAK1D,QAAd;AACA,MAAI4D,KAAKoI,OAAOhM,QAAhB;;AAEA,OAAM,IAAI/N,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B,OAAKyR,GAAIzR,CAAJ,MAAY2R,GAAI3R,CAAJ,CAAjB,EAA2B,OAAO,KAAP;AAE3B;;AAED,SAAO,IAAP;AAEA,EA9TgC;;AAgUjC0P,YAAW,UAAW5P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAErC,MAAKA,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,OAAM,IAAI3P,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B,QAAK+N,QAAL,CAAe/N,CAAf,IAAqBF,MAAOE,IAAI2P,MAAX,CAArB;AAEA;;AAED,SAAO,IAAP;AAEA,EA5UgC;;AA8UjCC,UAAS,UAAW9P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEnC,MAAK7P,UAAUzC,SAAf,EAA2ByC,QAAQ,EAAR;AAC3B,MAAK6P,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,MAAI8B,KAAK,KAAK1D,QAAd;;AAEAjO,QAAO6P,MAAP,IAAkB8B,GAAI,CAAJ,CAAlB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;;AAEA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;;AAEA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;AACA3R,QAAO6P,SAAS,CAAhB,IAAsB8B,GAAI,CAAJ,CAAtB;;AAEA,SAAO3R,KAAP;AAEA;;AAnWgC,CAAlC;;AAuWA;;;;;;AAMA,IAAI2iB,YAAY,CAAhB;;AAEA,SAASC,OAAT,CAAkBC,KAAlB,EAAyBC,OAAzB,EAAkCC,KAAlC,EAAyCC,KAAzC,EAAgDC,SAAhD,EAA2DC,SAA3D,EAAsEC,MAAtE,EAA8E/jB,IAA9E,EAAoFgkB,UAApF,EAAgGC,QAAhG,EAA2G;;AAE1GnlB,QAAOC,cAAP,CAAuB,IAAvB,EAA6B,IAA7B,EAAmC,EAAER,OAAOglB,WAAT,EAAnC;;AAEA,MAAK9Y,IAAL,GAAYX,MAAMI,YAAN,EAAZ;;AAEA,MAAKga,IAAL,GAAY,EAAZ;;AAEA,MAAKT,KAAL,GAAaA,UAAUtlB,SAAV,GAAsBslB,KAAtB,GAA8BD,QAAQW,aAAnD;AACA,MAAKC,OAAL,GAAe,EAAf;;AAEA,MAAKV,OAAL,GAAeA,YAAYvlB,SAAZ,GAAwBulB,OAAxB,GAAkCF,QAAQa,eAAzD;;AAEA,MAAKV,KAAL,GAAaA,UAAUxlB,SAAV,GAAsBwlB,KAAtB,GAA8Bte,mBAA3C;AACA,MAAKue,KAAL,GAAaA,UAAUzlB,SAAV,GAAsBylB,KAAtB,GAA8Bve,mBAA3C;;AAEA,MAAKwe,SAAL,GAAiBA,cAAc1lB,SAAd,GAA0B0lB,SAA1B,GAAsCne,YAAvD;AACA,MAAKoe,SAAL,GAAiBA,cAAc3lB,SAAd,GAA0B2lB,SAA1B,GAAsCle,wBAAvD;;AAEA,MAAKoe,UAAL,GAAkBA,eAAe7lB,SAAf,GAA2B6lB,UAA3B,GAAwC,CAA1D;;AAEA,MAAKD,MAAL,GAAcA,WAAW5lB,SAAX,GAAuB4lB,MAAvB,GAAgCpd,UAA9C;AACA,MAAK3G,IAAL,GAAYA,SAAS7B,SAAT,GAAqB6B,IAArB,GAA4B6F,gBAAxC;;AAEA,MAAK4K,MAAL,GAAc,IAAI9D,OAAJ,CAAa,CAAb,EAAgB,CAAhB,CAAd;AACA,MAAK2X,MAAL,GAAc,IAAI3X,OAAJ,CAAa,CAAb,EAAgB,CAAhB,CAAd;AACA,MAAKqE,MAAL,GAAc,IAAIrE,OAAJ,CAAa,CAAb,EAAgB,CAAhB,CAAd;AACA,MAAKuW,QAAL,GAAgB,CAAhB;;AAEA,MAAKqB,gBAAL,GAAwB,IAAxB;AACA,MAAK1J,MAAL,GAAc,IAAI6H,OAAJ,EAAd;;AAEA,MAAK8B,eAAL,GAAuB,IAAvB;AACA,MAAKC,gBAAL,GAAwB,KAAxB;AACA,MAAKC,KAAL,GAAa,IAAb;AACA,MAAKC,eAAL,GAAuB,CAAvB,CAnC0G,CAmChF;;AAE1B;AACA;AACA;AACA;AACA,MAAKV,QAAL,GAAgBA,aAAa9lB,SAAb,GAAyB8lB,QAAzB,GAAoC7a,cAApD;;AAEA,MAAKwb,OAAL,GAAe,CAAf;AACA,MAAKC,QAAL,GAAgB,IAAhB;AAEA;;AAEDrB,QAAQW,aAAR,GAAwBhmB,SAAxB;AACAqlB,QAAQa,eAAR,GAA0Bzf,SAA1B;;AAEA4e,QAAQ3kB,SAAR,GAAoBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAehlB,gBAAgBjB,SAA/B,CAAf,EAA2D;;AAE9E0O,cAAaiW,OAFiE;;AAI9EuB,YAAW,IAJmE;;AAM9EC,eAAc,YAAY;;AAEzB,OAAKnK,MAAL,CAAYoI,cAAZ,CAA4B,KAAKxS,MAAL,CAAY9R,CAAxC,EAA2C,KAAK8R,MAAL,CAAYlF,CAAvD,EAA0D,KAAK+Y,MAAL,CAAY3lB,CAAtE,EAAyE,KAAK2lB,MAAL,CAAY/Y,CAArF,EAAwF,KAAK2X,QAA7F,EAAuG,KAAKlS,MAAL,CAAYrS,CAAnH,EAAsH,KAAKqS,MAAL,CAAYzF,CAAlI;AAEA,EAV6E;;AAY9E+B,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EAhB6E;;AAkB9EA,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB,OAAKwkB,IAAL,GAAYxkB,OAAOwkB,IAAnB;;AAEA,OAAKT,KAAL,GAAa/jB,OAAO+jB,KAApB;AACA,OAAKW,OAAL,GAAe1kB,OAAO0kB,OAAP,CAAevjB,KAAf,CAAsB,CAAtB,CAAf;;AAEA,OAAK6iB,OAAL,GAAehkB,OAAOgkB,OAAtB;;AAEA,OAAKC,KAAL,GAAajkB,OAAOikB,KAApB;AACA,OAAKC,KAAL,GAAalkB,OAAOkkB,KAApB;;AAEA,OAAKC,SAAL,GAAiBnkB,OAAOmkB,SAAxB;AACA,OAAKC,SAAL,GAAiBpkB,OAAOokB,SAAxB;;AAEA,OAAKE,UAAL,GAAkBtkB,OAAOskB,UAAzB;;AAEA,OAAKD,MAAL,GAAcrkB,OAAOqkB,MAArB;AACA,OAAK/jB,IAAL,GAAYN,OAAOM,IAAnB;;AAEA,OAAKyQ,MAAL,CAAYjD,IAAZ,CAAkB9N,OAAO+Q,MAAzB;AACA,OAAK6T,MAAL,CAAY9W,IAAZ,CAAkB9N,OAAO4kB,MAAzB;AACA,OAAKtT,MAAL,CAAYxD,IAAZ,CAAkB9N,OAAOsR,MAAzB;AACA,OAAKkS,QAAL,GAAgBxjB,OAAOwjB,QAAvB;;AAEA,OAAKqB,gBAAL,GAAwB7kB,OAAO6kB,gBAA/B;AACA,OAAK1J,MAAL,CAAYrN,IAAZ,CAAkB9N,OAAOmb,MAAzB;;AAEA,OAAK2J,eAAL,GAAuB9kB,OAAO8kB,eAA9B;AACA,OAAKC,gBAAL,GAAwB/kB,OAAO+kB,gBAA/B;AACA,OAAKC,KAAL,GAAahlB,OAAOglB,KAApB;AACA,OAAKC,eAAL,GAAuBjlB,OAAOilB,eAA9B;AACA,OAAKV,QAAL,GAAgBvkB,OAAOukB,QAAvB;;AAEA,SAAO,IAAP;AAEA,EAtD6E;;AAwD9EgB,SAAQ,UAAWC,IAAX,EAAkB;;AAEzB,MAAIC,eAAiBD,SAAS/mB,SAAT,IAAsB,OAAO+mB,IAAP,KAAgB,QAA3D;;AAEA,MAAK,CAAEC,YAAF,IAAkBD,KAAKE,QAAL,CAAe,KAAK3a,IAApB,MAA+BtM,SAAtD,EAAkE;;AAEjE,UAAO+mB,KAAKE,QAAL,CAAe,KAAK3a,IAApB,CAAP;AAEA;;AAED,WAAS4a,UAAT,CAAqB5B,KAArB,EAA6B;;AAE5B,OAAI6B,MAAJ;;AAEA,OAAK7B,iBAAiB8B,iBAAtB,EAA0C;;AAEzCD,aAAS7B,KAAT;AAEA,IAJD,MAIO;;AAEN6B,aAASE,SAASC,eAAT,CAA0B,8BAA1B,EAA0D,QAA1D,CAAT;AACAH,WAAOI,KAAP,GAAejC,MAAMiC,KAArB;AACAJ,WAAOK,MAAP,GAAgBlC,MAAMkC,MAAtB;;AAEA,QAAIC,UAAUN,OAAOO,UAAP,CAAmB,IAAnB,CAAd;;AAEA,QAAKpC,iBAAiBqC,SAAtB,EAAkC;;AAEjCF,aAAQG,YAAR,CAAsBtC,KAAtB,EAA6B,CAA7B,EAAgC,CAAhC;AAEA,KAJD,MAIO;;AAENmC,aAAQI,SAAR,CAAmBvC,KAAnB,EAA0B,CAA1B,EAA6B,CAA7B,EAAgCA,MAAMiC,KAAtC,EAA6CjC,MAAMkC,MAAnD;AAEA;AAED;;AAED,OAAKL,OAAOI,KAAP,GAAe,IAAf,IAAuBJ,OAAOK,MAAP,GAAgB,IAA5C,EAAmD;;AAElD,WAAOL,OAAOW,SAAP,CAAkB,YAAlB,EAAgC,GAAhC,CAAP;AAEA,IAJD,MAIO;;AAEN,WAAOX,OAAOW,SAAP,CAAkB,WAAlB,CAAP;AAEA;AAED;;AAED,MAAI3mB,SAAS;;AAEZ4mB,aAAU;AACTtB,aAAS,GADA;AAET5kB,UAAM,SAFG;AAGTmmB,eAAW;AAHF,IAFE;;AAQZ1b,SAAM,KAAKA,IARC;AASZyZ,SAAM,KAAKA,IATC;;AAWZR,YAAS,KAAKA,OAXF;;AAaZY,WAAQ,CAAE,KAAKA,MAAL,CAAY3lB,CAAd,EAAiB,KAAK2lB,MAAL,CAAY/Y,CAA7B,CAbI;AAcZkF,WAAQ,CAAE,KAAKA,MAAL,CAAY9R,CAAd,EAAiB,KAAK8R,MAAL,CAAYlF,CAA7B,CAdI;AAeZyF,WAAQ,CAAE,KAAKA,MAAL,CAAYrS,CAAd,EAAiB,KAAKqS,MAAL,CAAYzF,CAA7B,CAfI;AAgBZ2X,aAAU,KAAKA,QAhBH;;AAkBZkD,SAAM,CAAE,KAAKzC,KAAP,EAAc,KAAKC,KAAnB,CAlBM;;AAoBZG,WAAQ,KAAKA,MApBD;AAqBZD,cAAW,KAAKA,SArBJ;AAsBZD,cAAW,KAAKA,SAtBJ;AAuBZG,eAAY,KAAKA,UAvBL;;AAyBZU,UAAO,KAAKA;;AAzBA,GAAb;;AA6BA,MAAK,KAAKjB,KAAL,KAAetlB,SAApB,EAAgC;;AAE/B;;AAEA,OAAIslB,QAAQ,KAAKA,KAAjB;;AAEA,OAAKA,MAAMhZ,IAAN,KAAetM,SAApB,EAAgC;;AAE/BslB,UAAMhZ,IAAN,GAAaX,MAAMI,YAAN,EAAb,CAF+B,CAEI;AAEnC;;AAED,OAAK,CAAEib,YAAF,IAAkBD,KAAKmB,MAAL,CAAa5C,MAAMhZ,IAAnB,MAA8BtM,SAArD,EAAiE;;AAEhE+mB,SAAKmB,MAAL,CAAa5C,MAAMhZ,IAAnB,IAA4B;AAC3BA,WAAMgZ,MAAMhZ,IADe;AAE3B6b,UAAKjB,WAAY5B,KAAZ;AAFsB,KAA5B;AAKA;;AAEDnkB,UAAOmkB,KAAP,GAAeA,MAAMhZ,IAArB;AAEA;;AAED,MAAK,CAAE0a,YAAP,EAAsB;;AAErBD,QAAKE,QAAL,CAAe,KAAK3a,IAApB,IAA6BnL,MAA7B;AAEA;;AAED,SAAOA,MAAP;AAEA,EAxK6E;;AA0K9EinB,UAAS,YAAY;;AAEpB,OAAK7lB,aAAL,CAAoB,EAAEV,MAAM,SAAR,EAApB;AAEA,EA9K6E;;AAgL9EwmB,cAAa,UAAWC,EAAX,EAAgB;;AAE5B,MAAK,KAAK/C,OAAL,KAAiB9e,SAAtB,EAAkC;;AAElC6hB,KAAG9X,YAAH,CAAiB,KAAKkM,MAAtB;;AAEA,MAAK4L,GAAG9nB,CAAH,GAAO,CAAP,IAAY8nB,GAAG9nB,CAAH,GAAO,CAAxB,EAA4B;;AAE3B,WAAS,KAAKglB,KAAd;;AAEC,SAAKve,cAAL;;AAECqhB,QAAG9nB,CAAH,GAAO8nB,GAAG9nB,CAAH,GAAOP,KAAKK,KAAL,CAAYgoB,GAAG9nB,CAAf,CAAd;AACA;;AAED,SAAK0G,mBAAL;;AAECohB,QAAG9nB,CAAH,GAAO8nB,GAAG9nB,CAAH,GAAO,CAAP,GAAW,CAAX,GAAe,CAAtB;AACA;;AAED,SAAK2G,sBAAL;;AAEC,SAAKlH,KAAKqR,GAAL,CAAUrR,KAAKK,KAAL,CAAYgoB,GAAG9nB,CAAf,IAAqB,CAA/B,MAAuC,CAA5C,EAAgD;;AAE/C8nB,SAAG9nB,CAAH,GAAOP,KAAKmO,IAAL,CAAWka,GAAG9nB,CAAd,IAAoB8nB,GAAG9nB,CAA9B;AAEA,MAJD,MAIO;;AAEN8nB,SAAG9nB,CAAH,GAAO8nB,GAAG9nB,CAAH,GAAOP,KAAKK,KAAL,CAAYgoB,GAAG9nB,CAAf,CAAd;AAEA;AACD;;AAvBF;AA2BA;;AAED,MAAK8nB,GAAGlb,CAAH,GAAO,CAAP,IAAYkb,GAAGlb,CAAH,GAAO,CAAxB,EAA4B;;AAE3B,WAAS,KAAKqY,KAAd;;AAEC,SAAKxe,cAAL;;AAECqhB,QAAGlb,CAAH,GAAOkb,GAAGlb,CAAH,GAAOnN,KAAKK,KAAL,CAAYgoB,GAAGlb,CAAf,CAAd;AACA;;AAED,SAAKlG,mBAAL;;AAECohB,QAAGlb,CAAH,GAAOkb,GAAGlb,CAAH,GAAO,CAAP,GAAW,CAAX,GAAe,CAAtB;AACA;;AAED,SAAKjG,sBAAL;;AAEC,SAAKlH,KAAKqR,GAAL,CAAUrR,KAAKK,KAAL,CAAYgoB,GAAGlb,CAAf,IAAqB,CAA/B,MAAuC,CAA5C,EAAgD;;AAE/Ckb,SAAGlb,CAAH,GAAOnN,KAAKmO,IAAL,CAAWka,GAAGlb,CAAd,IAAoBkb,GAAGlb,CAA9B;AAEA,MAJD,MAIO;;AAENkb,SAAGlb,CAAH,GAAOkb,GAAGlb,CAAH,GAAOnN,KAAKK,KAAL,CAAYgoB,GAAGlb,CAAf,CAAd;AAEA;AACD;;AAvBF;AA2BA;;AAED,MAAK,KAAKmZ,KAAV,EAAkB;;AAEjB+B,MAAGlb,CAAH,GAAO,IAAIkb,GAAGlb,CAAd;AAEA;AAED;;AA1P6E,CAA3D,CAApB;;AA8PAzM,OAAOC,cAAP,CAAuBykB,QAAQ3kB,SAA/B,EAA0C,aAA1C,EAAyD;;AAExDgO,MAAK,UAAWtO,KAAX,EAAmB;;AAEvB,MAAKA,UAAU,IAAf,EAAsB,KAAKqmB,OAAL;AAEtB;;AANuD,CAAzD;;AAUA;;;;;;;;AAQA,SAAS8B,OAAT,CAAkB/nB,CAAlB,EAAqB4M,CAArB,EAAwB0H,CAAxB,EAA2BtF,CAA3B,EAA+B;;AAE9B,MAAKhP,CAAL,GAASA,KAAK,CAAd;AACA,MAAK4M,CAAL,GAASA,KAAK,CAAd;AACA,MAAK0H,CAAL,GAASA,KAAK,CAAd;AACA,MAAKtF,CAAL,GAAWA,MAAMxP,SAAR,GAAsBwP,CAAtB,GAA0B,CAAnC;AAEA;;AAED7O,OAAOK,MAAP,CAAeunB,QAAQ7nB,SAAvB,EAAkC;;AAEjC8nB,YAAW,IAFsB;;AAIjC9Z,MAAK,UAAWlO,CAAX,EAAc4M,CAAd,EAAiB0H,CAAjB,EAAoBtF,CAApB,EAAwB;;AAE5B,OAAKhP,CAAL,GAASA,CAAT;AACA,OAAK4M,CAAL,GAASA,CAAT;AACA,OAAK0H,CAAL,GAASA,CAAT;AACA,OAAKtF,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EAbgC;;AAejCZ,YAAW,UAAWC,MAAX,EAAoB;;AAE9B,OAAKrO,CAAL,GAASqO,MAAT;AACA,OAAKzB,CAAL,GAASyB,MAAT;AACA,OAAKiG,CAAL,GAASjG,MAAT;AACA,OAAKW,CAAL,GAASX,MAAT;;AAEA,SAAO,IAAP;AAEA,EAxBgC;;AA0BjCC,OAAM,UAAWtO,CAAX,EAAe;;AAEpB,OAAKA,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EAhCgC;;AAkCjCuO,OAAM,UAAW3B,CAAX,EAAe;;AAEpB,OAAKA,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EAxCgC;;AA0CjC0U,OAAM,UAAWhN,CAAX,EAAe;;AAEpB,OAAKA,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EAhDgC;;AAkDjC2T,OAAM,UAAWjZ,CAAX,EAAe;;AAEpB,OAAKA,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EAxDgC;;AA0DjCR,eAAc,UAAW5N,KAAX,EAAkBhB,KAAlB,EAA0B;;AAEvC,UAASgB,KAAT;;AAEC,QAAK,CAAL;AAAQ,SAAKZ,CAAL,GAASJ,KAAT,CAAgB;AACxB,QAAK,CAAL;AAAQ,SAAKgN,CAAL,GAAShN,KAAT,CAAgB;AACxB,QAAK,CAAL;AAAQ,SAAK0U,CAAL,GAAS1U,KAAT,CAAgB;AACxB,QAAK,CAAL;AAAQ,SAAKoP,CAAL,GAASpP,KAAT,CAAgB;AACxB;AAAS,UAAM,IAAI6O,KAAJ,CAAW,4BAA4B7N,KAAvC,CAAN;;AANV;;AAUA,SAAO,IAAP;AAEA,EAxEgC;;AA0EjC8N,eAAc,UAAW9N,KAAX,EAAmB;;AAEhC,UAASA,KAAT;;AAEC,QAAK,CAAL;AAAQ,WAAO,KAAKZ,CAAZ;AACR,QAAK,CAAL;AAAQ,WAAO,KAAK4M,CAAZ;AACR,QAAK,CAAL;AAAQ,WAAO,KAAK0H,CAAZ;AACR,QAAK,CAAL;AAAQ,WAAO,KAAKtF,CAAZ;AACR;AAAS,UAAM,IAAIP,KAAJ,CAAW,4BAA4B7N,KAAvC,CAAN;;AANV;AAUA,EAtFgC;;AAwFjC+N,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAK5O,CAA3B,EAA8B,KAAK4M,CAAnC,EAAsC,KAAK0H,CAA3C,EAA8C,KAAKtF,CAAnD,CAAP;AAEA,EA5FgC;;AA8FjCH,OAAM,UAAWC,CAAX,EAAe;;AAEpB,OAAK9O,CAAL,GAAS8O,EAAE9O,CAAX;AACA,OAAK4M,CAAL,GAASkC,EAAElC,CAAX;AACA,OAAK0H,CAAL,GAASxF,EAAEwF,CAAX;AACA,OAAKtF,CAAL,GAAWF,EAAEE,CAAF,KAAQxP,SAAV,GAAwBsP,EAAEE,CAA1B,GAA8B,CAAvC;;AAEA,SAAO,IAAP;AAEA,EAvGgC;;AAyGjCD,MAAK,UAAWD,CAAX,EAAcE,CAAd,EAAkB;;AAEtB,MAAKA,MAAMxP,SAAX,EAAuB;;AAEtByP,WAAQC,IAAR,CAAc,uFAAd;AACA,UAAO,KAAKC,UAAL,CAAiBL,CAAjB,EAAoBE,CAApB,CAAP;AAEA;;AAED,OAAKhP,CAAL,IAAU8O,EAAE9O,CAAZ;AACA,OAAK4M,CAAL,IAAUkC,EAAElC,CAAZ;AACA,OAAK0H,CAAL,IAAUxF,EAAEwF,CAAZ;AACA,OAAKtF,CAAL,IAAUF,EAAEE,CAAZ;;AAEA,SAAO,IAAP;AAEA,EAzHgC;;AA2HjCI,YAAW,UAAWC,CAAX,EAAe;;AAEzB,OAAKrP,CAAL,IAAUqP,CAAV;AACA,OAAKzC,CAAL,IAAUyC,CAAV;AACA,OAAKiF,CAAL,IAAUjF,CAAV;AACA,OAAKL,CAAL,IAAUK,CAAV;;AAEA,SAAO,IAAP;AAEA,EApIgC;;AAsIjCF,aAAY,UAAWG,CAAX,EAAcC,CAAd,EAAkB;;AAE7B,OAAKvP,CAAL,GAASsP,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAjB;AACA,OAAK4M,CAAL,GAAS0C,EAAE1C,CAAF,GAAM2C,EAAE3C,CAAjB;AACA,OAAK0H,CAAL,GAAShF,EAAEgF,CAAF,GAAM/E,EAAE+E,CAAjB;AACA,OAAKtF,CAAL,GAASM,EAAEN,CAAF,GAAMO,EAAEP,CAAjB;;AAEA,SAAO,IAAP;AAEA,EA/IgC;;AAiJjCQ,kBAAiB,UAAWV,CAAX,EAAcO,CAAd,EAAkB;;AAElC,OAAKrP,CAAL,IAAU8O,EAAE9O,CAAF,GAAMqP,CAAhB;AACA,OAAKzC,CAAL,IAAUkC,EAAElC,CAAF,GAAMyC,CAAhB;AACA,OAAKiF,CAAL,IAAUxF,EAAEwF,CAAF,GAAMjF,CAAhB;AACA,OAAKL,CAAL,IAAUF,EAAEE,CAAF,GAAMK,CAAhB;;AAEA,SAAO,IAAP;AAEA,EA1JgC;;AA4JjCI,MAAK,UAAWX,CAAX,EAAcE,CAAd,EAAkB;;AAEtB,MAAKA,MAAMxP,SAAX,EAAuB;;AAEtByP,WAAQC,IAAR,CAAc,uFAAd;AACA,UAAO,KAAKQ,UAAL,CAAiBZ,CAAjB,EAAoBE,CAApB,CAAP;AAEA;;AAED,OAAKhP,CAAL,IAAU8O,EAAE9O,CAAZ;AACA,OAAK4M,CAAL,IAAUkC,EAAElC,CAAZ;AACA,OAAK0H,CAAL,IAAUxF,EAAEwF,CAAZ;AACA,OAAKtF,CAAL,IAAUF,EAAEE,CAAZ;;AAEA,SAAO,IAAP;AAEA,EA5KgC;;AA8KjCW,YAAW,UAAWN,CAAX,EAAe;;AAEzB,OAAKrP,CAAL,IAAUqP,CAAV;AACA,OAAKzC,CAAL,IAAUyC,CAAV;AACA,OAAKiF,CAAL,IAAUjF,CAAV;AACA,OAAKL,CAAL,IAAUK,CAAV;;AAEA,SAAO,IAAP;AAEA,EAvLgC;;AAyLjCK,aAAY,UAAWJ,CAAX,EAAcC,CAAd,EAAkB;;AAE7B,OAAKvP,CAAL,GAASsP,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAjB;AACA,OAAK4M,CAAL,GAAS0C,EAAE1C,CAAF,GAAM2C,EAAE3C,CAAjB;AACA,OAAK0H,CAAL,GAAShF,EAAEgF,CAAF,GAAM/E,EAAE+E,CAAjB;AACA,OAAKtF,CAAL,GAASM,EAAEN,CAAF,GAAMO,EAAEP,CAAjB;;AAEA,SAAO,IAAP;AAEA,EAlMgC;;AAoMjCa,iBAAgB,UAAWxB,MAAX,EAAoB;;AAEnC,OAAKrO,CAAL,IAAUqO,MAAV;AACA,OAAKzB,CAAL,IAAUyB,MAAV;AACA,OAAKiG,CAAL,IAAUjG,MAAV;AACA,OAAKW,CAAL,IAAUX,MAAV;;AAEA,SAAO,IAAP;AAEA,EA7MgC;;AA+MjCuK,eAAc,UAAWvM,CAAX,EAAe;;AAE5B,MAAIrM,IAAI,KAAKA,CAAb;AAAA,MAAgB4M,IAAI,KAAKA,CAAzB;AAAA,MAA4B0H,IAAI,KAAKA,CAArC;AAAA,MAAwCtF,IAAI,KAAKA,CAAjD;AACA,MAAIiB,IAAI5D,EAAE6D,QAAV;;AAEA,OAAKlQ,CAAL,GAASiQ,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,IAASqE,CAAnC,GAAuCrE,EAAG,EAAH,IAAUjB,CAA1D;AACA,OAAKpC,CAAL,GAASqD,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,CAAH,IAASqE,CAAnC,GAAuCrE,EAAG,EAAH,IAAUjB,CAA1D;AACA,OAAKsF,CAAL,GAASrE,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,EAAH,IAAUqE,CAApC,GAAwCrE,EAAG,EAAH,IAAUjB,CAA3D;AACA,OAAKA,CAAL,GAASiB,EAAG,CAAH,IAASjQ,CAAT,GAAaiQ,EAAG,CAAH,IAASrD,CAAtB,GAA0BqD,EAAG,EAAH,IAAUqE,CAApC,GAAwCrE,EAAG,EAAH,IAAUjB,CAA3D;;AAEA,SAAO,IAAP;AAEA,EA3NgC;;AA6NjCe,eAAc,UAAW1B,MAAX,EAAoB;;AAEjC,SAAO,KAAKwB,cAAL,CAAqB,IAAIxB,MAAzB,CAAP;AAEA,EAjOgC;;AAmOjC6Z,6BAA4B,UAAWjS,CAAX,EAAe;;AAE1C;;AAEA;;AAEA,OAAKjH,CAAL,GAAS,IAAIvP,KAAK6jB,IAAL,CAAWrN,EAAEjH,CAAb,CAAb;;AAEA,MAAIK,IAAI5P,KAAKmR,IAAL,CAAW,IAAIqF,EAAEjH,CAAF,GAAMiH,EAAEjH,CAAvB,CAAR;;AAEA,MAAKK,IAAI,MAAT,EAAkB;;AAEjB,QAAKrP,CAAL,GAAS,CAAT;AACA,QAAK4M,CAAL,GAAS,CAAT;AACA,QAAK0H,CAAL,GAAS,CAAT;AAEA,GAND,MAMO;;AAEN,QAAKtU,CAAL,GAASiW,EAAEjW,CAAF,GAAMqP,CAAf;AACA,QAAKzC,CAAL,GAASqJ,EAAErJ,CAAF,GAAMyC,CAAf;AACA,QAAKiF,CAAL,GAAS2B,EAAE3B,CAAF,GAAMjF,CAAf;AAEA;;AAED,SAAO,IAAP;AAEA,EA7PgC;;AA+PjC8Y,iCAAgC,UAAW9b,CAAX,EAAe;;AAE9C;;AAEA;;AAEA,MAAI2E,KAAJ;AAAA,MAAWhR,CAAX;AAAA,MAAc4M,CAAd;AAAA,MAAiB0H,CAAjB;AAAA,MAAqB;AACpB8T,YAAU,IADX;AAAA,MACkB;AACjBC,aAAW,GAFZ;AAAA,MAEkB;;AAEjBzU,OAAKvH,EAAE6D,QAJR;AAAA,MAMCkP,MAAMxL,GAAI,CAAJ,CANP;AAAA,MAMgByL,MAAMzL,GAAI,CAAJ,CANtB;AAAA,MAM+B0L,MAAM1L,GAAI,CAAJ,CANrC;AAAA,MAOC2L,MAAM3L,GAAI,CAAJ,CAPP;AAAA,MAOgB4L,MAAM5L,GAAI,CAAJ,CAPtB;AAAA,MAO+B6L,MAAM7L,GAAI,CAAJ,CAPrC;AAAA,MAQC8L,MAAM9L,GAAI,CAAJ,CARP;AAAA,MAQgB+L,MAAM/L,GAAI,CAAJ,CARtB;AAAA,MAQ+BgM,MAAMhM,GAAI,EAAJ,CARrC;;AAUA,MAAOnU,KAAKqR,GAAL,CAAUuO,MAAME,GAAhB,IAAwB6I,OAA1B,IACE3oB,KAAKqR,GAAL,CAAUwO,MAAMI,GAAhB,IAAwB0I,OAD1B,IAEE3oB,KAAKqR,GAAL,CAAU2O,MAAME,GAAhB,IAAwByI,OAF/B,EAE2C;;AAE1C;AACA;AACA;;AAEA,OAAO3oB,KAAKqR,GAAL,CAAUuO,MAAME,GAAhB,IAAwB8I,QAA1B,IACE5oB,KAAKqR,GAAL,CAAUwO,MAAMI,GAAhB,IAAwB2I,QAD1B,IAEE5oB,KAAKqR,GAAL,CAAU2O,MAAME,GAAhB,IAAwB0I,QAF1B,IAGE5oB,KAAKqR,GAAL,CAAUsO,MAAMI,GAAN,GAAYI,GAAZ,GAAkB,CAA5B,IAAkCyI,QAHzC,EAGsD;;AAErD;;AAEA,SAAKna,GAAL,CAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB;;AAEA,WAAO,IAAP,CANqD,CAMxC;AAEb;;AAED;;AAEA8C,WAAQvR,KAAK4L,EAAb;;AAEA,OAAI+P,KAAK,CAAEgE,MAAM,CAAR,IAAc,CAAvB;AACA,OAAI7D,KAAK,CAAEiE,MAAM,CAAR,IAAc,CAAvB;AACA,OAAI/D,KAAK,CAAEmE,MAAM,CAAR,IAAc,CAAvB;AACA,OAAIvE,KAAK,CAAEgE,MAAME,GAAR,IAAgB,CAAzB;AACA,OAAIjE,KAAK,CAAEgE,MAAMI,GAAR,IAAgB,CAAzB;AACA,OAAIlE,KAAK,CAAEiE,MAAME,GAAR,IAAgB,CAAzB;;AAEA,OAAOvE,KAAKG,EAAP,IAAiBH,KAAKK,EAA3B,EAAkC;;AAEjC;;AAEA,QAAKL,KAAKgN,OAAV,EAAoB;;AAEnBpoB,SAAI,CAAJ;AACA4M,SAAI,WAAJ;AACA0H,SAAI,WAAJ;AAEA,KAND,MAMO;;AAENtU,SAAIP,KAAKmR,IAAL,CAAWwK,EAAX,CAAJ;AACAxO,SAAIyO,KAAKrb,CAAT;AACAsU,SAAIgH,KAAKtb,CAAT;AAEA;AAED,IAlBD,MAkBO,IAAKub,KAAKE,EAAV,EAAe;;AAErB;;AAEA,QAAKF,KAAK6M,OAAV,EAAoB;;AAEnBpoB,SAAI,WAAJ;AACA4M,SAAI,CAAJ;AACA0H,SAAI,WAAJ;AAEA,KAND,MAMO;;AAEN1H,SAAInN,KAAKmR,IAAL,CAAW2K,EAAX,CAAJ;AACAvb,SAAIqb,KAAKzO,CAAT;AACA0H,SAAIkH,KAAK5O,CAAT;AAEA;AAED,IAlBM,MAkBA;;AAEN;;AAEA,QAAK6O,KAAK2M,OAAV,EAAoB;;AAEnBpoB,SAAI,WAAJ;AACA4M,SAAI,WAAJ;AACA0H,SAAI,CAAJ;AAEA,KAND,MAMO;;AAENA,SAAI7U,KAAKmR,IAAL,CAAW6K,EAAX,CAAJ;AACAzb,SAAIsb,KAAKhH,CAAT;AACA1H,SAAI4O,KAAKlH,CAAT;AAEA;AAED;;AAED,QAAKpG,GAAL,CAAUlO,CAAV,EAAa4M,CAAb,EAAgB0H,CAAhB,EAAmBtD,KAAnB;;AAEA,UAAO,IAAP,CAxF0C,CAwF7B;AAEb;;AAED;;AAEA,MAAI3B,IAAI5P,KAAKmR,IAAL,CAAW,CAAE+O,MAAMF,GAAR,KAAkBE,MAAMF,GAAxB,IACA,CAAEH,MAAMI,GAAR,KAAkBJ,MAAMI,GAAxB,CADA,GAEA,CAAEH,MAAMF,GAAR,KAAkBE,MAAMF,GAAxB,CAFX,CAAR,CAhH8C,CAkHM;;AAEpD,MAAK5f,KAAKqR,GAAL,CAAUzB,CAAV,IAAgB,KAArB,EAA6BA,IAAI,CAAJ;;AAE7B;AACA;;AAEA,OAAKrP,CAAL,GAAS,CAAE2f,MAAMF,GAAR,IAAgBpQ,CAAzB;AACA,OAAKzC,CAAL,GAAS,CAAE0S,MAAMI,GAAR,IAAgBrQ,CAAzB;AACA,OAAKiF,CAAL,GAAS,CAAEiL,MAAMF,GAAR,IAAgBhQ,CAAzB;AACA,OAAKL,CAAL,GAASvP,KAAK6jB,IAAL,CAAW,CAAElE,MAAMI,GAAN,GAAYI,GAAZ,GAAkB,CAApB,IAA0B,CAArC,CAAT;;AAEA,SAAO,IAAP;AAEA,EA/XgC;;AAiYjC3T,MAAK,UAAW6C,CAAX,EAAe;;AAEnB,OAAK9O,CAAL,GAASP,KAAKwM,GAAL,CAAU,KAAKjM,CAAf,EAAkB8O,EAAE9O,CAApB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKwM,GAAL,CAAU,KAAKW,CAAf,EAAkBkC,EAAElC,CAApB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAKwM,GAAL,CAAU,KAAKqI,CAAf,EAAkBxF,EAAEwF,CAApB,CAAT;AACA,OAAKtF,CAAL,GAASvP,KAAKwM,GAAL,CAAU,KAAK+C,CAAf,EAAkBF,EAAEE,CAApB,CAAT;;AAEA,SAAO,IAAP;AAEA,EA1YgC;;AA4YjC9C,MAAK,UAAW4C,CAAX,EAAe;;AAEnB,OAAK9O,CAAL,GAASP,KAAKyM,GAAL,CAAU,KAAKlM,CAAf,EAAkB8O,EAAE9O,CAApB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKyM,GAAL,CAAU,KAAKU,CAAf,EAAkBkC,EAAElC,CAApB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAKyM,GAAL,CAAU,KAAKoI,CAAf,EAAkBxF,EAAEwF,CAApB,CAAT;AACA,OAAKtF,CAAL,GAASvP,KAAKyM,GAAL,CAAU,KAAK8C,CAAf,EAAkBF,EAAEE,CAApB,CAAT;;AAEA,SAAO,IAAP;AAEA,EArZgC;;AAuZjChD,QAAO,UAAWC,GAAX,EAAgBC,GAAhB,EAAsB;;AAE5B;;AAEA,OAAKlM,CAAL,GAASP,KAAKyM,GAAL,CAAUD,IAAIjM,CAAd,EAAiBP,KAAKwM,GAAL,CAAUC,IAAIlM,CAAd,EAAiB,KAAKA,CAAtB,CAAjB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKyM,GAAL,CAAUD,IAAIW,CAAd,EAAiBnN,KAAKwM,GAAL,CAAUC,IAAIU,CAAd,EAAiB,KAAKA,CAAtB,CAAjB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAKyM,GAAL,CAAUD,IAAIqI,CAAd,EAAiB7U,KAAKwM,GAAL,CAAUC,IAAIoI,CAAd,EAAiB,KAAKA,CAAtB,CAAjB,CAAT;AACA,OAAKtF,CAAL,GAASvP,KAAKyM,GAAL,CAAUD,IAAI+C,CAAd,EAAiBvP,KAAKwM,GAAL,CAAUC,IAAI8C,CAAd,EAAiB,KAAKA,CAAtB,CAAjB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAlagC;;AAoajCmB,cAAa,YAAY;;AAExB,MAAIlE,GAAJ,EAASC,GAAT;;AAEA,SAAO,SAASiE,WAAT,CAAsBC,MAAtB,EAA8BC,MAA9B,EAAuC;;AAE7C,OAAKpE,QAAQzM,SAAb,EAAyB;;AAExByM,UAAM,IAAI8b,OAAJ,EAAN;AACA7b,UAAM,IAAI6b,OAAJ,EAAN;AAEA;;AAED9b,OAAIiC,GAAJ,CAASkC,MAAT,EAAiBA,MAAjB,EAAyBA,MAAzB,EAAiCA,MAAjC;AACAlE,OAAIgC,GAAJ,CAASmC,MAAT,EAAiBA,MAAjB,EAAyBA,MAAzB,EAAiCA,MAAjC;;AAEA,UAAO,KAAKrE,KAAL,CAAYC,GAAZ,EAAiBC,GAAjB,CAAP;AAEA,GAdD;AAgBA,EApBY,EApaoB;;AA0bjCoE,cAAa,UAAWrE,GAAX,EAAgBC,GAAhB,EAAsB;;AAElC,MAAIpL,SAAS,KAAKA,MAAL,EAAb;;AAEA,SAAO,KAAKiP,YAAL,CAAmBjP,UAAU,CAA7B,EAAiC+O,cAAjC,CAAiDpQ,KAAKyM,GAAL,CAAUD,GAAV,EAAexM,KAAKwM,GAAL,CAAUC,GAAV,EAAepL,MAAf,CAAf,CAAjD,CAAP;AAEA,EAhcgC;;AAkcjChB,QAAO,YAAY;;AAElB,OAAKE,CAAL,GAASP,KAAKK,KAAL,CAAY,KAAKE,CAAjB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKK,KAAL,CAAY,KAAK8M,CAAjB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAKK,KAAL,CAAY,KAAKwU,CAAjB,CAAT;AACA,OAAKtF,CAAL,GAASvP,KAAKK,KAAL,CAAY,KAAKkP,CAAjB,CAAT;;AAEA,SAAO,IAAP;AAEA,EA3cgC;;AA6cjCpB,OAAM,YAAY;;AAEjB,OAAK5N,CAAL,GAASP,KAAKmO,IAAL,CAAW,KAAK5N,CAAhB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAKmO,IAAL,CAAW,KAAKhB,CAAhB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAKmO,IAAL,CAAW,KAAK0G,CAAhB,CAAT;AACA,OAAKtF,CAAL,GAASvP,KAAKmO,IAAL,CAAW,KAAKoB,CAAhB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAtdgC;;AAwdjCuB,QAAO,YAAY;;AAElB,OAAKvQ,CAAL,GAASP,KAAK8Q,KAAL,CAAY,KAAKvQ,CAAjB,CAAT;AACA,OAAK4M,CAAL,GAASnN,KAAK8Q,KAAL,CAAY,KAAK3D,CAAjB,CAAT;AACA,OAAK0H,CAAL,GAAS7U,KAAK8Q,KAAL,CAAY,KAAK+D,CAAjB,CAAT;AACA,OAAKtF,CAAL,GAASvP,KAAK8Q,KAAL,CAAY,KAAKvB,CAAjB,CAAT;;AAEA,SAAO,IAAP;AAEA,EAjegC;;AAmejCwB,cAAa,YAAY;;AAExB,OAAKxQ,CAAL,GAAW,KAAKA,CAAL,GAAS,CAAX,GAAiBP,KAAKmO,IAAL,CAAW,KAAK5N,CAAhB,CAAjB,GAAuCP,KAAKK,KAAL,CAAY,KAAKE,CAAjB,CAAhD;AACA,OAAK4M,CAAL,GAAW,KAAKA,CAAL,GAAS,CAAX,GAAiBnN,KAAKmO,IAAL,CAAW,KAAKhB,CAAhB,CAAjB,GAAuCnN,KAAKK,KAAL,CAAY,KAAK8M,CAAjB,CAAhD;AACA,OAAK0H,CAAL,GAAW,KAAKA,CAAL,GAAS,CAAX,GAAiB7U,KAAKmO,IAAL,CAAW,KAAK0G,CAAhB,CAAjB,GAAuC7U,KAAKK,KAAL,CAAY,KAAKwU,CAAjB,CAAhD;AACA,OAAKtF,CAAL,GAAW,KAAKA,CAAL,GAAS,CAAX,GAAiBvP,KAAKmO,IAAL,CAAW,KAAKoB,CAAhB,CAAjB,GAAuCvP,KAAKK,KAAL,CAAY,KAAKkP,CAAjB,CAAhD;;AAEA,SAAO,IAAP;AAEA,EA5egC;;AA8ejCyB,SAAQ,YAAY;;AAEnB,OAAKzQ,CAAL,GAAS,CAAE,KAAKA,CAAhB;AACA,OAAK4M,CAAL,GAAS,CAAE,KAAKA,CAAhB;AACA,OAAK0H,CAAL,GAAS,CAAE,KAAKA,CAAhB;AACA,OAAKtF,CAAL,GAAS,CAAE,KAAKA,CAAhB;;AAEA,SAAO,IAAP;AAEA,EAvfgC;;AAyfjC0B,MAAK,UAAW5B,CAAX,EAAe;;AAEnB,SAAO,KAAK9O,CAAL,GAAS8O,EAAE9O,CAAX,GAAe,KAAK4M,CAAL,GAASkC,EAAElC,CAA1B,GAA8B,KAAK0H,CAAL,GAASxF,EAAEwF,CAAzC,GAA6C,KAAKtF,CAAL,GAASF,EAAEE,CAA/D;AAEA,EA7fgC;;AA+fjC2B,WAAU,YAAY;;AAErB,SAAO,KAAK3Q,CAAL,GAAS,KAAKA,CAAd,GAAkB,KAAK4M,CAAL,GAAS,KAAKA,CAAhC,GAAoC,KAAK0H,CAAL,GAAS,KAAKA,CAAlD,GAAsD,KAAKtF,CAAL,GAAS,KAAKA,CAA3E;AAEA,EAngBgC;;AAqgBjClO,SAAQ,YAAY;;AAEnB,SAAOrB,KAAKmR,IAAL,CAAW,KAAK5Q,CAAL,GAAS,KAAKA,CAAd,GAAkB,KAAK4M,CAAL,GAAS,KAAKA,CAAhC,GAAoC,KAAK0H,CAAL,GAAS,KAAKA,CAAlD,GAAsD,KAAKtF,CAAL,GAAS,KAAKA,CAA/E,CAAP;AAEA,EAzgBgC;;AA2gBjC6B,kBAAiB,YAAY;;AAE5B,SAAOpR,KAAKqR,GAAL,CAAU,KAAK9Q,CAAf,IAAqBP,KAAKqR,GAAL,CAAU,KAAKlE,CAAf,CAArB,GAA0CnN,KAAKqR,GAAL,CAAU,KAAKwD,CAAf,CAA1C,GAA+D7U,KAAKqR,GAAL,CAAU,KAAK9B,CAAf,CAAtE;AAEA,EA/gBgC;;AAihBjC+B,YAAW,YAAY;;AAEtB,SAAO,KAAKhB,YAAL,CAAmB,KAAKjP,MAAL,MAAiB,CAApC,CAAP;AAEA,EArhBgC;;AAuhBjCyQ,YAAW,UAAWzQ,MAAX,EAAoB;;AAE9B,SAAO,KAAKiQ,SAAL,GAAiBlB,cAAjB,CAAiC/O,MAAjC,CAAP;AAEA,EA3hBgC;;AA6hBjC6L,OAAM,UAAWmC,CAAX,EAAc0C,KAAd,EAAsB;;AAE3B,OAAKxR,CAAL,IAAU,CAAE8O,EAAE9O,CAAF,GAAM,KAAKA,CAAb,IAAmBwR,KAA7B;AACA,OAAK5E,CAAL,IAAU,CAAEkC,EAAElC,CAAF,GAAM,KAAKA,CAAb,IAAmB4E,KAA7B;AACA,OAAK8C,CAAL,IAAU,CAAExF,EAAEwF,CAAF,GAAM,KAAKA,CAAb,IAAmB9C,KAA7B;AACA,OAAKxC,CAAL,IAAU,CAAEF,EAAEE,CAAF,GAAM,KAAKA,CAAb,IAAmBwC,KAA7B;;AAEA,SAAO,IAAP;AAEA,EAtiBgC;;AAwiBjCC,cAAa,UAAWC,EAAX,EAAeC,EAAf,EAAmBH,KAAnB,EAA2B;;AAEvC,SAAO,KAAK9B,UAAL,CAAiBiC,EAAjB,EAAqBD,EAArB,EAA0B7B,cAA1B,CAA0C2B,KAA1C,EAAkDzC,GAAlD,CAAuD2C,EAAvD,CAAP;AAEA,EA5iBgC;;AA8iBjCE,SAAQ,UAAW9C,CAAX,EAAe;;AAEtB,SAAWA,EAAE9O,CAAF,KAAQ,KAAKA,CAAf,IAAwB8O,EAAElC,CAAF,KAAQ,KAAKA,CAArC,IAA8CkC,EAAEwF,CAAF,KAAQ,KAAKA,CAA3D,IAAoExF,EAAEE,CAAF,KAAQ,KAAKA,CAA1F;AAEA,EAljBgC;;AAojBjC6C,YAAW,UAAW5P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAErC,MAAKA,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,OAAK9R,CAAL,GAASiC,MAAO6P,MAAP,CAAT;AACA,OAAKlF,CAAL,GAAS3K,MAAO6P,SAAS,CAAhB,CAAT;AACA,OAAKwC,CAAL,GAASrS,MAAO6P,SAAS,CAAhB,CAAT;AACA,OAAK9C,CAAL,GAAS/M,MAAO6P,SAAS,CAAhB,CAAT;;AAEA,SAAO,IAAP;AAEA,EA/jBgC;;AAikBjCC,UAAS,UAAW9P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEnC,MAAK7P,UAAUzC,SAAf,EAA2ByC,QAAQ,EAAR;AAC3B,MAAK6P,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B7P,QAAO6P,MAAP,IAAkB,KAAK9R,CAAvB;AACAiC,QAAO6P,SAAS,CAAhB,IAAsB,KAAKlF,CAA3B;AACA3K,QAAO6P,SAAS,CAAhB,IAAsB,KAAKwC,CAA3B;AACArS,QAAO6P,SAAS,CAAhB,IAAsB,KAAK9C,CAA3B;;AAEA,SAAO/M,KAAP;AAEA,EA7kBgC;;AA+kBjC+P,sBAAqB,UAAWC,SAAX,EAAsBrR,KAAtB,EAA6BkR,MAA7B,EAAsC;;AAE1D,MAAKA,WAAWtS,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,qEAAd;AAEA;;AAED,OAAKlP,CAAL,GAASiS,UAAUC,IAAV,CAAgBtR,KAAhB,CAAT;AACA,OAAKgM,CAAL,GAASqF,UAAUE,IAAV,CAAgBvR,KAAhB,CAAT;AACA,OAAK0T,CAAL,GAASrC,UAAU0G,IAAV,CAAgB/X,KAAhB,CAAT;AACA,OAAKoO,CAAL,GAASiD,UAAUqW,IAAV,CAAgB1nB,KAAhB,CAAT;;AAEA,SAAO,IAAP;AAEA;;AA9lBgC,CAAlC;;AAkmBA;;;;;;AAMA;;;;;AAKA,SAAS2nB,iBAAT,CAA4BxB,KAA5B,EAAmCC,MAAnC,EAA2CwB,OAA3C,EAAqD;;AAEpD,MAAKzB,KAAL,GAAaA,KAAb;AACA,MAAKC,MAAL,GAAcA,MAAd;;AAEA,MAAKyB,OAAL,GAAe,IAAIV,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmBhB,KAAnB,EAA0BC,MAA1B,CAAf;AACA,MAAK0B,WAAL,GAAmB,KAAnB;;AAEA,MAAKC,QAAL,GAAgB,IAAIZ,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmBhB,KAAnB,EAA0BC,MAA1B,CAAhB;;AAEAwB,WAAUA,WAAW,EAArB;;AAEA,KAAKA,QAAQrD,SAAR,KAAsB3lB,SAA3B,EAAuCgpB,QAAQrD,SAAR,GAAoBpe,YAApB;;AAEvC,MAAK6hB,OAAL,GAAe,IAAI/D,OAAJ,CAAarlB,SAAb,EAAwBA,SAAxB,EAAmCgpB,QAAQxD,KAA3C,EAAkDwD,QAAQvD,KAA1D,EAAiEuD,QAAQtD,SAAzE,EAAoFsD,QAAQrD,SAA5F,EAAuGqD,QAAQpD,MAA/G,EAAuHoD,QAAQnnB,IAA/H,EAAqImnB,QAAQnD,UAA7I,EAAyJmD,QAAQlD,QAAjK,CAAf;;AAEA,MAAKsD,OAAL,CAAa/C,eAAb,GAA+B2C,QAAQ3C,eAAR,KAA4BrmB,SAA5B,GAAwCgpB,QAAQ3C,eAAhD,GAAkE,IAAjG;;AAEA,MAAKgD,WAAL,GAAmBL,QAAQK,WAAR,KAAwBrpB,SAAxB,GAAoCgpB,QAAQK,WAA5C,GAA0D,IAA7E;AACA,MAAKC,aAAL,GAAqBN,QAAQM,aAAR,KAA0BtpB,SAA1B,GAAsCgpB,QAAQM,aAA9C,GAA8D,IAAnF;AACA,MAAKC,YAAL,GAAoBP,QAAQO,YAAR,KAAyBvpB,SAAzB,GAAqCgpB,QAAQO,YAA7C,GAA4D,IAAhF;AAEA;;AAEDR,kBAAkBroB,SAAlB,GAA8BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAehlB,gBAAgBjB,SAA/B,CAAf,EAA2D;;AAExF0O,cAAa2Z,iBAF2E;;AAIxFS,sBAAqB,IAJmE;;AAMxFC,UAAS,UAAWlC,KAAX,EAAkBC,MAAlB,EAA2B;;AAEnC,MAAK,KAAKD,KAAL,KAAeA,KAAf,IAAwB,KAAKC,MAAL,KAAgBA,MAA7C,EAAsD;;AAErD,QAAKD,KAAL,GAAaA,KAAb;AACA,QAAKC,MAAL,GAAcA,MAAd;;AAEA,QAAKY,OAAL;AAEA;;AAED,OAAKe,QAAL,CAAcza,GAAd,CAAmB,CAAnB,EAAsB,CAAtB,EAAyB6Y,KAAzB,EAAgCC,MAAhC;AACA,OAAKyB,OAAL,CAAava,GAAb,CAAkB,CAAlB,EAAqB,CAArB,EAAwB6Y,KAAxB,EAA+BC,MAA/B;AAEA,EApBuF;;AAsBxFrY,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EA1BuF;;AA4BxFA,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB,OAAKgmB,KAAL,GAAahmB,OAAOgmB,KAApB;AACA,OAAKC,MAAL,GAAcjmB,OAAOimB,MAArB;;AAEA,OAAK2B,QAAL,CAAc9Z,IAAd,CAAoB9N,OAAO4nB,QAA3B;;AAEA,OAAKC,OAAL,GAAe7nB,OAAO6nB,OAAP,CAAeja,KAAf,EAAf;;AAEA,OAAKka,WAAL,GAAmB9nB,OAAO8nB,WAA1B;AACA,OAAKC,aAAL,GAAqB/nB,OAAO+nB,aAA5B;AACA,OAAKC,YAAL,GAAoBhoB,OAAOgoB,YAA3B;;AAEA,SAAO,IAAP;AAEA,EA3CuF;;AA6CxFnB,UAAS,YAAY;;AAEpB,OAAK7lB,aAAL,CAAoB,EAAEV,MAAM,SAAR,EAApB;AAEA;;AAjDuF,CAA3D,CAA9B;;AAqDA;;;;AAIA,SAAS6nB,qBAAT,CAAgCnC,KAAhC,EAAuCC,MAAvC,EAA+CwB,OAA/C,EAAyD;;AAExDD,mBAAkBrnB,IAAlB,CAAwB,IAAxB,EAA8B6lB,KAA9B,EAAqCC,MAArC,EAA6CwB,OAA7C;;AAEA,MAAKW,cAAL,GAAsB,CAAtB,CAJwD,CAI/B;AACzB,MAAKC,iBAAL,GAAyB,CAAzB;AAEA;;AAEDF,sBAAsBhpB,SAAtB,GAAkCC,OAAOgmB,MAAP,CAAeoC,kBAAkBroB,SAAjC,CAAlC;AACAgpB,sBAAsBhpB,SAAtB,CAAgC0O,WAAhC,GAA8Csa,qBAA9C;;AAEAA,sBAAsBhpB,SAAtB,CAAgCmpB,uBAAhC,GAA0D,IAA1D;;AAEA;;;;AAIA,SAASC,WAAT,CAAsBC,IAAtB,EAA4BxC,KAA5B,EAAmCC,MAAnC,EAA2C5B,MAA3C,EAAmD/jB,IAAnD,EAAyD0jB,OAAzD,EAAkEC,KAAlE,EAAyEC,KAAzE,EAAgFC,SAAhF,EAA2FC,SAA3F,EAAsGE,UAAtG,EAAkHC,QAAlH,EAA6H;;AAE5HT,SAAQ3jB,IAAR,CAAc,IAAd,EAAoB,IAApB,EAA0B6jB,OAA1B,EAAmCC,KAAnC,EAA0CC,KAA1C,EAAiDC,SAAjD,EAA4DC,SAA5D,EAAuEC,MAAvE,EAA+E/jB,IAA/E,EAAqFgkB,UAArF,EAAiGC,QAAjG;;AAEA,MAAKR,KAAL,GAAa,EAAEyE,MAAMA,IAAR,EAAcxC,OAAOA,KAArB,EAA4BC,QAAQA,MAApC,EAAb;;AAEA,MAAK9B,SAAL,GAAiBA,cAAc1lB,SAAd,GAA0B0lB,SAA1B,GAAsCte,aAAvD;AACA,MAAKue,SAAL,GAAiBA,cAAc3lB,SAAd,GAA0B2lB,SAA1B,GAAsCve,aAAvD;;AAEA,MAAKif,eAAL,GAAuB,KAAvB;AACA,MAAKE,KAAL,GAAa,KAAb;AACA,MAAKC,eAAL,GAAuB,CAAvB;AAEA;;AAEDsD,YAAYppB,SAAZ,GAAwBC,OAAOgmB,MAAP,CAAetB,QAAQ3kB,SAAvB,CAAxB;AACAopB,YAAYppB,SAAZ,CAAsB0O,WAAtB,GAAoC0a,WAApC;;AAEAA,YAAYppB,SAAZ,CAAsBspB,aAAtB,GAAsC,IAAtC;;AAEA;;;;;AAKA,SAASC,IAAT,CAAexd,GAAf,EAAoBC,GAApB,EAA0B;;AAEzB,MAAKD,GAAL,GAAaA,QAAQzM,SAAV,GAAwByM,GAAxB,GAA8B,IAAIuI,OAAJ,CAAa,CAAEkV,QAAf,EAAyB,CAAEA,QAA3B,EAAqC,CAAEA,QAAvC,CAAzC;AACA,MAAKxd,GAAL,GAAaA,QAAQ1M,SAAV,GAAwB0M,GAAxB,GAA8B,IAAIsI,OAAJ,CAAa,CAAEkV,QAAf,EAAyB,CAAEA,QAA3B,EAAqC,CAAEA,QAAvC,CAAzC;AAEA;;AAEDvpB,OAAOK,MAAP,CAAeipB,KAAKvpB,SAApB,EAA+B;;AAE9BypB,SAAQ,IAFsB;;AAI9Bzb,MAAK,UAAWjC,GAAX,EAAgBC,GAAhB,EAAsB;;AAE1B,OAAKD,GAAL,CAAS4C,IAAT,CAAe5C,GAAf;AACA,OAAKC,GAAL,CAAS2C,IAAT,CAAe3C,GAAf;;AAEA,SAAO,IAAP;AAEA,EAX6B;;AAa9B0d,eAAc,UAAW3nB,KAAX,EAAmB;;AAEhC,MAAI4nB,OAAO,CAAEH,QAAb;AACA,MAAII,OAAO,CAAEJ,QAAb;AACA,MAAIK,OAAO,CAAEL,QAAb;;AAEA,MAAIM,OAAO,CAAEN,QAAb;AACA,MAAIO,OAAO,CAAEP,QAAb;AACA,MAAIQ,OAAO,CAAER,QAAb;;AAEA,OAAM,IAAIvnB,IAAI,CAAR,EAAWC,IAAIH,MAAMnB,MAA3B,EAAmCqB,IAAIC,CAAvC,EAA0CD,KAAK,CAA/C,EAAmD;;AAElD,OAAInC,IAAIiC,MAAOE,CAAP,CAAR;AACA,OAAIyK,IAAI3K,MAAOE,IAAI,CAAX,CAAR;AACA,OAAImS,IAAIrS,MAAOE,IAAI,CAAX,CAAR;;AAEA,OAAKnC,IAAI6pB,IAAT,EAAgBA,OAAO7pB,CAAP;AAChB,OAAK4M,IAAIkd,IAAT,EAAgBA,OAAOld,CAAP;AAChB,OAAK0H,IAAIyV,IAAT,EAAgBA,OAAOzV,CAAP;;AAEhB,OAAKtU,IAAIgqB,IAAT,EAAgBA,OAAOhqB,CAAP;AAChB,OAAK4M,IAAIqd,IAAT,EAAgBA,OAAOrd,CAAP;AAChB,OAAK0H,IAAI4V,IAAT,EAAgBA,OAAO5V,CAAP;AAEhB;;AAED,OAAKrI,GAAL,CAASiC,GAAT,CAAc2b,IAAd,EAAoBC,IAApB,EAA0BC,IAA1B;AACA,OAAK7d,GAAL,CAASgC,GAAT,CAAc8b,IAAd,EAAoBC,IAApB,EAA0BC,IAA1B;;AAEA,SAAO,IAAP;AAEA,EA5C6B;;AA8C9BC,yBAAwB,UAAWlY,SAAX,EAAuB;;AAE9C,MAAI4X,OAAO,CAAEH,QAAb;AACA,MAAII,OAAO,CAAEJ,QAAb;AACA,MAAIK,OAAO,CAAEL,QAAb;;AAEA,MAAIM,OAAO,CAAEN,QAAb;AACA,MAAIO,OAAO,CAAEP,QAAb;AACA,MAAIQ,OAAO,CAAER,QAAb;;AAEA,OAAM,IAAIvnB,IAAI,CAAR,EAAWC,IAAI6P,UAAUyG,KAA/B,EAAsCvW,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnD,OAAInC,IAAIiS,UAAUC,IAAV,CAAgB/P,CAAhB,CAAR;AACA,OAAIyK,IAAIqF,UAAUE,IAAV,CAAgBhQ,CAAhB,CAAR;AACA,OAAImS,IAAIrC,UAAU0G,IAAV,CAAgBxW,CAAhB,CAAR;;AAEA,OAAKnC,IAAI6pB,IAAT,EAAgBA,OAAO7pB,CAAP;AAChB,OAAK4M,IAAIkd,IAAT,EAAgBA,OAAOld,CAAP;AAChB,OAAK0H,IAAIyV,IAAT,EAAgBA,OAAOzV,CAAP;;AAEhB,OAAKtU,IAAIgqB,IAAT,EAAgBA,OAAOhqB,CAAP;AAChB,OAAK4M,IAAIqd,IAAT,EAAgBA,OAAOrd,CAAP;AAChB,OAAK0H,IAAI4V,IAAT,EAAgBA,OAAO5V,CAAP;AAEhB;;AAED,OAAKrI,GAAL,CAASiC,GAAT,CAAc2b,IAAd,EAAoBC,IAApB,EAA0BC,IAA1B;AACA,OAAK7d,GAAL,CAASgC,GAAT,CAAc8b,IAAd,EAAoBC,IAApB,EAA0BC,IAA1B;;AAEA,SAAO,IAAP;AAEA,EA7E6B;;AA+E9BE,gBAAe,UAAWC,MAAX,EAAoB;;AAElC,OAAKC,SAAL;;AAEA,OAAM,IAAInoB,IAAI,CAAR,EAAWooB,KAAKF,OAAOvpB,MAA7B,EAAqCqB,IAAIooB,EAAzC,EAA6CpoB,GAA7C,EAAoD;;AAEnD,QAAKqoB,aAAL,CAAoBH,OAAQloB,CAAR,CAApB;AAEA;;AAED,SAAO,IAAP;AAEA,EA3F6B;;AA6F9BsoB,uBAAsB,YAAY;;AAEjC,MAAI/Y,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASiW,oBAAT,CAA+BpY,MAA/B,EAAuCqY,IAAvC,EAA8C;;AAEpD,OAAIC,WAAWjZ,GAAG7C,IAAH,CAAS6b,IAAT,EAAgB7a,cAAhB,CAAgC,GAAhC,CAAf;;AAEA,QAAK5D,GAAL,CAAS4C,IAAT,CAAewD,MAAf,EAAwB5C,GAAxB,CAA6Bkb,QAA7B;AACA,QAAKze,GAAL,CAAS2C,IAAT,CAAewD,MAAf,EAAwBtD,GAAxB,CAA6B4b,QAA7B;;AAEA,UAAO,IAAP;AAEA,GATD;AAWA,EAfqB,EA7FQ;;AA8G9BC,gBAAe,UAAWC,MAAX,EAAoB;;AAElC,OAAKP,SAAL;;AAEA,SAAO,KAAKQ,cAAL,CAAqBD,MAArB,CAAP;AAEA,EApH6B;;AAsH9Blc,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EA1H6B;;AA4H9BA,OAAM,UAAWkc,GAAX,EAAiB;;AAEtB,OAAK9e,GAAL,CAAS4C,IAAT,CAAekc,IAAI9e,GAAnB;AACA,OAAKC,GAAL,CAAS2C,IAAT,CAAekc,IAAI7e,GAAnB;;AAEA,SAAO,IAAP;AAEA,EAnI6B;;AAqI9Boe,YAAW,YAAY;;AAEtB,OAAKre,GAAL,CAASjM,CAAT,GAAa,KAAKiM,GAAL,CAASW,CAAT,GAAa,KAAKX,GAAL,CAASqI,CAAT,GAAa,CAAEoV,QAAzC;AACA,OAAKxd,GAAL,CAASlM,CAAT,GAAa,KAAKkM,GAAL,CAASU,CAAT,GAAa,KAAKV,GAAL,CAASoI,CAAT,GAAa,CAAEoV,QAAzC;;AAEA,SAAO,IAAP;AAEA,EA5I6B;;AA8I9BsB,UAAS,YAAY;;AAEpB;;AAEA,SAAS,KAAK9e,GAAL,CAASlM,CAAT,GAAa,KAAKiM,GAAL,CAASjM,CAAxB,IAAiC,KAAKkM,GAAL,CAASU,CAAT,GAAa,KAAKX,GAAL,CAASW,CAAvD,IAAgE,KAAKV,GAAL,CAASoI,CAAT,GAAa,KAAKrI,GAAL,CAASqI,CAA7F;AAEA,EApJ6B;;AAsJ9B2W,YAAW,UAAWxqB,MAAX,EAAoB;;AAE9B,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,iDAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO,KAAKwW,OAAL,KAAiBvqB,OAAOyN,GAAP,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB,CAAjB,GAAyCzN,OAAO0O,UAAP,CAAmB,KAAKlD,GAAxB,EAA6B,KAAKC,GAAlC,EAAwC2D,cAAxC,CAAwD,GAAxD,CAAhD;AAEA,EAjK6B;;AAmK9Bqb,UAAS,UAAWzqB,MAAX,EAAoB;;AAE5B,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,+CAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO,KAAKwW,OAAL,KAAiBvqB,OAAOyN,GAAP,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB,CAAjB,GAAyCzN,OAAOiP,UAAP,CAAmB,KAAKxD,GAAxB,EAA6B,KAAKD,GAAlC,CAAhD;AAEA,EA9K6B;;AAgL9Bue,gBAAe,UAAWW,KAAX,EAAmB;;AAEjC,OAAKlf,GAAL,CAASA,GAAT,CAAckf,KAAd;AACA,OAAKjf,GAAL,CAASA,GAAT,CAAcif,KAAd;;AAEA,SAAO,IAAP;AAEA,EAvL6B;;AAyL9BC,iBAAgB,UAAWnP,MAAX,EAAoB;;AAEnC,OAAKhQ,GAAL,CAASwD,GAAT,CAAcwM,MAAd;AACA,OAAK/P,GAAL,CAAS6C,GAAT,CAAckN,MAAd;;AAEA,SAAO,IAAP;AAEA,EAhM6B;;AAkM9BoP,iBAAgB,UAAWhd,MAAX,EAAoB;;AAEnC,OAAKpC,GAAL,CAASmD,SAAT,CAAoB,CAAEf,MAAtB;AACA,OAAKnC,GAAL,CAASkD,SAAT,CAAoBf,MAApB;;AAEA,SAAO,IAAP;AAEA,EAzM6B;;AA2M9Byc,iBAAgB,YAAY;;AAE3B;AACA;;AAEA,MAAIQ,KAAJ,EAAWnpB,CAAX,EAAcC,CAAd;;AAEA,MAAIsP,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,WAAS+W,QAAT,CAAmBC,IAAnB,EAA0B;;AAEzB,OAAIC,WAAWD,KAAKC,QAApB;;AAEA,OAAKA,aAAajsB,SAAlB,EAA8B;;AAE7B,QAAKisB,SAASC,UAAd,EAA2B;;AAE1B,SAAIC,WAAWF,SAASE,QAAxB;;AAEA,UAAMxpB,IAAI,CAAJ,EAAOC,IAAIupB,SAAS7qB,MAA1B,EAAkCqB,IAAIC,CAAtC,EAAyCD,GAAzC,EAAgD;;AAE/CuP,SAAG7C,IAAH,CAAS8c,SAAUxpB,CAAV,CAAT;AACAuP,SAAGkH,YAAH,CAAiB4S,KAAKlJ,WAAtB;;AAEAgJ,YAAMd,aAAN,CAAqB9Y,EAArB;AAEA;AAED,KAbD,MAaO,IAAK+Z,SAASG,gBAAd,EAAiC;;AAEvC,SAAI3Z,YAAYwZ,SAASI,UAAT,CAAoBlR,QAApC;;AAEA,SAAK1I,cAAczS,SAAnB,EAA+B;;AAE9B,WAAM2C,IAAI,CAAJ,EAAOC,IAAI6P,UAAUyG,KAA3B,EAAkCvW,IAAIC,CAAtC,EAAyCD,GAAzC,EAAgD;;AAE/CuP,UAAGM,mBAAH,CAAwBC,SAAxB,EAAmC9P,CAAnC,EAAuCyW,YAAvC,CAAqD4S,KAAKlJ,WAA1D;;AAEAgJ,aAAMd,aAAN,CAAqB9Y,EAArB;AAEA;AAED;AAED;AAED;AAED;;AAED,SAAO,SAASoZ,cAAT,CAAyBD,MAAzB,EAAkC;;AAExCS,WAAQ,IAAR;;AAEAT,UAAOiB,iBAAP,CAA0B,IAA1B;;AAEAjB,UAAOU,QAAP,CAAiBA,QAAjB;;AAEA,UAAO,IAAP;AAEA,GAVD;AAYA,EA9De,EA3Mc;;AA2Q9BQ,gBAAe,UAAWZ,KAAX,EAAmB;;AAEjC,SAAOA,MAAMnrB,CAAN,GAAU,KAAKiM,GAAL,CAASjM,CAAnB,IAAwBmrB,MAAMnrB,CAAN,GAAU,KAAKkM,GAAL,CAASlM,CAA3C,IACNmrB,MAAMve,CAAN,GAAU,KAAKX,GAAL,CAASW,CADb,IACkBue,MAAMve,CAAN,GAAU,KAAKV,GAAL,CAASU,CADrC,IAENue,MAAM7W,CAAN,GAAU,KAAKrI,GAAL,CAASqI,CAFb,IAEkB6W,MAAM7W,CAAN,GAAU,KAAKpI,GAAL,CAASoI,CAFrC,GAEyC,KAFzC,GAEiD,IAFxD;AAIA,EAjR6B;;AAmR9B0X,cAAa,UAAWjB,GAAX,EAAiB;;AAE7B,SAAO,KAAK9e,GAAL,CAASjM,CAAT,IAAc+qB,IAAI9e,GAAJ,CAAQjM,CAAtB,IAA2B+qB,IAAI7e,GAAJ,CAAQlM,CAAR,IAAa,KAAKkM,GAAL,CAASlM,CAAjD,IACN,KAAKiM,GAAL,CAASW,CAAT,IAAcme,IAAI9e,GAAJ,CAAQW,CADhB,IACqBme,IAAI7e,GAAJ,CAAQU,CAAR,IAAa,KAAKV,GAAL,CAASU,CAD3C,IAEN,KAAKX,GAAL,CAASqI,CAAT,IAAcyW,IAAI9e,GAAJ,CAAQqI,CAFhB,IAEqByW,IAAI7e,GAAJ,CAAQoI,CAAR,IAAa,KAAKpI,GAAL,CAASoI,CAFlD;AAIA,EAzR6B;;AA2R9B2X,eAAc,UAAWd,KAAX,EAAkB1qB,MAAlB,EAA2B;;AAExC;AACA;;AAEA,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,oDAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO/T,OAAOyN,GAAP,CACN,CAAEid,MAAMnrB,CAAN,GAAU,KAAKiM,GAAL,CAASjM,CAArB,KAA6B,KAAKkM,GAAL,CAASlM,CAAT,GAAa,KAAKiM,GAAL,CAASjM,CAAnD,CADM,EAEN,CAAEmrB,MAAMve,CAAN,GAAU,KAAKX,GAAL,CAASW,CAArB,KAA6B,KAAKV,GAAL,CAASU,CAAT,GAAa,KAAKX,GAAL,CAASW,CAAnD,CAFM,EAGN,CAAEue,MAAM7W,CAAN,GAAU,KAAKrI,GAAL,CAASqI,CAArB,KAA6B,KAAKpI,GAAL,CAASoI,CAAT,GAAa,KAAKrI,GAAL,CAASqI,CAAnD,CAHM,CAAP;AAMA,EA7S6B;;AA+S9B4X,gBAAe,UAAWnB,GAAX,EAAiB;;AAE/B;AACA,SAAOA,IAAI7e,GAAJ,CAAQlM,CAAR,GAAY,KAAKiM,GAAL,CAASjM,CAArB,IAA0B+qB,IAAI9e,GAAJ,CAAQjM,CAAR,GAAY,KAAKkM,GAAL,CAASlM,CAA/C,IACN+qB,IAAI7e,GAAJ,CAAQU,CAAR,GAAY,KAAKX,GAAL,CAASW,CADf,IACoBme,IAAI9e,GAAJ,CAAQW,CAAR,GAAY,KAAKV,GAAL,CAASU,CADzC,IAENme,IAAI7e,GAAJ,CAAQoI,CAAR,GAAY,KAAKrI,GAAL,CAASqI,CAFf,IAEoByW,IAAI9e,GAAJ,CAAQqI,CAAR,GAAY,KAAKpI,GAAL,CAASoI,CAFzC,GAE6C,KAF7C,GAEqD,IAF5D;AAIA,EAtT6B;;AAwT9B6X,mBAAoB,YAAY;;AAE/B,MAAIC,eAAe,IAAI5X,OAAJ,EAAnB;;AAEA,SAAO,SAAS2X,gBAAT,CAA2BE,MAA3B,EAAoC;;AAE1C;AACA,QAAKC,UAAL,CAAiBD,OAAOha,MAAxB,EAAgC+Z,YAAhC;;AAEA;AACA,UAAOA,aAAajb,iBAAb,CAAgCkb,OAAOha,MAAvC,KAAqDga,OAAO1I,MAAP,GAAgB0I,OAAO1I,MAAnF;AAEA,GARD;AAUA,EAdiB,EAxTY;;AAwU9B4I,kBAAiB,UAAWC,KAAX,EAAmB;;AAEnC;AACA;;AAEA,MAAIvgB,GAAJ,EAASC,GAAT;;AAEA,MAAKsgB,MAAMpJ,MAAN,CAAapjB,CAAb,GAAiB,CAAtB,EAA0B;;AAEzBiM,SAAMugB,MAAMpJ,MAAN,CAAapjB,CAAb,GAAiB,KAAKiM,GAAL,CAASjM,CAAhC;AACAkM,SAAMsgB,MAAMpJ,MAAN,CAAapjB,CAAb,GAAiB,KAAKkM,GAAL,CAASlM,CAAhC;AAEA,GALD,MAKO;;AAENiM,SAAMugB,MAAMpJ,MAAN,CAAapjB,CAAb,GAAiB,KAAKkM,GAAL,CAASlM,CAAhC;AACAkM,SAAMsgB,MAAMpJ,MAAN,CAAapjB,CAAb,GAAiB,KAAKiM,GAAL,CAASjM,CAAhC;AAEA;;AAED,MAAKwsB,MAAMpJ,MAAN,CAAaxW,CAAb,GAAiB,CAAtB,EAA0B;;AAEzBX,UAAOugB,MAAMpJ,MAAN,CAAaxW,CAAb,GAAiB,KAAKX,GAAL,CAASW,CAAjC;AACAV,UAAOsgB,MAAMpJ,MAAN,CAAaxW,CAAb,GAAiB,KAAKV,GAAL,CAASU,CAAjC;AAEA,GALD,MAKO;;AAENX,UAAOugB,MAAMpJ,MAAN,CAAaxW,CAAb,GAAiB,KAAKV,GAAL,CAASU,CAAjC;AACAV,UAAOsgB,MAAMpJ,MAAN,CAAaxW,CAAb,GAAiB,KAAKX,GAAL,CAASW,CAAjC;AAEA;;AAED,MAAK4f,MAAMpJ,MAAN,CAAa9O,CAAb,GAAiB,CAAtB,EAA0B;;AAEzBrI,UAAOugB,MAAMpJ,MAAN,CAAa9O,CAAb,GAAiB,KAAKrI,GAAL,CAASqI,CAAjC;AACApI,UAAOsgB,MAAMpJ,MAAN,CAAa9O,CAAb,GAAiB,KAAKpI,GAAL,CAASoI,CAAjC;AAEA,GALD,MAKO;;AAENrI,UAAOugB,MAAMpJ,MAAN,CAAa9O,CAAb,GAAiB,KAAKpI,GAAL,CAASoI,CAAjC;AACApI,UAAOsgB,MAAMpJ,MAAN,CAAa9O,CAAb,GAAiB,KAAKrI,GAAL,CAASqI,CAAjC;AAEA;;AAED,SAASrI,OAAOugB,MAAMC,QAAb,IAAyBvgB,OAAOsgB,MAAMC,QAA/C;AAEA,EArX6B;;AAuX9BC,qBAAsB,YAAY;;AAEjC;AACA,MAAIC,KAAK,IAAInY,OAAJ,EAAT;AACA,MAAI9C,KAAK,IAAI8C,OAAJ,EAAT;AACA,MAAI7C,KAAK,IAAI6C,OAAJ,EAAT;;AAEA;AACA,MAAIoY,KAAK,IAAIpY,OAAJ,EAAT;AACA,MAAIqY,KAAK,IAAIrY,OAAJ,EAAT;AACA,MAAIsY,KAAK,IAAItY,OAAJ,EAAT;;AAEA,MAAIuY,WAAW,IAAIvY,OAAJ,EAAf;;AAEA,MAAInC,SAAS,IAAImC,OAAJ,EAAb;AACA,MAAIwY,UAAU,IAAIxY,OAAJ,EAAd;;AAEA,MAAIyY,iBAAiB,IAAIzY,OAAJ,EAArB;;AAEA,WAAS0Y,UAAT,CAAqBC,IAArB,EAA4B;;AAE3B,OAAIhrB,CAAJ,EAAOirB,CAAP;;AAEA,QAAMjrB,IAAI,CAAJ,EAAOirB,IAAID,KAAKrsB,MAAL,GAAc,CAA/B,EAAkCqB,KAAKirB,CAAvC,EAA0CjrB,KAAK,CAA/C,EAAmD;;AAElD4qB,aAASlb,SAAT,CAAoBsb,IAApB,EAA0BhrB,CAA1B;AACA;AACA,QAAI4d,IAAIiN,QAAQhtB,CAAR,GAAYP,KAAKqR,GAAL,CAAUic,SAAS/sB,CAAnB,CAAZ,GAAqCgtB,QAAQpgB,CAAR,GAAYnN,KAAKqR,GAAL,CAAUic,SAASngB,CAAnB,CAAjD,GAA0EogB,QAAQ1Y,CAAR,GAAY7U,KAAKqR,GAAL,CAAUic,SAASzY,CAAnB,CAA9F;AACA;AACA,QAAI+Y,KAAKV,GAAGjc,GAAH,CAAQqc,QAAR,CAAT;AACA,QAAIO,KAAK5b,GAAGhB,GAAH,CAAQqc,QAAR,CAAT;AACA,QAAIQ,KAAK5b,GAAGjB,GAAH,CAAQqc,QAAR,CAAT;AACA;AACA,QAAKttB,KAAKyM,GAAL,CAAU,CAAEzM,KAAKyM,GAAL,CAAUmhB,EAAV,EAAcC,EAAd,EAAkBC,EAAlB,CAAZ,EAAoC9tB,KAAKwM,GAAL,CAAUohB,EAAV,EAAcC,EAAd,EAAkBC,EAAlB,CAApC,IAA+DxN,CAApE,EAAwE;;AAEvE;AACA;AACA,YAAO,KAAP;AAEA;AAED;;AAED,UAAO,IAAP;AAEA;;AAED,SAAO,SAAS2M,kBAAT,CAA6Bc,QAA7B,EAAwC;;AAE9C,OAAK,KAAKxC,OAAL,EAAL,EAAsB;;AAErB,WAAO,KAAP;AAEA;;AAED;AACA,QAAKC,SAAL,CAAgB5Y,MAAhB;AACA2a,WAAQtd,UAAR,CAAoB,KAAKxD,GAAzB,EAA8BmG,MAA9B;;AAEA;AACAsa,MAAGjd,UAAH,CAAe8d,SAASle,CAAxB,EAA2B+C,MAA3B;AACAX,MAAGhC,UAAH,CAAe8d,SAASje,CAAxB,EAA2B8C,MAA3B;AACAV,MAAGjC,UAAH,CAAe8d,SAASlb,CAAxB,EAA2BD,MAA3B;;AAEA;AACAua,MAAGld,UAAH,CAAegC,EAAf,EAAmBib,EAAnB;AACAE,MAAGnd,UAAH,CAAeiC,EAAf,EAAmBD,EAAnB;AACAob,MAAGpd,UAAH,CAAeid,EAAf,EAAmBhb,EAAnB;;AAEA;AACA;AACA;AACA,OAAIwb,OAAO,CACV,CADU,EACP,CAAEP,GAAGtY,CADE,EACCsY,GAAGhgB,CADJ,EACO,CADP,EACU,CAAEigB,GAAGvY,CADf,EACkBuY,GAAGjgB,CADrB,EACwB,CADxB,EAC2B,CAAEkgB,GAAGxY,CADhC,EACmCwY,GAAGlgB,CADtC,EAEVggB,GAAGtY,CAFO,EAEJ,CAFI,EAED,CAAEsY,GAAG5sB,CAFJ,EAEO6sB,GAAGvY,CAFV,EAEa,CAFb,EAEgB,CAAEuY,GAAG7sB,CAFrB,EAEwB8sB,GAAGxY,CAF3B,EAE8B,CAF9B,EAEiC,CAAEwY,GAAG9sB,CAFtC,EAGV,CAAE4sB,GAAGhgB,CAHK,EAGFggB,GAAG5sB,CAHD,EAGI,CAHJ,EAGO,CAAE6sB,GAAGjgB,CAHZ,EAGeigB,GAAG7sB,CAHlB,EAGqB,CAHrB,EAGwB,CAAE8sB,GAAGlgB,CAH7B,EAGgCkgB,GAAG9sB,CAHnC,EAGsC,CAHtC,CAAX;AAKA,OAAK,CAAEktB,WAAYC,IAAZ,CAAP,EAA4B;;AAE3B,WAAO,KAAP;AAEA;;AAED;AACAA,UAAO,CAAE,CAAF,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAX,EAAc,CAAd,EAAiB,CAAjB,EAAoB,CAApB,EAAuB,CAAvB,EAA0B,CAA1B,CAAP;AACA,OAAK,CAAED,WAAYC,IAAZ,CAAP,EAA4B;;AAE3B,WAAO,KAAP;AAEA;;AAED;AACA;AACAF,kBAAe3W,YAAf,CAA6BsW,EAA7B,EAAiCC,EAAjC;AACAM,UAAO,CAAEF,eAAejtB,CAAjB,EAAoBitB,eAAergB,CAAnC,EAAsCqgB,eAAe3Y,CAArD,CAAP;AACA,UAAO4Y,WAAYC,IAAZ,CAAP;AAEA,GAlDD;AAoDA,EAnGmB,EAvXU;;AA4d9Bb,aAAY,UAAWnB,KAAX,EAAkB1qB,MAAlB,EAA2B;;AAEtC,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,kDAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO/T,OAAOoO,IAAP,CAAasc,KAAb,EAAqBnf,KAArB,CAA4B,KAAKC,GAAjC,EAAsC,KAAKC,GAA3C,CAAP;AAEA,EAve6B;;AAye9BuhB,kBAAiB,YAAY;;AAE5B,MAAI/b,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASiZ,eAAT,CAA0BtC,KAA1B,EAAkC;;AAExC,OAAIuC,eAAehc,GAAG7C,IAAH,CAASsc,KAAT,EAAiBnf,KAAjB,CAAwB,KAAKC,GAA7B,EAAkC,KAAKC,GAAvC,CAAnB;AACA,UAAOwhB,aAAaje,GAAb,CAAkB0b,KAAlB,EAA0BrqB,MAA1B,EAAP;AAEA,GALD;AAOA,EAXgB,EAzea;;AAsf9B6sB,oBAAmB,YAAY;;AAE9B,MAAIjc,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASmZ,iBAAT,CAA4BltB,MAA5B,EAAqC;;AAE3C,OAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,yDAAd;AACAzO,aAAS,IAAImtB,MAAJ,EAAT;AAEA;;AAED,QAAK3C,SAAL,CAAgBxqB,OAAO4R,MAAvB;;AAEA5R,UAAOkjB,MAAP,GAAgB,KAAKuH,OAAL,CAAcxZ,EAAd,EAAmB5Q,MAAnB,KAA8B,GAA9C;;AAEA,UAAOL,MAAP;AAEA,GAfD;AAiBA,EArBkB,EAtfW;;AA6gB9BotB,YAAW,UAAW9C,GAAX,EAAiB;;AAE3B,OAAK9e,GAAL,CAASC,GAAT,CAAc6e,IAAI9e,GAAlB;AACA,OAAKC,GAAL,CAASD,GAAT,CAAc8e,IAAI7e,GAAlB;;AAEA;AACA,MAAK,KAAK8e,OAAL,EAAL,EAAsB,KAAKV,SAAL;;AAEtB,SAAO,IAAP;AAEA,EAvhB6B;;AAyhB9BwD,QAAO,UAAW/C,GAAX,EAAiB;;AAEvB,OAAK9e,GAAL,CAASA,GAAT,CAAc8e,IAAI9e,GAAlB;AACA,OAAKC,GAAL,CAASA,GAAT,CAAc6e,IAAI7e,GAAlB;;AAEA,SAAO,IAAP;AAEA,EAhiB6B;;AAkiB9B0M,eAAc,UAAWsD,MAAX,EAAoB;;AAEjC;AACA,MAAK,KAAK8O,OAAL,EAAL,EAAuB,OAAO,IAAP;;AAEvB,MAAI3e,IAAI6P,OAAOhM,QAAf;;AAEA,MAAI6d,MAAM1hB,EAAG,CAAH,IAAS,KAAKJ,GAAL,CAASjM,CAA5B;AAAA,MAA+BguB,MAAM3hB,EAAG,CAAH,IAAS,KAAKJ,GAAL,CAASjM,CAAvD;AAAA,MAA0DiuB,MAAM5hB,EAAG,CAAH,IAAS,KAAKJ,GAAL,CAASjM,CAAlF;AACA,MAAIkuB,MAAM7hB,EAAG,CAAH,IAAS,KAAKH,GAAL,CAASlM,CAA5B;AAAA,MAA+BmuB,MAAM9hB,EAAG,CAAH,IAAS,KAAKH,GAAL,CAASlM,CAAvD;AAAA,MAA0DouB,MAAM/hB,EAAG,CAAH,IAAS,KAAKH,GAAL,CAASlM,CAAlF;AACA,MAAIquB,MAAMhiB,EAAG,CAAH,IAAS,KAAKJ,GAAL,CAASW,CAA5B;AAAA,MAA+B0hB,MAAMjiB,EAAG,CAAH,IAAS,KAAKJ,GAAL,CAASW,CAAvD;AAAA,MAA0D2hB,MAAMliB,EAAG,CAAH,IAAS,KAAKJ,GAAL,CAASW,CAAlF;AACA,MAAI4hB,MAAMniB,EAAG,CAAH,IAAS,KAAKH,GAAL,CAASU,CAA5B;AAAA,MAA+B6hB,MAAMpiB,EAAG,CAAH,IAAS,KAAKH,GAAL,CAASU,CAAvD;AAAA,MAA0D8hB,MAAMriB,EAAG,CAAH,IAAS,KAAKH,GAAL,CAASU,CAAlF;AACA,MAAI+hB,MAAMtiB,EAAG,CAAH,IAAS,KAAKJ,GAAL,CAASqI,CAA5B;AAAA,MAA+Bsa,MAAMviB,EAAG,CAAH,IAAS,KAAKJ,GAAL,CAASqI,CAAvD;AAAA,MAA0Dua,MAAMxiB,EAAG,EAAH,IAAU,KAAKJ,GAAL,CAASqI,CAAnF;AACA,MAAIwa,MAAMziB,EAAG,CAAH,IAAS,KAAKH,GAAL,CAASoI,CAA5B;AAAA,MAA+Bya,MAAM1iB,EAAG,CAAH,IAAS,KAAKH,GAAL,CAASoI,CAAvD;AAAA,MAA0D0a,MAAM3iB,EAAG,EAAH,IAAU,KAAKH,GAAL,CAASoI,CAAnF;;AAEA,OAAKrI,GAAL,CAASjM,CAAT,GAAaP,KAAKwM,GAAL,CAAU8hB,GAAV,EAAeG,GAAf,IAAuBzuB,KAAKwM,GAAL,CAAUoiB,GAAV,EAAeG,GAAf,CAAvB,GAA8C/uB,KAAKwM,GAAL,CAAU0iB,GAAV,EAAeG,GAAf,CAA9C,GAAqEziB,EAAG,EAAH,CAAlF;AACA,OAAKJ,GAAL,CAASW,CAAT,GAAanN,KAAKwM,GAAL,CAAU+hB,GAAV,EAAeG,GAAf,IAAuB1uB,KAAKwM,GAAL,CAAUqiB,GAAV,EAAeG,GAAf,CAAvB,GAA8ChvB,KAAKwM,GAAL,CAAU2iB,GAAV,EAAeG,GAAf,CAA9C,GAAqE1iB,EAAG,EAAH,CAAlF;AACA,OAAKJ,GAAL,CAASqI,CAAT,GAAa7U,KAAKwM,GAAL,CAAUgiB,GAAV,EAAeG,GAAf,IAAuB3uB,KAAKwM,GAAL,CAAUsiB,GAAV,EAAeG,GAAf,CAAvB,GAA8CjvB,KAAKwM,GAAL,CAAU4iB,GAAV,EAAeG,GAAf,CAA9C,GAAqE3iB,EAAG,EAAH,CAAlF;AACA,OAAKH,GAAL,CAASlM,CAAT,GAAaP,KAAKyM,GAAL,CAAU6hB,GAAV,EAAeG,GAAf,IAAuBzuB,KAAKyM,GAAL,CAAUmiB,GAAV,EAAeG,GAAf,CAAvB,GAA8C/uB,KAAKyM,GAAL,CAAUyiB,GAAV,EAAeG,GAAf,CAA9C,GAAqEziB,EAAG,EAAH,CAAlF;AACA,OAAKH,GAAL,CAASU,CAAT,GAAanN,KAAKyM,GAAL,CAAU8hB,GAAV,EAAeG,GAAf,IAAuB1uB,KAAKyM,GAAL,CAAUoiB,GAAV,EAAeG,GAAf,CAAvB,GAA8ChvB,KAAKyM,GAAL,CAAU0iB,GAAV,EAAeG,GAAf,CAA9C,GAAqE1iB,EAAG,EAAH,CAAlF;AACA,OAAKH,GAAL,CAASoI,CAAT,GAAa7U,KAAKyM,GAAL,CAAU+hB,GAAV,EAAeG,GAAf,IAAuB3uB,KAAKyM,GAAL,CAAUqiB,GAAV,EAAeG,GAAf,CAAvB,GAA8CjvB,KAAKyM,GAAL,CAAU2iB,GAAV,EAAeG,GAAf,CAA9C,GAAqE3iB,EAAG,EAAH,CAAlF;;AAEA,SAAO,IAAP;AAEA,EAzjB6B;;AA2jB9BsY,YAAW,UAAW7S,MAAX,EAAoB;;AAE9B,OAAK7F,GAAL,CAAS8C,GAAT,CAAc+C,MAAd;AACA,OAAK5F,GAAL,CAAS6C,GAAT,CAAc+C,MAAd;;AAEA,SAAO,IAAP;AAEA,EAlkB6B;;AAokB9BF,SAAQ,UAAWmZ,GAAX,EAAiB;;AAExB,SAAOA,IAAI9e,GAAJ,CAAQ2F,MAAR,CAAgB,KAAK3F,GAArB,KAA8B8e,IAAI7e,GAAJ,CAAQ0F,MAAR,CAAgB,KAAK1F,GAArB,CAArC;AAEA;;AAxkB6B,CAA/B;;AA4kBA;;;;;AAKA,SAAS0hB,MAAT,CAAiBvb,MAAjB,EAAyBsR,MAAzB,EAAkC;;AAEjC,MAAKtR,MAAL,GAAgBA,WAAW7S,SAAb,GAA2B6S,MAA3B,GAAoC,IAAImC,OAAJ,EAAlD;AACA,MAAKmP,MAAL,GAAgBA,WAAWnkB,SAAb,GAA2BmkB,MAA3B,GAAoC,CAAlD;AAEA;;AAEDxjB,OAAOK,MAAP,CAAeotB,OAAO1tB,SAAtB,EAAiC;;AAEhCgO,MAAK,UAAWmE,MAAX,EAAmBsR,MAAnB,EAA4B;;AAEhC,OAAKtR,MAAL,CAAYxD,IAAZ,CAAkBwD,MAAlB;AACA,OAAKsR,MAAL,GAAcA,MAAd;;AAEA,SAAO,IAAP;AAEA,EAT+B;;AAWhCyG,gBAAe,YAAY;;AAE1B,MAAIW,MAAM,IAAItB,IAAJ,EAAV;;AAEA,SAAO,SAASW,aAAT,CAAwBC,MAAxB,EAAgC4E,cAAhC,EAAiD;;AAEvD,OAAI5c,SAAS,KAAKA,MAAlB;;AAEA,OAAK4c,mBAAmBzvB,SAAxB,EAAoC;;AAEnC6S,WAAOxD,IAAP,CAAaogB,cAAb;AAEA,IAJD,MAIO;;AAENlE,QAAIX,aAAJ,CAAmBC,MAAnB,EAA4BY,SAA5B,CAAuC5Y,MAAvC;AAEA;;AAED,OAAI6c,cAAc,CAAlB;;AAEA,QAAM,IAAI/sB,IAAI,CAAR,EAAWooB,KAAKF,OAAOvpB,MAA7B,EAAqCqB,IAAIooB,EAAzC,EAA6CpoB,GAA7C,EAAoD;;AAEnD+sB,kBAAczvB,KAAKyM,GAAL,CAAUgjB,WAAV,EAAuB7c,OAAOlB,iBAAP,CAA0BkZ,OAAQloB,CAAR,CAA1B,CAAvB,CAAd;AAEA;;AAED,QAAKwhB,MAAL,GAAclkB,KAAKmR,IAAL,CAAWse,WAAX,CAAd;;AAEA,UAAO,IAAP;AAEA,GA1BD;AA4BA,EAhCc,EAXiB;;AA6ChCvgB,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EAjD+B;;AAmDhCA,OAAM,UAAWwd,MAAX,EAAoB;;AAEzB,OAAKha,MAAL,CAAYxD,IAAZ,CAAkBwd,OAAOha,MAAzB;AACA,OAAKsR,MAAL,GAAc0I,OAAO1I,MAArB;;AAEA,SAAO,IAAP;AAEA,EA1D+B;;AA4DhCwL,QAAO,YAAY;;AAElB,SAAS,KAAKxL,MAAL,IAAe,CAAxB;AAEA,EAhE+B;;AAkEhCoI,gBAAe,UAAWZ,KAAX,EAAmB;;AAEjC,SAASA,MAAMha,iBAAN,CAAyB,KAAKkB,MAA9B,KAA4C,KAAKsR,MAAL,GAAc,KAAKA,MAAxE;AAEA,EAtE+B;;AAwEhC8J,kBAAiB,UAAWtC,KAAX,EAAmB;;AAEnC,SAASA,MAAMja,UAAN,CAAkB,KAAKmB,MAAvB,IAAkC,KAAKsR,MAAhD;AAEA,EA5E+B;;AA8EhCwI,mBAAkB,UAAWE,MAAX,EAAoB;;AAErC,MAAI+C,YAAY,KAAKzL,MAAL,GAAc0I,OAAO1I,MAArC;;AAEA,SAAO0I,OAAOha,MAAP,CAAclB,iBAAd,CAAiC,KAAKkB,MAAtC,KAAoD+c,YAAYA,SAAvE;AAEA,EApF+B;;AAsFhClD,gBAAe,UAAWnB,GAAX,EAAiB;;AAE/B,SAAOA,IAAIoB,gBAAJ,CAAsB,IAAtB,CAAP;AAEA,EA1F+B;;AA4FhCI,kBAAiB,UAAWC,KAAX,EAAmB;;AAEnC,SAAO/sB,KAAKqR,GAAL,CAAU0b,MAAMiB,eAAN,CAAuB,KAAKpb,MAA5B,CAAV,KAAoD,KAAKsR,MAAhE;AAEA,EAhG+B;;AAkGhC2I,aAAY,UAAWnB,KAAX,EAAkB1qB,MAAlB,EAA2B;;AAEtC,MAAI4uB,gBAAgB,KAAKhd,MAAL,CAAYlB,iBAAZ,CAA+Bga,KAA/B,CAApB;;AAEA,MAAK1qB,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,oDAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED/T,SAAOoO,IAAP,CAAasc,KAAb;;AAEA,MAAKkE,gBAAkB,KAAK1L,MAAL,GAAc,KAAKA,MAA1C,EAAqD;;AAEpDljB,UAAOgP,GAAP,CAAY,KAAK4C,MAAjB,EAA0BtB,SAA1B;AACAtQ,UAAOoP,cAAP,CAAuB,KAAK8T,MAA5B,EAAqC5U,GAArC,CAA0C,KAAKsD,MAA/C;AAEA;;AAED,SAAO5R,MAAP;AAEA,EAxH+B;;AA0HhC6uB,iBAAgB,UAAW7uB,MAAX,EAAoB;;AAEnC,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,wDAAd;AACAzO,YAAS,IAAIgpB,IAAJ,EAAT;AAEA;;AAEDhpB,SAAOyN,GAAP,CAAY,KAAKmE,MAAjB,EAAyB,KAAKA,MAA9B;AACA5R,SAAO4qB,cAAP,CAAuB,KAAK1H,MAA5B;;AAEA,SAAOljB,MAAP;AAEA,EAxI+B;;AA0IhCmY,eAAc,UAAWsD,MAAX,EAAoB;;AAEjC,OAAK7J,MAAL,CAAYuG,YAAZ,CAA0BsD,MAA1B;AACA,OAAKyH,MAAL,GAAc,KAAKA,MAAL,GAAczH,OAAOtC,iBAAP,EAA5B;;AAEA,SAAO,IAAP;AAEA,EAjJ+B;;AAmJhC+K,YAAW,UAAW7S,MAAX,EAAoB;;AAE9B,OAAKO,MAAL,CAAYtD,GAAZ,CAAiB+C,MAAjB;;AAEA,SAAO,IAAP;AAEA,EAzJ+B;;AA2JhCF,SAAQ,UAAWya,MAAX,EAAoB;;AAE3B,SAAOA,OAAOha,MAAP,CAAcT,MAAd,CAAsB,KAAKS,MAA3B,KAAyCga,OAAO1I,MAAP,KAAkB,KAAKA,MAAvE;AAEA;;AA/J+B,CAAjC;;AAmKA;;;;AAIA,SAAS4L,KAAT,CAAgBnM,MAAhB,EAAwBqJ,QAAxB,EAAmC;;AAElC;;AAEA,MAAKrJ,MAAL,GAAgBA,WAAW5jB,SAAb,GAA2B4jB,MAA3B,GAAoC,IAAI5O,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAlD;AACA,MAAKiY,QAAL,GAAkBA,aAAajtB,SAAf,GAA6BitB,QAA7B,GAAwC,CAAxD;AAEA;;AAEDtsB,OAAOK,MAAP,CAAe+uB,MAAMrvB,SAArB,EAAgC;;AAE/BgO,MAAK,UAAWkV,MAAX,EAAmBqJ,QAAnB,EAA8B;;AAElC,OAAKrJ,MAAL,CAAYvU,IAAZ,CAAkBuU,MAAlB;AACA,OAAKqJ,QAAL,GAAgBA,QAAhB;;AAEA,SAAO,IAAP;AAEA,EAT8B;;AAW/B+C,gBAAe,UAAWxvB,CAAX,EAAc4M,CAAd,EAAiB0H,CAAjB,EAAoBtF,CAApB,EAAwB;;AAEtC,OAAKoU,MAAL,CAAYlV,GAAZ,CAAiBlO,CAAjB,EAAoB4M,CAApB,EAAuB0H,CAAvB;AACA,OAAKmY,QAAL,GAAgBzd,CAAhB;;AAEA,SAAO,IAAP;AAEA,EAlB8B;;AAoB/BygB,gCAA+B,UAAWrM,MAAX,EAAmB+H,KAAnB,EAA2B;;AAEzD,OAAK/H,MAAL,CAAYvU,IAAZ,CAAkBuU,MAAlB;AACA,OAAKqJ,QAAL,GAAgB,CAAEtB,MAAMza,GAAN,CAAW,KAAK0S,MAAhB,CAAlB;;AAEA,SAAO,IAAP;AAEA,EA3B8B;;AA6B/BsM,wBAAuB,YAAY;;AAElC,MAAIhe,KAAK,IAAI8C,OAAJ,EAAT;AACA,MAAI7C,KAAK,IAAI6C,OAAJ,EAAT;;AAEA,SAAO,SAASkb,qBAAT,CAAgCpgB,CAAhC,EAAmCC,CAAnC,EAAsC+C,CAAtC,EAA0C;;AAEhD,OAAI8Q,SAAS1R,GAAGhC,UAAH,CAAe4C,CAAf,EAAkB/C,CAAlB,EAAsBkT,KAAtB,CAA6B9Q,GAAGjC,UAAH,CAAeJ,CAAf,EAAkBC,CAAlB,CAA7B,EAAqDwB,SAArD,EAAb;;AAEA;;AAEA,QAAK0e,6BAAL,CAAoCrM,MAApC,EAA4C9T,CAA5C;;AAEA,UAAO,IAAP;AAEA,GAVD;AAYA,EAjBsB,EA7BQ;;AAgD/BX,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EApD8B;;AAsD/BA,OAAM,UAAW2d,KAAX,EAAmB;;AAExB,OAAKpJ,MAAL,CAAYvU,IAAZ,CAAkB2d,MAAMpJ,MAAxB;AACA,OAAKqJ,QAAL,GAAgBD,MAAMC,QAAtB;;AAEA,SAAO,IAAP;AAEA,EA7D8B;;AA+D/B1b,YAAW,YAAY;;AAEtB;;AAEA,MAAI4e,sBAAsB,MAAM,KAAKvM,MAAL,CAAYtiB,MAAZ,EAAhC;AACA,OAAKsiB,MAAL,CAAYvT,cAAZ,CAA4B8f,mBAA5B;AACA,OAAKlD,QAAL,IAAiBkD,mBAAjB;;AAEA,SAAO,IAAP;AAEA,EAzE8B;;AA2E/Blf,SAAQ,YAAY;;AAEnB,OAAKgc,QAAL,IAAiB,CAAE,CAAnB;AACA,OAAKrJ,MAAL,CAAY3S,MAAZ;;AAEA,SAAO,IAAP;AAEA,EAlF8B;;AAoF/Bgd,kBAAiB,UAAWtC,KAAX,EAAmB;;AAEnC,SAAO,KAAK/H,MAAL,CAAY1S,GAAZ,CAAiBya,KAAjB,IAA2B,KAAKsB,QAAvC;AAEA,EAxF8B;;AA0F/BmD,mBAAkB,UAAWvD,MAAX,EAAoB;;AAErC,SAAO,KAAKoB,eAAL,CAAsBpB,OAAOha,MAA7B,IAAwCga,OAAO1I,MAAtD;AAEA,EA9F8B;;AAgG/BkM,eAAc,UAAW1E,KAAX,EAAkB1qB,MAAlB,EAA2B;;AAExC,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,qDAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO/T,OAAOoO,IAAP,CAAa,KAAKuU,MAAlB,EAA2BvT,cAA3B,CAA2C,CAAE,KAAK4d,eAAL,CAAsBtC,KAAtB,CAA7C,EAA6Epc,GAA7E,CAAkFoc,KAAlF,CAAP;AAEA,EA3G8B;;AA6G/B2E,gBAAe,YAAY;;AAE1B,MAAIpe,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASsb,aAAT,CAAwBC,IAAxB,EAA8BtvB,MAA9B,EAAuC;;AAE7C,OAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,sDAAd;AACAzO,aAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,OAAIwb,YAAYD,KAAKE,KAAL,CAAYve,EAAZ,CAAhB;;AAEA,OAAIwe,cAAc,KAAK9M,MAAL,CAAY1S,GAAZ,CAAiBsf,SAAjB,CAAlB;;AAEA,OAAKE,gBAAgB,CAArB,EAAyB;;AAExB;AACA,QAAK,KAAKzC,eAAL,CAAsBsC,KAAKI,KAA3B,MAAuC,CAA5C,EAAgD;;AAE/C,YAAO1vB,OAAOoO,IAAP,CAAakhB,KAAKI,KAAlB,CAAP;AAEA;;AAED;AACA,WAAO3wB,SAAP;AAEA;;AAED,OAAIqN,IAAI,EAAIkjB,KAAKI,KAAL,CAAWzf,GAAX,CAAgB,KAAK0S,MAArB,IAAgC,KAAKqJ,QAAzC,IAAsDyD,WAA9D;;AAEA,OAAKrjB,IAAI,CAAJ,IAASA,IAAI,CAAlB,EAAsB;;AAErB,WAAOrN,SAAP;AAEA;;AAED,UAAOiB,OAAOoO,IAAP,CAAamhB,SAAb,EAAyBngB,cAAzB,CAAyChD,CAAzC,EAA6CkC,GAA7C,CAAkDghB,KAAKI,KAAvD,CAAP;AAEA,GArCD;AAuCA,EA3Cc,EA7GgB;;AA0J/BC,iBAAgB,UAAWL,IAAX,EAAkB;;AAEjC;;AAEA,MAAIM,YAAY,KAAK5C,eAAL,CAAsBsC,KAAKI,KAA3B,CAAhB;AACA,MAAIG,UAAU,KAAK7C,eAAL,CAAsBsC,KAAKQ,GAA3B,CAAd;;AAEA,SAASF,YAAY,CAAZ,IAAiBC,UAAU,CAA7B,IAAsCA,UAAU,CAAV,IAAeD,YAAY,CAAxE;AAEA,EAnK8B;;AAqK/BnE,gBAAe,UAAWnB,GAAX,EAAiB;;AAE/B,SAAOA,IAAIwB,eAAJ,CAAqB,IAArB,CAAP;AAEA,EAzK8B;;AA2K/BJ,mBAAkB,UAAWE,MAAX,EAAoB;;AAErC,SAAOA,OAAOE,eAAP,CAAwB,IAAxB,CAAP;AAEA,EA/K8B;;AAiL/BiE,gBAAe,UAAW/vB,MAAX,EAAoB;;AAElC,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,sDAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO/T,OAAOoO,IAAP,CAAa,KAAKuU,MAAlB,EAA2BvT,cAA3B,CAA2C,CAAE,KAAK4c,QAAlD,CAAP;AAEA,EA5L8B;;AA8L/B7T,eAAc,YAAY;;AAEzB,MAAIlH,KAAK,IAAI8C,OAAJ,EAAT;AACA,MAAIic,KAAK,IAAI1M,OAAJ,EAAT;;AAEA,SAAO,SAASnL,YAAT,CAAuBsD,MAAvB,EAA+BwU,oBAA/B,EAAsD;;AAE5D,OAAIC,eAAeD,wBAAwBD,GAAGtM,eAAH,CAAoBjI,MAApB,CAA3C;;AAEA,OAAI0U,iBAAiB,KAAKJ,aAAL,CAAoB9e,EAApB,EAAyBkH,YAAzB,CAAuCsD,MAAvC,CAArB;;AAEA,OAAIkH,SAAS,KAAKA,MAAL,CAAYpT,YAAZ,CAA0B2gB,YAA1B,EAAyC5f,SAAzC,EAAb;;AAEA,QAAK0b,QAAL,GAAgB,CAAEmE,eAAelgB,GAAf,CAAoB0S,MAApB,CAAlB;;AAEA,UAAO,IAAP;AAEA,GAZD;AAcA,EAnBa,EA9LiB;;AAmN/BuB,YAAW,UAAW7S,MAAX,EAAoB;;AAE9B,OAAK2a,QAAL,IAAiB3a,OAAOpB,GAAP,CAAY,KAAK0S,MAAjB,CAAjB;;AAEA,SAAO,IAAP;AAEA,EAzN8B;;AA2N/BxR,SAAQ,UAAW4a,KAAX,EAAmB;;AAE1B,SAAOA,MAAMpJ,MAAN,CAAaxR,MAAb,CAAqB,KAAKwR,MAA1B,KAAwCoJ,MAAMC,QAAN,KAAmB,KAAKA,QAAvE;AAEA;;AA/N8B,CAAhC;;AAmOA;;;;;;AAMA,SAASoE,OAAT,CAAkBxD,EAAlB,EAAsBC,EAAtB,EAA0BC,EAA1B,EAA8BuD,EAA9B,EAAkCC,EAAlC,EAAsCC,EAAtC,EAA2C;;AAE1C,MAAKC,MAAL,GAAc,CAEX5D,OAAO7tB,SAAT,GAAuB6tB,EAAvB,GAA4B,IAAIkC,KAAJ,EAFf,EAGXjC,OAAO9tB,SAAT,GAAuB8tB,EAAvB,GAA4B,IAAIiC,KAAJ,EAHf,EAIXhC,OAAO/tB,SAAT,GAAuB+tB,EAAvB,GAA4B,IAAIgC,KAAJ,EAJf,EAKXuB,OAAOtxB,SAAT,GAAuBsxB,EAAvB,GAA4B,IAAIvB,KAAJ,EALf,EAMXwB,OAAOvxB,SAAT,GAAuBuxB,EAAvB,GAA4B,IAAIxB,KAAJ,EANf,EAOXyB,OAAOxxB,SAAT,GAAuBwxB,EAAvB,GAA4B,IAAIzB,KAAJ,EAPf,CAAd;AAWA;;AAEDpvB,OAAOK,MAAP,CAAeqwB,QAAQ3wB,SAAvB,EAAkC;;AAEjCgO,MAAK,UAAWmf,EAAX,EAAeC,EAAf,EAAmBC,EAAnB,EAAuBuD,EAAvB,EAA2BC,EAA3B,EAA+BC,EAA/B,EAAoC;;AAExC,MAAIC,SAAS,KAAKA,MAAlB;;AAEAA,SAAQ,CAAR,EAAYpiB,IAAZ,CAAkBwe,EAAlB;AACA4D,SAAQ,CAAR,EAAYpiB,IAAZ,CAAkBye,EAAlB;AACA2D,SAAQ,CAAR,EAAYpiB,IAAZ,CAAkB0e,EAAlB;AACA0D,SAAQ,CAAR,EAAYpiB,IAAZ,CAAkBiiB,EAAlB;AACAG,SAAQ,CAAR,EAAYpiB,IAAZ,CAAkBkiB,EAAlB;AACAE,SAAQ,CAAR,EAAYpiB,IAAZ,CAAkBmiB,EAAlB;;AAEA,SAAO,IAAP;AAEA,EAfgC;;AAiBjCriB,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EArBgC;;AAuBjCA,OAAM,UAAWqiB,OAAX,EAAqB;;AAE1B,MAAID,SAAS,KAAKA,MAAlB;;AAEA,OAAM,IAAI9uB,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B8uB,UAAQ9uB,CAAR,EAAY0M,IAAZ,CAAkBqiB,QAAQD,MAAR,CAAgB9uB,CAAhB,CAAlB;AAEA;;AAED,SAAO,IAAP;AAEA,EAnCgC;;AAqCjCgvB,gBAAe,UAAW9kB,CAAX,EAAe;;AAE7B,MAAI4kB,SAAS,KAAKA,MAAlB;AACA,MAAInd,KAAKzH,EAAE6D,QAAX;AACA,MAAIkhB,MAAMtd,GAAI,CAAJ,CAAV;AAAA,MAAmBud,MAAMvd,GAAI,CAAJ,CAAzB;AAAA,MAAkCwd,MAAMxd,GAAI,CAAJ,CAAxC;AAAA,MAAiDyd,MAAMzd,GAAI,CAAJ,CAAvD;AACA,MAAI0d,MAAM1d,GAAI,CAAJ,CAAV;AAAA,MAAmB2d,MAAM3d,GAAI,CAAJ,CAAzB;AAAA,MAAkC4d,MAAM5d,GAAI,CAAJ,CAAxC;AAAA,MAAiD6d,MAAM7d,GAAI,CAAJ,CAAvD;AACA,MAAI8d,MAAM9d,GAAI,CAAJ,CAAV;AAAA,MAAmB+d,MAAM/d,GAAI,CAAJ,CAAzB;AAAA,MAAkCge,OAAOhe,GAAI,EAAJ,CAAzC;AAAA,MAAmDie,OAAOje,GAAI,EAAJ,CAA1D;AACA,MAAIke,OAAOle,GAAI,EAAJ,CAAX;AAAA,MAAqBme,OAAOne,GAAI,EAAJ,CAA5B;AAAA,MAAsCoe,OAAOpe,GAAI,EAAJ,CAA7C;AAAA,MAAuDqe,OAAOre,GAAI,EAAJ,CAA9D;;AAEAmd,SAAQ,CAAR,EAAYzB,aAAZ,CAA2B+B,MAAMH,GAAjC,EAAsCO,MAAMH,GAA5C,EAAiDO,OAAOH,GAAxD,EAA6DO,OAAOH,IAApE,EAA2EjhB,SAA3E;AACAkgB,SAAQ,CAAR,EAAYzB,aAAZ,CAA2B+B,MAAMH,GAAjC,EAAsCO,MAAMH,GAA5C,EAAiDO,OAAOH,GAAxD,EAA6DO,OAAOH,IAApE,EAA2EjhB,SAA3E;AACAkgB,SAAQ,CAAR,EAAYzB,aAAZ,CAA2B+B,MAAMF,GAAjC,EAAsCM,MAAMF,GAA5C,EAAiDM,OAAOF,GAAxD,EAA6DM,OAAOF,IAApE,EAA2ElhB,SAA3E;AACAkgB,SAAQ,CAAR,EAAYzB,aAAZ,CAA2B+B,MAAMF,GAAjC,EAAsCM,MAAMF,GAA5C,EAAiDM,OAAOF,GAAxD,EAA6DM,OAAOF,IAApE,EAA2ElhB,SAA3E;AACAkgB,SAAQ,CAAR,EAAYzB,aAAZ,CAA2B+B,MAAMD,GAAjC,EAAsCK,MAAMD,GAA5C,EAAiDK,OAAOD,IAAxD,EAA8DK,OAAOD,IAArE,EAA4EnhB,SAA5E;AACAkgB,SAAQ,CAAR,EAAYzB,aAAZ,CAA2B+B,MAAMD,GAAjC,EAAsCK,MAAMD,GAA5C,EAAiDK,OAAOD,IAAxD,EAA8DK,OAAOD,IAArE,EAA4EnhB,SAA5E;;AAEA,SAAO,IAAP;AAEA,EAvDgC;;AAyDjCqhB,mBAAkB,YAAY;;AAE7B,MAAI/F,SAAS,IAAIuB,MAAJ,EAAb;;AAEA,SAAO,SAASwE,gBAAT,CAA2BvH,MAA3B,EAAoC;;AAE1C,OAAIY,WAAWZ,OAAOY,QAAtB;;AAEA,OAAKA,SAAS4G,cAAT,KAA4B,IAAjC,EACC5G,SAAS6G,qBAAT;;AAEDjG,UAAOxd,IAAP,CAAa4c,SAAS4G,cAAtB,EACEzZ,YADF,CACgBiS,OAAOvI,WADvB;;AAGA,UAAO,KAAK6J,gBAAL,CAAuBE,MAAvB,CAAP;AAEA,GAZD;AAcA,EAlBiB,EAzDe;;AA6EjCkG,mBAAkB,YAAY;;AAE7B,MAAIlG,SAAS,IAAIuB,MAAJ,EAAb;;AAEA,SAAO,SAAS2E,gBAAT,CAA2BC,MAA3B,EAAoC;;AAE1CnG,UAAOha,MAAP,CAAcnE,GAAd,CAAmB,CAAnB,EAAsB,CAAtB,EAAyB,CAAzB;AACAme,UAAO1I,MAAP,GAAgB,kBAAhB;AACA0I,UAAOzT,YAAP,CAAqB4Z,OAAOlQ,WAA5B;;AAEA,UAAO,KAAK6J,gBAAL,CAAuBE,MAAvB,CAAP;AAEA,GARD;AAUA,EAdiB,EA7Ee;;AA6FjCF,mBAAkB,UAAWE,MAAX,EAAoB;;AAErC,MAAI4E,SAAS,KAAKA,MAAlB;AACA,MAAI5e,SAASga,OAAOha,MAApB;AACA,MAAIogB,YAAY,CAAEpG,OAAO1I,MAAzB;;AAEA,OAAM,IAAIxhB,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B,OAAIuwB,WAAWzB,OAAQ9uB,CAAR,EAAYsrB,eAAZ,CAA6Bpb,MAA7B,CAAf;;AAEA,OAAKqgB,WAAWD,SAAhB,EAA4B;;AAE3B,WAAO,KAAP;AAEA;AAED;;AAED,SAAO,IAAP;AAEA,EAjHgC;;AAmHjCvG,gBAAe,YAAY;;AAE1B,MAAIoB,KAAK,IAAI9Y,OAAJ,EAAT;AAAA,MACC+Y,KAAK,IAAI/Y,OAAJ,EADN;;AAGA,SAAO,SAAS0X,aAAT,CAAwBnB,GAAxB,EAA8B;;AAEpC,OAAIkG,SAAS,KAAKA,MAAlB;;AAEA,QAAM,IAAI9uB,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B,QAAIqqB,QAAQyE,OAAQ9uB,CAAR,CAAZ;;AAEAmrB,OAAGttB,CAAH,GAAOwsB,MAAMpJ,MAAN,CAAapjB,CAAb,GAAiB,CAAjB,GAAqB+qB,IAAI9e,GAAJ,CAAQjM,CAA7B,GAAiC+qB,IAAI7e,GAAJ,CAAQlM,CAAhD;AACAutB,OAAGvtB,CAAH,GAAOwsB,MAAMpJ,MAAN,CAAapjB,CAAb,GAAiB,CAAjB,GAAqB+qB,IAAI7e,GAAJ,CAAQlM,CAA7B,GAAiC+qB,IAAI9e,GAAJ,CAAQjM,CAAhD;AACAstB,OAAG1gB,CAAH,GAAO4f,MAAMpJ,MAAN,CAAaxW,CAAb,GAAiB,CAAjB,GAAqBme,IAAI9e,GAAJ,CAAQW,CAA7B,GAAiCme,IAAI7e,GAAJ,CAAQU,CAAhD;AACA2gB,OAAG3gB,CAAH,GAAO4f,MAAMpJ,MAAN,CAAaxW,CAAb,GAAiB,CAAjB,GAAqBme,IAAI7e,GAAJ,CAAQU,CAA7B,GAAiCme,IAAI9e,GAAJ,CAAQW,CAAhD;AACA0gB,OAAGhZ,CAAH,GAAOkY,MAAMpJ,MAAN,CAAa9O,CAAb,GAAiB,CAAjB,GAAqByW,IAAI9e,GAAJ,CAAQqI,CAA7B,GAAiCyW,IAAI7e,GAAJ,CAAQoI,CAAhD;AACAiZ,OAAGjZ,CAAH,GAAOkY,MAAMpJ,MAAN,CAAa9O,CAAb,GAAiB,CAAjB,GAAqByW,IAAI7e,GAAJ,CAAQoI,CAA7B,GAAiCyW,IAAI9e,GAAJ,CAAQqI,CAAhD;;AAEA,QAAI3I,KAAK6gB,MAAMiB,eAAN,CAAuBH,EAAvB,CAAT;AACA,QAAI1hB,KAAK4gB,MAAMiB,eAAN,CAAuBF,EAAvB,CAAT;;AAEA;;AAEA,QAAK5hB,KAAK,CAAL,IAAUC,KAAK,CAApB,EAAwB;;AAEvB,YAAO,KAAP;AAEA;AAED;;AAED,UAAO,IAAP;AAEA,GA9BD;AAgCA,EArCc,EAnHkB;;AA0JjCmgB,gBAAe,UAAWZ,KAAX,EAAmB;;AAEjC,MAAI8F,SAAS,KAAKA,MAAlB;;AAEA,OAAM,IAAI9uB,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B,OAAK8uB,OAAQ9uB,CAAR,EAAYsrB,eAAZ,CAA6BtC,KAA7B,IAAuC,CAA5C,EAAgD;;AAE/C,WAAO,KAAP;AAEA;AAED;;AAED,SAAO,IAAP;AAEA;;AA1KgC,CAAlC;;AA8KA,IAAIwH,oBAAoB,kFAAxB;;AAEA,IAAIC,yBAAyB,8DAA7B;;AAEA,IAAIC,qBAAqB,0EAAzB;;AAEA,IAAIC,iBAAiB,4aAArB;;AAEA,IAAIC,sBAAsB,uFAA1B;;AAEA,IAAIC,eAAe,0CAAnB;;AAEA,IAAIC,qBAAqB,yCAAzB;;AAEA,IAAIC,QAAQ,o7LAAZ;;AAEA,IAAIC,wBAAwB,k9BAA5B;;AAEA,IAAIC,2BAA2B,0jBAA/B;;AAEA,IAAIC,gCAAgC,4LAApC;;AAEA,IAAIC,8BAA8B,qHAAlC;;AAEA,IAAIC,yBAAyB,2HAA7B;;AAEA,IAAIC,iBAAiB,yDAArB;;AAEA,IAAIC,sBAAsB,oDAA1B;;AAEA,IAAIC,oBAAoB,kDAAxB;;AAEA,IAAIC,eAAe,qDAAnB;;AAEA,IAAIC,SAAS,2rEAAb;;AAEA,IAAIC,8BAA8B,olIAAlC;;AAEA,IAAIC,uBAAuB,gIAA3B;;AAEA,IAAIC,8BAA8B,mJAAlC;;AAEA,IAAIC,yBAAyB,mKAA7B;;AAEA,IAAIC,uBAAuB,8MAA3B;;AAEA,IAAIC,4BAA4B,oEAAhC;;AAEA,IAAIC,qBAAqB,yDAAzB;;AAEA,IAAIC,0BAA0B,+uFAA9B;;AAEA,IAAIC,kBAAkB,gqDAAtB;;AAEA,IAAIC,uBAAuB,8oBAA3B;;AAEA,IAAIC,qBAAqB,gOAAzB;;AAEA,IAAIC,gBAAgB,sgBAApB;;AAEA,IAAIC,aAAa,qDAAjB;;AAEA,IAAIC,kBAAkB,qDAAtB;;AAEA,IAAIC,eAAe,8SAAnB;;AAEA,IAAIC,oBAAoB,2MAAxB;;AAEA,IAAIC,4BAA4B,yYAAhC;;AAEA,IAAIC,oBAAoB,8HAAxB;;AAEA,IAAIC,yBAAyB,gGAA7B;;AAEA,IAAIC,wBAAwB,wuEAA5B;;AAEA,IAAIC,oBAAoB,qpHAAxB;;AAEA,IAAIC,mBAAmB,k5GAAvB;;AAEA,IAAIC,wBAAwB,uMAA5B;;AAEA,IAAIC,6BAA6B,46CAAjC;;AAEA,IAAIC,2BAA2B,6iBAA/B;;AAEA,IAAIC,gCAAgC,8uJAApC;;AAEA,IAAIC,wBAAwB,6xFAA5B;;AAEA,IAAIC,uBAAuB,0yBAA3B;;AAEA,IAAIC,sBAAsB,6PAA1B;;AAEA,IAAIC,uBAAuB,yIAA3B;;AAEA,IAAIC,4BAA4B,yIAAhC;;AAEA,IAAIC,0BAA0B,uIAA9B;;AAEA,IAAIC,qBAAqB,uPAAzB;;AAEA,IAAIC,eAAe,qJAAnB;;AAEA,IAAIC,oBAAoB,oDAAxB;;AAEA,IAAIC,wBAAwB,yMAA5B;;AAEA,IAAIC,6BAA6B,iFAAjC;;AAEA,IAAIC,wBAAwB,wKAA5B;;AAEA,IAAIC,6BAA6B,oEAAjC;;AAEA,IAAIC,qBAAqB,+UAAzB;;AAEA,IAAIC,0BAA0B,0KAA9B;;AAEA,IAAIC,qBAAqB,yqBAAzB;;AAEA,IAAIC,wBAAwB,gaAA5B;;AAEA,IAAIC,uBAAuB,4LAA3B;;AAEA,IAAIC,0BAA0B,0zBAA9B;;AAEA,IAAIC,UAAU,oyCAAd;;AAEA,IAAIC,+BAA+B,6EAAnC;;AAEA,IAAIC,iBAAiB,+GAArB;;AAEA,IAAIC,qBAAqB,yFAAzB;;AAEA,IAAIC,0BAA0B,oVAA9B;;AAEA,IAAIC,wBAAwB,wKAA5B;;AAEA,IAAIC,6BAA6B,oEAAjC;;AAEA,IAAIC,0BAA0B,ipNAA9B;;AAEA,IAAIC,wBAAwB,yeAA5B;;AAEA,IAAIC,mBAAmB,qlBAAvB;;AAEA,IAAIC,2BAA2B,2wCAA/B;;AAEA,IAAIC,kBAAkB,iOAAtB;;AAEA,IAAIC,uBAAuB,2gCAA3B;;AAEA,IAAIC,kBAAkB,gYAAtB;;AAEA,IAAIC,oBAAoB,6WAAxB;;AAEA,IAAIC,uBAAuB,yLAA3B;;AAEA,IAAIC,4BAA4B,kEAAhC;;AAEA,IAAIC,uBAAuB,8FAA3B;;AAEA,IAAIC,4BAA4B,+6BAAhC;;AAEA,IAAIC,mBAAmB,gQAAvB;;AAEA,IAAIC,iBAAiB,+RAArB;;AAEA,IAAIC,YAAY,wRAAhB;;AAEA,IAAIC,oBAAoB,mFAAxB;;AAEA,IAAIC,kBAAkB,0GAAtB;;AAEA,IAAIC,aAAa,4EAAjB;;AAEA,IAAIC,kBAAkB,yJAAtB;;AAEA,IAAIC,YAAY,uPAAhB;;AAEA,IAAIC,YAAY,gOAAhB;;AAEA,IAAIC,aAAa,svBAAjB;;AAEA,IAAIC,aAAa,mqBAAjB;;AAEA,IAAIC,oBAAoB,8rBAAxB;;AAEA,IAAIC,oBAAoB,mtBAAxB;;AAEA,IAAIC,gBAAgB,mXAApB;;AAEA,IAAIC,gBAAgB,8LAApB;;AAEA,IAAIC,kBAAkB,oyBAAtB;;AAEA,IAAIC,kBAAkB,ihBAAtB;;AAEA,IAAIC,iBAAiB,u8CAArB;;AAEA,IAAIC,iBAAiB,s2BAArB;;AAEA,IAAIC,mBAAmB,qnEAAvB;;AAEA,IAAIC,mBAAmB,8lCAAvB;;AAEA,IAAIC,iBAAiB,shEAArB;;AAEA,IAAIC,iBAAiB,sqCAArB;;AAEA,IAAIC,oBAAoB,gwEAAxB;;AAEA,IAAIC,oBAAoB,8mCAAxB;;AAEA,IAAIC,cAAc,gjBAAlB;;AAEA,IAAIC,cAAc,g8BAAlB;;AAEA,IAAIC,cAAc,ywBAAlB;;AAEA,IAAIC,cAAc,+mBAAlB;;AAEA,IAAIC,cAAc,gWAAlB;;AAEA,IAAIC,cAAc,gOAAlB;;AAEA,IAAIC,cAAc;AACjBjH,oBAAmBA,iBADF;AAEjBC,yBAAwBA,sBAFP;AAGjBC,qBAAoBA,kBAHH;AAIjBC,iBAAgBA,cAJC;AAKjBC,sBAAqBA,mBALJ;AAMjBC,eAAcA,YANG;AAOjBC,qBAAoBA,kBAPH;AAQjBC,QAAOA,KARU;AASjBC,wBAAuBA,qBATN;AAUjBC,2BAA0BA,wBAVT;AAWjBC,gCAA+BA,6BAXd;AAYjBC,8BAA6BA,2BAZZ;AAajBC,yBAAwBA,sBAbP;AAcjBC,iBAAgBA,cAdC;AAejBC,sBAAqBA,mBAfJ;AAgBjBC,oBAAmBA,iBAhBF;AAiBjBC,eAAcA,YAjBG;AAkBjBC,SAAQA,MAlBS;AAmBjBC,8BAA6BA,2BAnBZ;AAoBjBC,uBAAsBA,oBApBL;AAqBjBC,8BAA6BA,2BArBZ;AAsBjBC,yBAAwBA,sBAtBP;AAuBjBC,uBAAsBA,oBAvBL;AAwBjBC,4BAA2BA,yBAxBV;AAyBjBC,qBAAoBA,kBAzBH;AA0BjBC,0BAAyBA,uBA1BR;AA2BjBC,kBAAiBA,eA3BA;AA4BjBC,uBAAsBA,oBA5BL;AA6BjBC,qBAAoBA,kBA7BH;AA8BjBC,gBAAeA,aA9BE;AA+BjBC,aAAYA,UA/BK;AAgCjBC,kBAAiBA,eAhCA;AAiCjBC,eAAcA,YAjCG;AAkCjBC,oBAAmBA,iBAlCF;AAmCjBC,4BAA2BA,yBAnCV;AAoCjBC,oBAAmBA,iBApCF;AAqCjBC,yBAAwBA,sBArCP;AAsCjBC,wBAAuBA,qBAtCN;AAuCjBC,oBAAmBA,iBAvCF;AAwCjBC,mBAAkBA,gBAxCD;AAyCjBC,wBAAuBA,qBAzCN;AA0CjBC,6BAA4BA,0BA1CX;AA2CjBC,2BAA0BA,wBA3CT;AA4CjBC,gCAA+BA,6BA5Cd;AA6CjBC,wBAAuBA,qBA7CN;AA8CjBC,uBAAsBA,oBA9CL;AA+CjBC,sBAAqBA,mBA/CJ;AAgDjBC,uBAAsBA,oBAhDL;AAiDjBC,4BAA2BA,yBAjDV;AAkDjBC,0BAAyBA,uBAlDR;AAmDjBC,qBAAoBA,kBAnDH;AAoDjBC,eAAcA,YApDG;AAqDjBC,oBAAmBA,iBArDF;AAsDjBC,wBAAuBA,qBAtDN;AAuDjBC,6BAA4BA,0BAvDX;AAwDjBC,wBAAuBA,qBAxDN;AAyDjBC,6BAA4BA,0BAzDX;AA0DjBC,qBAAoBA,kBA1DH;AA2DjBC,0BAAyBA,uBA3DR;AA4DjBC,qBAAoBA,kBA5DH;AA6DjBC,wBAAuBA,qBA7DN;AA8DjBC,uBAAsBA,oBA9DL;AA+DjBC,0BAAyBA,uBA/DR;AAgEjBC,UAASA,OAhEQ;AAiEjBC,+BAA8BA,4BAjEb;AAkEjBC,iBAAgBA,cAlEC;AAmEjBC,qBAAoBA,kBAnEH;AAoEjBC,0BAAyBA,uBApER;AAqEjBC,wBAAuBA,qBArEN;AAsEjBC,6BAA4BA,0BAtEX;AAuEjBC,0BAAyBA,uBAvER;AAwEjBC,wBAAuBA,qBAxEN;AAyEjBC,mBAAkBA,gBAzED;AA0EjBC,2BAA0BA,wBA1ET;AA2EjBC,kBAAiBA,eA3EA;AA4EjBC,uBAAsBA,oBA5EL;AA6EjBC,kBAAiBA,eA7EA;AA8EjBC,oBAAmBA,iBA9EF;AA+EjBC,uBAAsBA,oBA/EL;AAgFjBC,4BAA2BA,yBAhFV;AAiFjBC,uBAAsBA,oBAjFL;AAkFjBC,4BAA2BA,yBAlFV;AAmFjBC,mBAAkBA,gBAnFD;AAoFjBC,iBAAgBA,cApFC;AAqFjBC,YAAWA,SArFM;AAsFjBC,oBAAmBA,iBAtFF;AAuFjBC,kBAAiBA,eAvFA;AAwFjBC,aAAYA,UAxFK;AAyFjBC,kBAAiBA,eAzFA;;AA2FjBC,YAAWA,SA3FM;AA4FjBC,YAAWA,SA5FM;AA6FjBC,aAAYA,UA7FK;AA8FjBC,aAAYA,UA9FK;AA+FjBC,oBAAmBA,iBA/FF;AAgGjBC,oBAAmBA,iBAhGF;AAiGjBC,gBAAeA,aAjGE;AAkGjBC,gBAAeA,aAlGE;AAmGjBC,kBAAiBA,eAnGA;AAoGjBC,kBAAiBA,eApGA;AAqGjBC,iBAAgBA,cArGC;AAsGjBC,iBAAgBA,cAtGC;AAuGjBC,mBAAkBA,gBAvGD;AAwGjBC,mBAAkBA,gBAxGD;AAyGjBC,iBAAgBA,cAzGC;AA0GjBC,iBAAgBA,cA1GC;AA2GjBC,oBAAmBA,iBA3GF;AA4GjBC,oBAAmBA,iBA5GF;AA6GjBC,cAAaA,WA7GI;AA8GjBC,cAAaA,WA9GI;AA+GjBC,cAAaA,WA/GI;AAgHjBC,cAAaA,WAhHI;AAiHjBC,cAAaA,WAjHI;AAkHjBC,cAAaA;AAlHI,CAAlB;;AAqHA;;;;AAIA,IAAIE,gBAAgB;;AAEnBC,QAAO,UAAWC,QAAX,EAAsB;;AAE5B,MAAIC,SAAS,EAAb;;AAEA,OAAM,IAAIC,IAAI,CAAd,EAAiBA,IAAIF,SAASj5B,MAA9B,EAAsCm5B,GAAtC,EAA6C;;AAE5C,OAAIjhB,MAAM,KAAKrK,KAAL,CAAYorB,SAAUE,CAAV,CAAZ,CAAV;;AAEA,QAAM,IAAIjd,CAAV,IAAehE,GAAf,EAAqB;;AAEpBghB,WAAQhd,CAAR,IAAchE,IAAKgE,CAAL,CAAd;AAEA;AAED;;AAED,SAAOgd,MAAP;AAEA,EApBkB;;AAsBnBrrB,QAAO,UAAWurB,YAAX,EAA0B;;AAEhC,MAAIC,eAAe,EAAnB;;AAEA,OAAM,IAAIF,CAAV,IAAeC,YAAf,EAA8B;;AAE7BC,gBAAcF,CAAd,IAAoB,EAApB;;AAEA,QAAM,IAAIjd,CAAV,IAAekd,aAAcD,CAAd,CAAf,EAAmC;;AAElC,QAAIG,gBAAgBF,aAAcD,CAAd,EAAmBjd,CAAnB,CAApB;;AAEA,QAAKod,kBAAmBA,cAAcC,OAAd,IACvBD,cAAcpW,SADS,IACIoW,cAAcznB,SADlB,IAEvBynB,cAAcjsB,SAFS,IAEIisB,cAAc/Y,SAFlB,IAE+B+Y,cAAcpS,SAF7C,IAGvBoS,cAAchU,SAHV,CAAL,EAG6B;;AAE5B+T,kBAAcF,CAAd,EAAmBjd,CAAnB,IAAyBod,cAAczrB,KAAd,EAAzB;AAEA,KAPD,MAOO,IAAK2rB,MAAMC,OAAN,CAAeH,aAAf,CAAL,EAAsC;;AAE5CD,kBAAcF,CAAd,EAAmBjd,CAAnB,IAAyBod,cAAcl4B,KAAd,EAAzB;AAEA,KAJM,MAIA;;AAENi4B,kBAAcF,CAAd,EAAmBjd,CAAnB,IAAyBod,aAAzB;AAEA;AAED;AAED;;AAED,SAAOD,YAAP;AAEA;;AAzDkB,CAApB;;AA6DA;;;;AAIA,IAAIK,gBAAgB,EAAE,aAAa,QAAf,EAAyB,gBAAgB,QAAzC,EAAmD,QAAQ,QAA3D,EAAqE,cAAc,QAAnF,EAA6F,SAAS,QAAtG;AACnB,UAAS,QADU,EACA,UAAU,QADV,EACoB,SAAS,QAD7B,EACuC,kBAAkB,QADzD,EACmE,QAAQ,QAD3E,EACqF,cAAc,QADnG;AAEnB,UAAS,QAFU,EAEA,aAAa,QAFb,EAEuB,aAAa,QAFpC,EAE8C,cAAc,QAF5D,EAEsE,aAAa,QAFnF,EAE6F,SAAS,QAFtG;AAGnB,mBAAkB,QAHC,EAGS,YAAY,QAHrB,EAG+B,WAAW,QAH1C,EAGoD,QAAQ,QAH5D,EAGsE,YAAY,QAHlF,EAG4F,YAAY,QAHxG;AAInB,kBAAiB,QAJE,EAIQ,YAAY,QAJpB,EAI8B,aAAa,QAJ3C,EAIqD,YAAY,QAJjE,EAI2E,aAAa,QAJxF,EAIkG,eAAe,QAJjH;AAKnB,mBAAkB,QALC,EAKS,cAAc,QALvB,EAKiC,cAAc,QAL/C,EAKyD,WAAW,QALpE,EAK8E,cAAc,QAL5F,EAKsG,gBAAgB,QALtH;AAMnB,kBAAiB,QANE,EAMQ,iBAAiB,QANzB,EAMmC,iBAAiB,QANpD,EAM8D,iBAAiB,QAN/E,EAMyF,cAAc,QANvG;AAOnB,aAAY,QAPO,EAOG,eAAe,QAPlB,EAO4B,WAAW,QAPvC,EAOiD,WAAW,QAP5D,EAOsE,cAAc,QAPpF,EAO8F,aAAa,QAP3G;AAQnB,gBAAe,QARI,EAQM,eAAe,QARrB,EAQ+B,WAAW,QAR1C,EAQoD,aAAa,QARjE,EAQ2E,cAAc,QARzF,EAQmG,QAAQ,QAR3G;AASnB,cAAa,QATM,EASI,QAAQ,QATZ,EASsB,SAAS,QAT/B,EASyC,eAAe,QATxD,EASkE,QAAQ,QAT1E,EASoF,YAAY,QAThG,EAS0G,WAAW,QATrH;AAUnB,cAAa,QAVM,EAUI,UAAU,QAVd,EAUwB,SAAS,QAVjC,EAU2C,SAAS,QAVpD,EAU8D,YAAY,QAV1E,EAUoF,iBAAiB,QAVrG,EAU+G,aAAa,QAV5H;AAWnB,iBAAgB,QAXG,EAWO,aAAa,QAXpB,EAW8B,cAAc,QAX5C,EAWsD,aAAa,QAXnE,EAW6E,wBAAwB,QAXrG,EAW+G,aAAa,QAX5H;AAYnB,eAAc,QAZK,EAYK,aAAa,QAZlB,EAY4B,aAAa,QAZzC,EAYmD,eAAe,QAZlE,EAY4E,iBAAiB,QAZ7F,EAYuG,gBAAgB,QAZvH;AAanB,mBAAkB,QAbC,EAaS,kBAAkB,QAb3B,EAaqC,kBAAkB,QAbvD,EAaiE,eAAe,QAbhF,EAa0F,QAAQ,QAblG,EAa4G,aAAa,QAbzH;AAcnB,UAAS,QAdU,EAcA,WAAW,QAdX,EAcqB,UAAU,QAd/B,EAcyC,oBAAoB,QAd7D,EAcuE,cAAc,QAdrF,EAc+F,gBAAgB,QAd/G;AAenB,iBAAgB,QAfG,EAeO,kBAAkB,QAfzB,EAemC,mBAAmB,QAftD,EAegE,qBAAqB,QAfrF,EAe+F,mBAAmB,QAflH;AAgBnB,oBAAmB,QAhBA,EAgBU,gBAAgB,QAhB1B,EAgBoC,aAAa,QAhBjD,EAgB2D,aAAa,QAhBxE,EAgBkF,YAAY,QAhB9F,EAgBwG,eAAe,QAhBvH;AAiBnB,SAAQ,QAjBW,EAiBD,WAAW,QAjBV,EAiBoB,SAAS,QAjB7B,EAiBuC,aAAa,QAjBpD,EAiB8D,UAAU,QAjBxE,EAiBkF,aAAa,QAjB/F,EAiByG,UAAU,QAjBnH;AAkBnB,kBAAiB,QAlBE,EAkBQ,aAAa,QAlBrB,EAkB+B,iBAAiB,QAlBhD,EAkB0D,iBAAiB,QAlB3E,EAkBqF,cAAc,QAlBnG,EAkB6G,aAAa,QAlB1H;AAmBnB,SAAQ,QAnBW,EAmBD,QAAQ,QAnBP,EAmBiB,QAAQ,QAnBzB,EAmBmC,cAAc,QAnBjD,EAmB2D,UAAU,QAnBrE,EAmB+E,iBAAiB,QAnBhG,EAmB0G,OAAO,QAnBjH,EAmB2H,aAAa,QAnBxI;AAoBnB,cAAa,QApBM,EAoBI,eAAe,QApBnB,EAoB6B,UAAU,QApBvC,EAoBiD,cAAc,QApB/D,EAoByE,YAAY,QApBrF,EAoB+F,YAAY,QApB3G;AAqBnB,WAAU,QArBS,EAqBC,UAAU,QArBX,EAqBqB,WAAW,QArBhC,EAqB0C,aAAa,QArBvD,EAqBiE,aAAa,QArB9E,EAqBwF,aAAa,QArBrG,EAqB+G,QAAQ,QArBvH;AAsBnB,gBAAe,QAtBI,EAsBM,aAAa,QAtBnB,EAsB6B,OAAO,QAtBpC,EAsB8C,QAAQ,QAtBtD,EAsBgE,WAAW,QAtB3E,EAsBqF,UAAU,QAtB/F,EAsByG,aAAa,QAtBtH;AAuBnB,WAAU,QAvBS,EAuBC,SAAS,QAvBV,EAuBoB,SAAS,QAvB7B,EAuBuC,cAAc,QAvBrD,EAuB+D,UAAU,QAvBzE,EAuBmF,eAAe,QAvBlG,EAApB;;AAyBA,SAASC,KAAT,CAAgB1a,CAAhB,EAAmBmE,CAAnB,EAAsB3U,CAAtB,EAA0B;;AAEzB,KAAK2U,MAAM1kB,SAAN,IAAmB+P,MAAM/P,SAA9B,EAA0C;;AAEzC;AACA,SAAO,KAAK0O,GAAL,CAAU6R,CAAV,CAAP;AAEA;;AAED,QAAO,KAAK2a,MAAL,CAAa3a,CAAb,EAAgBmE,CAAhB,EAAmB3U,CAAnB,CAAP;AAEA;;AAEDpP,OAAOK,MAAP,CAAei6B,MAAMv6B,SAArB,EAAgC;;AAE/Bm6B,UAAS,IAFsB;;AAI/Bta,IAAG,CAJ4B,EAIzBmE,GAAG,CAJsB,EAInB3U,GAAG,CAJgB;;AAM/BrB,MAAK,UAAWtO,KAAX,EAAmB;;AAEvB,MAAKA,SAASA,MAAMy6B,OAApB,EAA8B;;AAE7B,QAAKxrB,IAAL,CAAWjP,KAAX;AAEA,GAJD,MAIO,IAAK,OAAOA,KAAP,KAAiB,QAAtB,EAAiC;;AAEvC,QAAK+6B,MAAL,CAAa/6B,KAAb;AAEA,GAJM,MAIA,IAAK,OAAOA,KAAP,KAAiB,QAAtB,EAAiC;;AAEvC,QAAKg7B,QAAL,CAAeh7B,KAAf;AAEA;;AAED,SAAO,IAAP;AAEA,EAxB8B;;AA0B/BwO,YAAW,UAAWC,MAAX,EAAoB;;AAE9B,OAAK0R,CAAL,GAAS1R,MAAT;AACA,OAAK6V,CAAL,GAAS7V,MAAT;AACA,OAAKkB,CAAL,GAASlB,MAAT;;AAEA,SAAO,IAAP;AAEA,EAlC8B;;AAoC/BssB,SAAQ,UAAWE,GAAX,EAAiB;;AAExBA,QAAMp7B,KAAKK,KAAL,CAAY+6B,GAAZ,CAAN;;AAEA,OAAK9a,CAAL,GAAS,CAAE8a,OAAO,EAAP,GAAY,GAAd,IAAsB,GAA/B;AACA,OAAK3W,CAAL,GAAS,CAAE2W,OAAO,CAAP,GAAW,GAAb,IAAqB,GAA9B;AACA,OAAKtrB,CAAL,GAAS,CAAEsrB,MAAM,GAAR,IAAgB,GAAzB;;AAEA,SAAO,IAAP;AAEA,EA9C8B;;AAgD/BH,SAAQ,UAAW3a,CAAX,EAAcmE,CAAd,EAAiB3U,CAAjB,EAAqB;;AAE5B,OAAKwQ,CAAL,GAASA,CAAT;AACA,OAAKmE,CAAL,GAASA,CAAT;AACA,OAAK3U,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EAxD8B;;AA0D/BurB,SAAQ,YAAY;;AAEnB,WAASC,OAAT,CAAkB/d,CAAlB,EAAqB/G,CAArB,EAAwBpJ,CAAxB,EAA4B;;AAE3B,OAAKA,IAAI,CAAT,EAAaA,KAAK,CAAL;AACb,OAAKA,IAAI,CAAT,EAAaA,KAAK,CAAL;AACb,OAAKA,IAAI,IAAI,CAAb,EAAiB,OAAOmQ,IAAI,CAAE/G,IAAI+G,CAAN,IAAY,CAAZ,GAAgBnQ,CAA3B;AACjB,OAAKA,IAAI,IAAI,CAAb,EAAiB,OAAOoJ,CAAP;AACjB,OAAKpJ,IAAI,IAAI,CAAb,EAAiB,OAAOmQ,IAAI,CAAE/G,IAAI+G,CAAN,IAAY,CAAZ,IAAkB,IAAI,CAAJ,GAAQnQ,CAA1B,CAAX;AACjB,UAAOmQ,CAAP;AAEA;;AAED,SAAO,SAAS8d,MAAT,CAAiB/d,CAAjB,EAAoB1N,CAApB,EAAuBjN,CAAvB,EAA2B;;AAEjC;AACA2a,OAAI5R,MAAMgB,eAAN,CAAuB4Q,CAAvB,EAA0B,CAA1B,CAAJ;AACA1N,OAAIlE,MAAMa,KAAN,CAAaqD,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAJ;AACAjN,OAAI+I,MAAMa,KAAN,CAAa5J,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAJ;;AAEA,OAAKiN,MAAM,CAAX,EAAe;;AAEd,SAAK0Q,CAAL,GAAS,KAAKmE,CAAL,GAAS,KAAK3U,CAAL,GAASnN,CAA3B;AAEA,IAJD,MAIO;;AAEN,QAAI4a,IAAI5a,KAAK,GAAL,GAAWA,KAAM,IAAIiN,CAAV,CAAX,GAA2BjN,IAAIiN,CAAJ,GAAUjN,IAAIiN,CAAjD;AACA,QAAI4G,IAAM,IAAI7T,CAAN,GAAY4a,CAApB;;AAEA,SAAK+C,CAAL,GAASgb,QAAS9kB,CAAT,EAAY+G,CAAZ,EAAeD,IAAI,IAAI,CAAvB,CAAT;AACA,SAAKmH,CAAL,GAAS6W,QAAS9kB,CAAT,EAAY+G,CAAZ,EAAeD,CAAf,CAAT;AACA,SAAKxN,CAAL,GAASwrB,QAAS9kB,CAAT,EAAY+G,CAAZ,EAAeD,IAAI,IAAI,CAAvB,CAAT;AAEA;;AAED,UAAO,IAAP;AAEA,GAxBD;AA0BA,EAvCO,EA1DuB;;AAmG/B6d,WAAU,UAAWI,KAAX,EAAmB;;AAE5B,WAASC,WAAT,CAAsBC,MAAtB,EAA+B;;AAE9B,OAAKA,WAAW17B,SAAhB,EAA4B;;AAE5B,OAAK27B,WAAYD,MAAZ,IAAuB,CAA5B,EAAgC;;AAE/BjsB,YAAQC,IAAR,CAAc,qCAAqC8rB,KAArC,GAA6C,mBAA3D;AAEA;AAED;;AAGD,MAAI3uB,CAAJ;;AAEA,MAAKA,IAAI,kCAAkC+uB,IAAlC,CAAwCJ,KAAxC,CAAT,EAA2D;;AAE1D;;AAEA,OAAIK,KAAJ;AACA,OAAI9V,OAAOlZ,EAAG,CAAH,CAAX;AACA,OAAIivB,aAAajvB,EAAG,CAAH,CAAjB;;AAEA,WAASkZ,IAAT;;AAEC,SAAK,KAAL;AACA,SAAK,MAAL;;AAEC,SAAK8V,QAAQ,gEAAgED,IAAhE,CAAsEE,UAAtE,CAAb,EAAkG;;AAEjG;AACA,WAAKvb,CAAL,GAAStgB,KAAKwM,GAAL,CAAU,GAAV,EAAesvB,SAAUF,MAAO,CAAP,CAAV,EAAsB,EAAtB,CAAf,IAA8C,GAAvD;AACA,WAAKnX,CAAL,GAASzkB,KAAKwM,GAAL,CAAU,GAAV,EAAesvB,SAAUF,MAAO,CAAP,CAAV,EAAsB,EAAtB,CAAf,IAA8C,GAAvD;AACA,WAAK9rB,CAAL,GAAS9P,KAAKwM,GAAL,CAAU,GAAV,EAAesvB,SAAUF,MAAO,CAAP,CAAV,EAAsB,EAAtB,CAAf,IAA8C,GAAvD;;AAEAJ,kBAAaI,MAAO,CAAP,CAAb;;AAEA,aAAO,IAAP;AAEA;;AAED,SAAKA,QAAQ,sEAAsED,IAAtE,CAA4EE,UAA5E,CAAb,EAAwG;;AAEvG;AACA,WAAKvb,CAAL,GAAStgB,KAAKwM,GAAL,CAAU,GAAV,EAAesvB,SAAUF,MAAO,CAAP,CAAV,EAAsB,EAAtB,CAAf,IAA8C,GAAvD;AACA,WAAKnX,CAAL,GAASzkB,KAAKwM,GAAL,CAAU,GAAV,EAAesvB,SAAUF,MAAO,CAAP,CAAV,EAAsB,EAAtB,CAAf,IAA8C,GAAvD;AACA,WAAK9rB,CAAL,GAAS9P,KAAKwM,GAAL,CAAU,GAAV,EAAesvB,SAAUF,MAAO,CAAP,CAAV,EAAsB,EAAtB,CAAf,IAA8C,GAAvD;;AAEAJ,kBAAaI,MAAO,CAAP,CAAb;;AAEA,aAAO,IAAP;AAEA;;AAED;;AAED,SAAK,KAAL;AACA,SAAK,MAAL;;AAEC,SAAKA,QAAQ,gFAAgFD,IAAhF,CAAsFE,UAAtF,CAAb,EAAkH;;AAEjH;AACA,UAAIve,IAAIoe,WAAYE,MAAO,CAAP,CAAZ,IAA2B,GAAnC;AACA,UAAIhsB,IAAIksB,SAAUF,MAAO,CAAP,CAAV,EAAsB,EAAtB,IAA6B,GAArC;AACA,UAAIj5B,IAAIm5B,SAAUF,MAAO,CAAP,CAAV,EAAsB,EAAtB,IAA6B,GAArC;;AAEAJ,kBAAaI,MAAO,CAAP,CAAb;;AAEA,aAAO,KAAKP,MAAL,CAAa/d,CAAb,EAAgB1N,CAAhB,EAAmBjN,CAAnB,CAAP;AAEA;;AAED;;AAjDF;AAqDA,GA7DD,MA6DO,IAAKiK,IAAI,qBAAqB+uB,IAArB,CAA2BJ,KAA3B,CAAT,EAA8C;;AAEpD;;AAEA,OAAIH,MAAMxuB,EAAG,CAAH,CAAV;AACA,OAAIqe,OAAOmQ,IAAI/5B,MAAf;;AAEA,OAAK4pB,SAAS,CAAd,EAAkB;;AAEjB;AACA,SAAK3K,CAAL,GAASwb,SAAUV,IAAIW,MAAJ,CAAY,CAAZ,IAAkBX,IAAIW,MAAJ,CAAY,CAAZ,CAA5B,EAA6C,EAA7C,IAAoD,GAA7D;AACA,SAAKtX,CAAL,GAASqX,SAAUV,IAAIW,MAAJ,CAAY,CAAZ,IAAkBX,IAAIW,MAAJ,CAAY,CAAZ,CAA5B,EAA6C,EAA7C,IAAoD,GAA7D;AACA,SAAKjsB,CAAL,GAASgsB,SAAUV,IAAIW,MAAJ,CAAY,CAAZ,IAAkBX,IAAIW,MAAJ,CAAY,CAAZ,CAA5B,EAA6C,EAA7C,IAAoD,GAA7D;;AAEA,WAAO,IAAP;AAEA,IATD,MASO,IAAK9Q,SAAS,CAAd,EAAkB;;AAExB;AACA,SAAK3K,CAAL,GAASwb,SAAUV,IAAIW,MAAJ,CAAY,CAAZ,IAAkBX,IAAIW,MAAJ,CAAY,CAAZ,CAA5B,EAA6C,EAA7C,IAAoD,GAA7D;AACA,SAAKtX,CAAL,GAASqX,SAAUV,IAAIW,MAAJ,CAAY,CAAZ,IAAkBX,IAAIW,MAAJ,CAAY,CAAZ,CAA5B,EAA6C,EAA7C,IAAoD,GAA7D;AACA,SAAKjsB,CAAL,GAASgsB,SAAUV,IAAIW,MAAJ,CAAY,CAAZ,IAAkBX,IAAIW,MAAJ,CAAY,CAAZ,CAA5B,EAA6C,EAA7C,IAAoD,GAA7D;;AAEA,WAAO,IAAP;AAEA;AAED;;AAED,MAAKR,SAASA,MAAMl6B,MAAN,GAAe,CAA7B,EAAiC;;AAEhC;AACA,OAAI+5B,MAAML,cAAeQ,KAAf,CAAV;;AAEA,OAAKH,QAAQr7B,SAAb,EAAyB;;AAExB;AACA,SAAKm7B,MAAL,CAAaE,GAAb;AAEA,IALD,MAKO;;AAEN;AACA5rB,YAAQC,IAAR,CAAc,gCAAgC8rB,KAA9C;AAEA;AAED;;AAED,SAAO,IAAP;AAEA,EAnO8B;;AAqO/BrsB,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAKmR,CAA3B,EAA8B,KAAKmE,CAAnC,EAAsC,KAAK3U,CAA3C,CAAP;AAEA,EAzO8B;;AA2O/BV,OAAM,UAAWwsB,KAAX,EAAmB;;AAExB,OAAKtb,CAAL,GAASsb,MAAMtb,CAAf;AACA,OAAKmE,CAAL,GAASmX,MAAMnX,CAAf;AACA,OAAK3U,CAAL,GAAS8rB,MAAM9rB,CAAf;;AAEA,SAAO,IAAP;AAEA,EAnP8B;;AAqP/BksB,oBAAmB,UAAWJ,KAAX,EAAkBK,WAAlB,EAAgC;;AAElD,MAAKA,gBAAgBl8B,SAArB,EAAiCk8B,cAAc,GAAd;;AAEjC,OAAK3b,CAAL,GAAStgB,KAAKC,GAAL,CAAU27B,MAAMtb,CAAhB,EAAmB2b,WAAnB,CAAT;AACA,OAAKxX,CAAL,GAASzkB,KAAKC,GAAL,CAAU27B,MAAMnX,CAAhB,EAAmBwX,WAAnB,CAAT;AACA,OAAKnsB,CAAL,GAAS9P,KAAKC,GAAL,CAAU27B,MAAM9rB,CAAhB,EAAmBmsB,WAAnB,CAAT;;AAEA,SAAO,IAAP;AAEA,EA/P8B;;AAiQ/BC,oBAAmB,UAAWN,KAAX,EAAkBK,WAAlB,EAAgC;;AAElD,MAAKA,gBAAgBl8B,SAArB,EAAiCk8B,cAAc,GAAd;;AAEjC,MAAIE,cAAgBF,cAAc,CAAhB,GAAwB,MAAMA,WAA9B,GAA8C,GAAhE;;AAEA,OAAK3b,CAAL,GAAStgB,KAAKC,GAAL,CAAU27B,MAAMtb,CAAhB,EAAmB6b,WAAnB,CAAT;AACA,OAAK1X,CAAL,GAASzkB,KAAKC,GAAL,CAAU27B,MAAMnX,CAAhB,EAAmB0X,WAAnB,CAAT;AACA,OAAKrsB,CAAL,GAAS9P,KAAKC,GAAL,CAAU27B,MAAM9rB,CAAhB,EAAmBqsB,WAAnB,CAAT;;AAEA,SAAO,IAAP;AAEA,EA7Q8B;;AA+Q/BC,uBAAsB,UAAWH,WAAX,EAAyB;;AAE9C,OAAKD,iBAAL,CAAwB,IAAxB,EAA8BC,WAA9B;;AAEA,SAAO,IAAP;AAEA,EArR8B;;AAuR/BI,uBAAsB,UAAWJ,WAAX,EAAyB;;AAE9C,OAAKC,iBAAL,CAAwB,IAAxB,EAA8BD,WAA9B;;AAEA,SAAO,IAAP;AAEA,EA7R8B;;AA+R/BK,SAAQ,YAAY;;AAEnB,SAAS,KAAKhc,CAAL,GAAS,GAAX,IAAoB,EAApB,GAA2B,KAAKmE,CAAL,GAAS,GAAX,IAAoB,CAA7C,GAAmD,KAAK3U,CAAL,GAAS,GAAX,IAAoB,CAA5E;AAEA,EAnS8B;;AAqS/BysB,eAAc,YAAY;;AAEzB,SAAO,CAAE,WAAW,KAAKD,MAAL,GAAcz7B,QAAd,CAAwB,EAAxB,CAAb,EAA4C4B,KAA5C,CAAmD,CAAE,CAArD,CAAP;AAEA,EAzS8B;;AA2S/B+5B,SAAQ,UAAWx7B,MAAX,EAAoB;;AAE3B;;AAEA,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,+CAAd;AACAzO,YAAS,EAAEsc,GAAG,CAAL,EAAQ1N,GAAG,CAAX,EAAcjN,GAAG,CAAjB,EAAT;AAEA;;AAED,MAAI2d,IAAI,KAAKA,CAAb;AAAA,MAAgBmE,IAAI,KAAKA,CAAzB;AAAA,MAA4B3U,IAAI,KAAKA,CAArC;;AAEA,MAAIrD,MAAMzM,KAAKyM,GAAL,CAAU6T,CAAV,EAAamE,CAAb,EAAgB3U,CAAhB,CAAV;AACA,MAAItD,MAAMxM,KAAKwM,GAAL,CAAU8T,CAAV,EAAamE,CAAb,EAAgB3U,CAAhB,CAAV;;AAEA,MAAI2sB,GAAJ,EAASC,UAAT;AACA,MAAIC,YAAY,CAAEnwB,MAAMC,GAAR,IAAgB,GAAhC;;AAEA,MAAKD,QAAQC,GAAb,EAAmB;;AAElBgwB,SAAM,CAAN;AACAC,gBAAa,CAAb;AAEA,GALD,MAKO;;AAEN,OAAIlM,QAAQ/jB,MAAMD,GAAlB;;AAEAkwB,gBAAaC,aAAa,GAAb,GAAmBnM,SAAU/jB,MAAMD,GAAhB,CAAnB,GAA2CgkB,SAAU,IAAI/jB,GAAJ,GAAUD,GAApB,CAAxD;;AAEA,WAASC,GAAT;;AAEC,SAAK6T,CAAL;AAAQmc,WAAM,CAAEhY,IAAI3U,CAAN,IAAY0gB,KAAZ,IAAsB/L,IAAI3U,CAAJ,GAAQ,CAAR,GAAY,CAAlC,CAAN,CAA6C;AACrD,SAAK2U,CAAL;AAAQgY,WAAM,CAAE3sB,IAAIwQ,CAAN,IAAYkQ,KAAZ,GAAoB,CAA1B,CAA6B;AACrC,SAAK1gB,CAAL;AAAQ2sB,WAAM,CAAEnc,IAAImE,CAAN,IAAY+L,KAAZ,GAAoB,CAA1B,CAA6B;;AAJtC;;AAQAiM,UAAO,CAAP;AAEA;;AAEDz7B,SAAOsc,CAAP,GAAWmf,GAAX;AACAz7B,SAAO4O,CAAP,GAAW8sB,UAAX;AACA17B,SAAO2B,CAAP,GAAWg6B,SAAX;;AAEA,SAAO37B,MAAP;AAEA,EA3V8B;;AA6V/B47B,WAAU,YAAY;;AAErB,SAAO,UAAa,KAAKtc,CAAL,GAAS,GAAX,GAAmB,CAA9B,IAAoC,GAApC,IAA8C,KAAKmE,CAAL,GAAS,GAAX,GAAmB,CAA/D,IAAqE,GAArE,IAA+E,KAAK3U,CAAL,GAAS,GAAX,GAAmB,CAAhG,IAAsG,GAA7G;AAEA,EAjW8B;;AAmW/B+sB,YAAW,YAAY;;AAEtB,MAAIC,MAAM,EAAV;;AAEA,SAAO,UAAWxf,CAAX,EAAc1N,CAAd,EAAiBjN,CAAjB,EAAqB;;AAE3B,QAAK65B,MAAL,CAAaM,GAAb;;AAEAA,OAAIxf,CAAJ,IAASA,CAAT,CAAYwf,IAAIltB,CAAJ,IAASA,CAAT,CAAYktB,IAAIn6B,CAAJ,IAASA,CAAT;;AAExB,QAAK04B,MAAL,CAAayB,IAAIxf,CAAjB,EAAoBwf,IAAIltB,CAAxB,EAA2BktB,IAAIn6B,CAA/B;;AAEA,UAAO,IAAP;AAEA,GAVD;AAYA,EAhBU,EAnWoB;;AAqX/B2M,MAAK,UAAWssB,KAAX,EAAmB;;AAEvB,OAAKtb,CAAL,IAAUsb,MAAMtb,CAAhB;AACA,OAAKmE,CAAL,IAAUmX,MAAMnX,CAAhB;AACA,OAAK3U,CAAL,IAAU8rB,MAAM9rB,CAAhB;;AAEA,SAAO,IAAP;AAEA,EA7X8B;;AA+X/BitB,YAAW,UAAWC,MAAX,EAAmBC,MAAnB,EAA4B;;AAEtC,OAAK3c,CAAL,GAAS0c,OAAO1c,CAAP,GAAW2c,OAAO3c,CAA3B;AACA,OAAKmE,CAAL,GAASuY,OAAOvY,CAAP,GAAWwY,OAAOxY,CAA3B;AACA,OAAK3U,CAAL,GAASktB,OAAOltB,CAAP,GAAWmtB,OAAOntB,CAA3B;;AAEA,SAAO,IAAP;AAEA,EAvY8B;;AAyY/BH,YAAW,UAAWC,CAAX,EAAe;;AAEzB,OAAK0Q,CAAL,IAAU1Q,CAAV;AACA,OAAK6U,CAAL,IAAU7U,CAAV;AACA,OAAKE,CAAL,IAAUF,CAAV;;AAEA,SAAO,IAAP;AAEA,EAjZ8B;;AAmZ/BI,MAAK,UAAW4rB,KAAX,EAAmB;;AAEvB,OAAKtb,CAAL,GAAStgB,KAAKyM,GAAL,CAAU,CAAV,EAAa,KAAK6T,CAAL,GAASsb,MAAMtb,CAA5B,CAAT;AACA,OAAKmE,CAAL,GAASzkB,KAAKyM,GAAL,CAAU,CAAV,EAAa,KAAKgY,CAAL,GAASmX,MAAMnX,CAA5B,CAAT;AACA,OAAK3U,CAAL,GAAS9P,KAAKyM,GAAL,CAAU,CAAV,EAAa,KAAKqD,CAAL,GAAS8rB,MAAM9rB,CAA5B,CAAT;;AAEA,SAAO,IAAP;AAEA,EA3Z8B;;AA6Z/BK,WAAU,UAAWyrB,KAAX,EAAmB;;AAE5B,OAAKtb,CAAL,IAAUsb,MAAMtb,CAAhB;AACA,OAAKmE,CAAL,IAAUmX,MAAMnX,CAAhB;AACA,OAAK3U,CAAL,IAAU8rB,MAAM9rB,CAAhB;;AAEA,SAAO,IAAP;AAEA,EAra8B;;AAua/BM,iBAAgB,UAAWR,CAAX,EAAe;;AAE9B,OAAK0Q,CAAL,IAAU1Q,CAAV;AACA,OAAK6U,CAAL,IAAU7U,CAAV;AACA,OAAKE,CAAL,IAAUF,CAAV;;AAEA,SAAO,IAAP;AAEA,EA/a8B;;AAib/B1C,OAAM,UAAW0uB,KAAX,EAAkB7pB,KAAlB,EAA0B;;AAE/B,OAAKuO,CAAL,IAAU,CAAEsb,MAAMtb,CAAN,GAAU,KAAKA,CAAjB,IAAuBvO,KAAjC;AACA,OAAK0S,CAAL,IAAU,CAAEmX,MAAMnX,CAAN,GAAU,KAAKA,CAAjB,IAAuB1S,KAAjC;AACA,OAAKjC,CAAL,IAAU,CAAE8rB,MAAM9rB,CAAN,GAAU,KAAKA,CAAjB,IAAuBiC,KAAjC;;AAEA,SAAO,IAAP;AAEA,EAzb8B;;AA2b/BI,SAAQ,UAAWU,CAAX,EAAe;;AAEtB,SAASA,EAAEyN,CAAF,KAAQ,KAAKA,CAAf,IAAwBzN,EAAE4R,CAAF,KAAQ,KAAKA,CAArC,IAA8C5R,EAAE/C,CAAF,KAAQ,KAAKA,CAAlE;AAEA,EA/b8B;;AAic/BsC,YAAW,UAAW5P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAErC,MAAKA,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,OAAKiO,CAAL,GAAS9d,MAAO6P,MAAP,CAAT;AACA,OAAKoS,CAAL,GAASjiB,MAAO6P,SAAS,CAAhB,CAAT;AACA,OAAKvC,CAAL,GAAStN,MAAO6P,SAAS,CAAhB,CAAT;;AAEA,SAAO,IAAP;AAEA,EA3c8B;;AA6c/BC,UAAS,UAAW9P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEnC,MAAK7P,UAAUzC,SAAf,EAA2ByC,QAAQ,EAAR;AAC3B,MAAK6P,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B7P,QAAO6P,MAAP,IAAkB,KAAKiO,CAAvB;AACA9d,QAAO6P,SAAS,CAAhB,IAAsB,KAAKoS,CAA3B;AACAjiB,QAAO6P,SAAS,CAAhB,IAAsB,KAAKvC,CAA3B;;AAEA,SAAOtN,KAAP;AAEA,EAxd8B;;AA0d/BqkB,SAAQ,YAAY;;AAEnB,SAAO,KAAKyV,MAAL,EAAP;AAEA;;AA9d8B,CAAhC;;AAkeA;;;;AAIA,IAAIY,cAAc;;AAEjB/I,SAAQ;;AAEPgJ,WAAS,EAAEh9B,OAAO,IAAI66B,KAAJ,CAAW,QAAX,CAAT,EAFF;AAGPoC,WAAS,EAAEj9B,OAAO,GAAT,EAHF;;AAKPk9B,OAAK,EAAEl9B,OAAO,IAAT,EALE;AAMPm9B,eAAa,EAAEn9B,OAAO,IAAImkB,OAAJ,EAAT,EANN;;AAQPiZ,YAAU,EAAEp9B,OAAO,IAAT;;AARH,EAFS;;AAcjBq9B,cAAa;;AAEZC,eAAa,EAAEt9B,OAAO,IAAT;;AAFD,EAdI;;AAoBjBu9B,SAAQ;;AAEPC,UAAQ,EAAEx9B,OAAO,IAAT,EAFD;AAGPy9B,cAAY,EAAEz9B,OAAO,CAAE,CAAX,EAHL;AAIP09B,gBAAc,EAAE19B,OAAO,GAAT,EAJP;AAKP29B,mBAAiB,EAAE39B,OAAO,IAAT,EALV;AAMP49B,eAAa,EAAE59B,OAAO,CAAT;;AANN,EApBS;;AA8BjB69B,QAAO;;AAENC,SAAO,EAAE99B,OAAO,IAAT,EAFD;AAGN+9B,kBAAgB,EAAE/9B,OAAO,CAAT;;AAHV,EA9BU;;AAqCjBg+B,WAAU;;AAETC,YAAU,EAAEj+B,OAAO,IAAT,EAFD;AAGTk+B,qBAAmB,EAAEl+B,OAAO,CAAT;;AAHV,EArCO;;AA4CjBm+B,cAAa;;AAEZC,eAAa,EAAEp+B,OAAO,IAAT;;AAFD,EA5CI;;AAkDjBq+B,UAAS;;AAERC,WAAS,EAAEt+B,OAAO,IAAT,EAFD;AAGRu+B,aAAW,EAAEv+B,OAAO,CAAT;;AAHH,EAlDQ;;AAyDjBw+B,YAAW;;AAEVC,aAAW,EAAEz+B,OAAO,IAAT,EAFD;AAGV0+B,eAAa,EAAE1+B,OAAO,IAAIoO,OAAJ,CAAa,CAAb,EAAgB,CAAhB,CAAT;;AAHH,EAzDM;;AAgEjBuwB,kBAAiB;;AAEhBC,mBAAiB,EAAE5+B,OAAO,IAAT,EAFD;AAGhB6+B,qBAAmB,EAAE7+B,OAAO,CAAT,EAHH;AAIhB8+B,oBAAkB,EAAE9+B,OAAO,CAAT;;AAJF,EAhEA;;AAwEjB++B,eAAc;;AAEbC,gBAAc,EAAEh/B,OAAO,IAAT;;AAFD,EAxEG;;AA8EjBi/B,eAAc;;AAEbC,gBAAc,EAAEl/B,OAAO,IAAT;;AAFD,EA9EG;;AAoFjBm/B,cAAa;;AAEZC,eAAa,EAAEp/B,OAAO,IAAT;;AAFD,EApFI;;AA0FjBq/B,MAAK;;AAEJC,cAAY,EAAEt/B,OAAO,OAAT,EAFR;AAGJu/B,WAAS,EAAEv/B,OAAO,CAAT,EAHL;AAIJw/B,UAAQ,EAAEx/B,OAAO,IAAT,EAJJ;AAKJy/B,YAAU,EAAEz/B,OAAO,IAAI66B,KAAJ,CAAW,QAAX,CAAT;;AALN,EA1FY;;AAmGjB6E,SAAQ;;AAEPC,qBAAmB,EAAE3/B,OAAO,EAAT,EAFZ;;AAIP4/B,qBAAmB,EAAE5/B,OAAO,EAAT,EAAa6/B,YAAY;AAC3CzP,eAAW,EADgC;AAE3CqL,WAAO,EAFoC;;AAI3CqE,YAAQ,EAJmC;AAK3CC,gBAAY,EAL+B;AAM3CC,kBAAc,EAN6B;AAO3CC,mBAAe;AAP4B,IAAzB,EAJZ;;AAcPC,wBAAsB,EAAElgC,OAAO,EAAT,EAdf;AAePmgC,2BAAyB,EAAEngC,OAAO,EAAT,EAflB;;AAiBPogC,cAAY,EAAEpgC,OAAO,EAAT,EAAa6/B,YAAY;AACpCpE,WAAO,EAD6B;AAEpC1gB,cAAU,EAF0B;AAGpCqV,eAAW,EAHyB;AAIpC0C,cAAU,EAJ0B;AAKpCuN,aAAS,EAL2B;AAMpCC,iBAAa,EANuB;AAOpCC,WAAO,EAP6B;;AASpCT,YAAQ,EAT4B;AAUpCC,gBAAY,EAVwB;AAWpCC,kBAAc,EAXsB;AAYpCC,mBAAe;AAZqB,IAAzB,EAjBL;;AAgCPO,iBAAe,EAAExgC,OAAO,EAAT,EAhCR;AAiCPygC,oBAAkB,EAAEzgC,OAAO,EAAT,EAjCX;;AAmCP0gC,eAAa,EAAE1gC,OAAO,EAAT,EAAa6/B,YAAY;AACrCpE,WAAO,EAD8B;AAErC1gB,cAAU,EAF2B;AAGrCwlB,WAAO,EAH8B;AAIrCzN,cAAU,EAJ2B;;AAMrCgN,YAAQ,EAN6B;AAOrCC,gBAAY,EAPyB;AAQrCC,kBAAc,EARuB;AASrCC,mBAAe,EATsB;AAUrCU,sBAAkB,EAVmB;AAWrCC,qBAAiB;AAXoB,IAAzB,EAnCN;;AAiDPC,kBAAgB,EAAE7gC,OAAO,EAAT,EAjDT;AAkDP8gC,qBAAmB,EAAE9gC,OAAO,EAAT,EAlDZ;;AAoDP+gC,oBAAkB,EAAE/gC,OAAO,EAAT,EAAa6/B,YAAY;AAC1CzP,eAAW,EAD+B;AAE1C4Q,cAAU,EAFgC;AAG1CC,iBAAa;AAH6B,IAAzB,EApDX;;AA0DP;AACAC,kBAAgB,EAAElhC,OAAO,EAAT,EAAa6/B,YAAY;AACxCpE,WAAO,EADiC;AAExC1gB,cAAU,EAF8B;AAGxCoM,WAAO,EAHiC;AAIxCC,YAAQ;AAJgC,IAAzB;;AA3DT,EAnGS;;AAuKjBqD,SAAQ;;AAEPuS,WAAS,EAAEh9B,OAAO,IAAI66B,KAAJ,CAAW,QAAX,CAAT,EAFF;AAGPoC,WAAS,EAAEj9B,OAAO,GAAT,EAHF;AAIP8qB,QAAM,EAAE9qB,OAAO,GAAT,EAJC;AAKP+Z,SAAO,EAAE/Z,OAAO,GAAT,EALA;AAMPk9B,OAAK,EAAEl9B,OAAO,IAAT,EANE;AAOPm9B,eAAa,EAAEn9B,OAAO,IAAImkB,OAAJ,EAAT;;AAPN;;AAvKS,CAAlB;;AAoLA;;;;;;AAMA,IAAIgd,YAAY;;AAEfC,QAAO;;AAENjH,YAAUF,cAAcC,KAAd,CAAqB,CAC9B6C,YAAY/I,MADkB,EAE9B+I,YAAYM,WAFkB,EAG9BN,YAAYQ,MAHkB,EAI9BR,YAAYc,KAJkB,EAK9Bd,YAAYiB,QALkB,EAM9BjB,YAAYsC,GANkB,CAArB,CAFJ;;AAWNgC,gBAAcrH,YAAYb,cAXpB;AAYNmI,kBAAgBtH,YAAYd;;AAZtB,EAFQ;;AAkBfqI,UAAS;;AAERpH,YAAUF,cAAcC,KAAd,CAAqB,CAC9B6C,YAAY/I,MADkB,EAE9B+I,YAAYM,WAFkB,EAG9BN,YAAYQ,MAHkB,EAI9BR,YAAYc,KAJkB,EAK9Bd,YAAYiB,QALkB,EAM9BjB,YAAYoB,WANkB,EAO9BpB,YAAYsC,GAPkB,EAQ9BtC,YAAY2C,MARkB,EAS9B;AACC8B,aAAU,EAAExhC,OAAO,IAAI66B,KAAJ,CAAW,QAAX,CAAT;AADX,GAT8B,CAArB,CAFF;;AAgBRwG,gBAAcrH,YAAYX,gBAhBlB;AAiBRiI,kBAAgBtH,YAAYZ;;AAjBpB,EAlBM;;AAuCfqI,QAAO;;AAENtH,YAAUF,cAAcC,KAAd,CAAqB,CAC9B6C,YAAY/I,MADkB,EAE9B+I,YAAYM,WAFkB,EAG9BN,YAAYQ,MAHkB,EAI9BR,YAAYc,KAJkB,EAK9Bd,YAAYiB,QALkB,EAM9BjB,YAAYoB,WANkB,EAO9BpB,YAAYsB,OAPkB,EAQ9BtB,YAAYyB,SARkB,EAS9BzB,YAAY4B,eATkB,EAU9B5B,YAAYoC,WAVkB,EAW9BpC,YAAYsC,GAXkB,EAY9BtC,YAAY2C,MAZkB,EAa9B;AACC8B,aAAU,EAAExhC,OAAO,IAAI66B,KAAJ,CAAW,QAAX,CAAT,EADX;AAEC6G,aAAU,EAAE1hC,OAAO,IAAI66B,KAAJ,CAAW,QAAX,CAAT,EAFX;AAGC8G,cAAW,EAAE3hC,OAAO,EAAT;AAHZ,GAb8B,CAArB,CAFJ;;AAsBNqhC,gBAAcrH,YAAYT,cAtBpB;AAuBN+H,kBAAgBtH,YAAYV;;AAvBtB,EAvCQ;;AAkEfsI,WAAU;;AAETzH,YAAUF,cAAcC,KAAd,CAAqB,CAC9B6C,YAAY/I,MADkB,EAE9B+I,YAAYQ,MAFkB,EAG9BR,YAAYc,KAHkB,EAI9Bd,YAAYiB,QAJkB,EAK9BjB,YAAYoB,WALkB,EAM9BpB,YAAYsB,OANkB,EAO9BtB,YAAYyB,SAPkB,EAQ9BzB,YAAY4B,eARkB,EAS9B5B,YAAYgC,YATkB,EAU9BhC,YAAYkC,YAVkB,EAW9BlC,YAAYsC,GAXkB,EAY9BtC,YAAY2C,MAZkB,EAa9B;AACC8B,aAAU,EAAExhC,OAAO,IAAI66B,KAAJ,CAAW,QAAX,CAAT,EADX;AAECgH,cAAW,EAAE7hC,OAAO,GAAT,EAFZ;AAGC8hC,cAAW,EAAE9hC,OAAO,GAAT,EAHZ;AAIC+hC,oBAAiB,EAAE/hC,OAAO,CAAT,CAAa;AAAb,IAJlB,EAb8B,CAArB,CAFD;;AAuBTqhC,gBAAcrH,YAAYP,iBAvBjB;AAwBT6H,kBAAgBtH,YAAYR;;AAxBnB,EAlEK;;AA8Ff/O,SAAQ;;AAEP0P,YAAUF,cAAcC,KAAd,CAAqB,CAC9B6C,YAAYtS,MADkB,EAE9BsS,YAAYsC,GAFkB,CAArB,CAFH;;AAOPgC,gBAAcrH,YAAYH,WAPnB;AAQPyH,kBAAgBtH,YAAYJ;;AARrB,EA9FO;;AA0GfoI,SAAQ;;AAEP7H,YAAUF,cAAcC,KAAd,CAAqB,CAC9B6C,YAAY/I,MADkB,EAE9B+I,YAAYsC,GAFkB,EAG9B;AACCtlB,UAAO,EAAE/Z,OAAO,CAAT,EADR;AAECiiC,aAAU,EAAEjiC,OAAO,CAAT,EAFX;AAGCkiC,cAAW,EAAEliC,OAAO,CAAT;AAHZ,GAH8B,CAArB,CAFH;;AAYPqhC,gBAAcrH,YAAYf,eAZnB;AAaPqI,kBAAgBtH,YAAYhB;;AAbrB,EA1GO;;AA2HfmJ,QAAO;;AAENhI,YAAUF,cAAcC,KAAd,CAAqB,CAC9B6C,YAAY/I,MADkB,EAE9B+I,YAAY4B,eAFkB,CAArB,CAFJ;;AAON0C,gBAAcrH,YAAYrB,UAPpB;AAQN2I,kBAAgBtH,YAAYtB;;AARtB,EA3HQ;;AAuIflV,SAAQ;;AAEP2W,YAAUF,cAAcC,KAAd,CAAqB,CAC9B6C,YAAY/I,MADkB,EAE9B+I,YAAYsB,OAFkB,EAG9BtB,YAAYyB,SAHkB,EAI9BzB,YAAY4B,eAJkB,EAK9B;AACC1B,YAAS,EAAEj9B,OAAO,GAAT;AADV,GAL8B,CAArB,CAFH;;AAYPqhC,gBAAcrH,YAAYL,WAZnB;AAaP2H,kBAAgBtH,YAAYN;;AAbrB,EAvIO;;AAwJf;;;;AAIA0I,OAAM;;AAELjI,YAAU;AACTkI,UAAO,EAAEriC,OAAO,IAAT,EADE;AAETsiC,UAAO,EAAEtiC,OAAO,CAAE,CAAX,EAFE;AAGTi9B,YAAS,EAAEj9B,OAAO,GAAT;AAHA,GAFL;;AAQLqhC,gBAAcrH,YAAYvB,SARrB;AASL6I,kBAAgBtH,YAAYxB;;AATvB,EA5JS;;AAyKf+J,WAAU;;AAETpI,YAAU;AACTqI,cAAW,EAAExiC,OAAO,IAAT;AADF,GAFD;;AAMTqhC,gBAAcrH,YAAYjB,aANjB;AAOTuI,kBAAgBtH,YAAYlB;;AAPnB,EAzKK;;AAoLf2J,eAAc;;AAEbtI,YAAUF,cAAcC,KAAd,CAAqB,CAC9B6C,YAAY/I,MADkB,EAE9B+I,YAAY4B,eAFkB,EAG9B;AACC+D,sBAAmB,EAAE1iC,OAAO,IAAI4U,OAAJ,EAAT,EADpB;AAEC+tB,iBAAc,EAAE3iC,OAAO,CAAT,EAFf;AAGC4iC,gBAAa,EAAE5iC,OAAO,IAAT;AAHd,GAH8B,CAArB,CAFG;;AAYbqhC,gBAAcrH,YAAYnB,iBAZb;AAabyI,kBAAgBtH,YAAYpB;;AAbf,EApLC;;AAqMfkH,SAAQ;;AAEP3F,YAAUF,cAAcC,KAAd,CAAqB,CAC9B6C,YAAY2C,MADkB,EAE9B3C,YAAYsC,GAFkB,EAG9B;AACC5D,UAAO,EAAEz7B,OAAO,IAAI66B,KAAJ,CAAW,OAAX,CAAT,EADR;AAECoC,YAAS,EAAEj9B,OAAO,GAAT;AAFV,GAH8B,CAArB,CAFH;;AAWPqhC,gBAAcrH,YAAYD,WAXnB;AAYPuH,kBAAgBtH,YAAYF;;AAZrB;;AArMO,CAAhB;;AAuNAqH,UAAU0B,QAAV,GAAqB;;AAEpB1I,WAAUF,cAAcC,KAAd,CAAqB,CAC9BiH,UAAUS,QAAV,CAAmBzH,QADW,EAE9B;AACC2I,aAAW,EAAE9iC,OAAO,CAAT,EADZ;AAEC+iC,sBAAoB,EAAE/iC,OAAO,CAAT;AAFrB,EAF8B,CAArB,CAFU;;AAUpBqhC,eAAcrH,YAAYP,iBAVN;AAWpB6H,iBAAgBtH,YAAYR;;AAXR,CAArB;;AAeA;;;;AAIA,SAASwJ,cAAT,GAA0B;;AAEzB,KAAI3b,UAAU,IAAd;AACA,KAAI4b,cAAc,KAAlB;AACA,KAAIC,gBAAgB,IAApB;;AAEA,UAASC,gBAAT,CAA2BC,IAA3B,EAAiCC,KAAjC,EAAyC;;AAExC,MAAKJ,gBAAgB,KAArB,EAA6B;;AAE7BC,gBAAeE,IAAf,EAAqBC,KAArB;;AAEAhc,UAAQic,qBAAR,CAA+BH,gBAA/B;AAEA;;AAED,QAAO;;AAEN5S,SAAO,YAAY;;AAElB,OAAK0S,gBAAgB,IAArB,EAA4B;AAC5B,OAAKC,kBAAkB,IAAvB,EAA8B;;AAE9B7b,WAAQic,qBAAR,CAA+BH,gBAA/B;;AAEAF,iBAAc,IAAd;AAEA,GAXK;;AAaNM,QAAM,YAAY;;AAEjBN,iBAAc,KAAd;AAEA,GAjBK;;AAmBNO,oBAAkB,UAAWhiB,QAAX,EAAsB;;AAEvC0hB,mBAAgB1hB,QAAhB;AAEA,GAvBK;;AAyBNiiB,cAAY,UAAWzjC,KAAX,EAAmB;;AAE9BqnB,aAAUrnB,KAAV;AAEA;;AA7BK,EAAP;AAiCA;;AAED;;;;AAIA,SAAS0jC,eAAT,CAA0BC,EAA1B,EAA+B;;AAE9B,KAAIC,UAAU,IAAIC,OAAJ,EAAd;;AAEA,UAASC,YAAT,CAAuBzxB,SAAvB,EAAkC0xB,UAAlC,EAA+C;;AAE9C,MAAI1hC,QAAQgQ,UAAUhQ,KAAtB;AACA,MAAI2hC,QAAQ3xB,UAAU4xB,OAAV,GAAoBN,GAAGO,YAAvB,GAAsCP,GAAGQ,WAArD;;AAEA,MAAIC,SAAST,GAAGG,YAAH,EAAb;;AAEAH,KAAGU,UAAH,CAAeN,UAAf,EAA2BK,MAA3B;AACAT,KAAGW,UAAH,CAAeP,UAAf,EAA2B1hC,KAA3B,EAAkC2hC,KAAlC;;AAEA3xB,YAAUkyB,gBAAV;;AAEA,MAAI9iC,OAAOkiC,GAAGa,KAAd;;AAEA,MAAKniC,iBAAiBoiC,YAAtB,EAAqC;;AAEpChjC,UAAOkiC,GAAGa,KAAV;AAEA,GAJD,MAIO,IAAKniC,iBAAiBqiC,YAAtB,EAAqC;;AAE3Cr1B,WAAQC,IAAR,CAAc,sEAAd;AAEA,GAJM,MAIA,IAAKjN,iBAAiBsiC,WAAtB,EAAoC;;AAE1CljC,UAAOkiC,GAAGiB,cAAV;AAEA,GAJM,MAIA,IAAKviC,iBAAiBwiC,UAAtB,EAAmC;;AAEzCpjC,UAAOkiC,GAAGmB,KAAV;AAEA,GAJM,MAIA,IAAKziC,iBAAiB0iC,WAAtB,EAAoC;;AAE1CtjC,UAAOkiC,GAAGqB,YAAV;AAEA,GAJM,MAIA,IAAK3iC,iBAAiB4iC,UAAtB,EAAmC;;AAEzCxjC,UAAOkiC,GAAGuB,GAAV;AAEA,GAJM,MAIA,IAAK7iC,iBAAiB8iC,SAAtB,EAAkC;;AAExC1jC,UAAOkiC,GAAGyB,IAAV;AAEA,GAJM,MAIA,IAAK/iC,iBAAiBgjC,UAAtB,EAAmC;;AAEzC5jC,UAAOkiC,GAAG2B,aAAV;AAEA;;AAED,SAAO;AACNlB,WAAQA,MADF;AAEN3iC,SAAMA,IAFA;AAGN8jC,oBAAiBljC,MAAMmjC,iBAHjB;AAINnf,YAAShU,UAAUgU;AAJb,GAAP;AAOA;;AAED,UAASof,YAAT,CAAuBrB,MAAvB,EAA+B/xB,SAA/B,EAA0C0xB,UAA1C,EAAuD;;AAEtD,MAAI1hC,QAAQgQ,UAAUhQ,KAAtB;AACA,MAAIqjC,cAAcrzB,UAAUqzB,WAA5B;;AAEA/B,KAAGU,UAAH,CAAeN,UAAf,EAA2BK,MAA3B;;AAEA,MAAK/xB,UAAU4xB,OAAV,KAAsB,KAA3B,EAAmC;;AAElCN,MAAGW,UAAH,CAAeP,UAAf,EAA2B1hC,KAA3B,EAAkCshC,GAAGQ,WAArC;AAEA,GAJD,MAIO,IAAKuB,YAAY5sB,KAAZ,KAAsB,CAAE,CAA7B,EAAiC;;AAEvC;;AAEA6qB,MAAGgC,aAAH,CAAkB5B,UAAlB,EAA8B,CAA9B,EAAiC1hC,KAAjC;AAEA,GANM,MAMA,IAAKqjC,YAAY5sB,KAAZ,KAAsB,CAA3B,EAA+B;;AAErCzJ,WAAQyD,KAAR,CAAe,yKAAf;AAEA,GAJM,MAIA;;AAEN6wB,MAAGgC,aAAH,CAAkB5B,UAAlB,EAA8B2B,YAAYxzB,MAAZ,GAAqB7P,MAAMmjC,iBAAzD,EACCnjC,MAAMujC,QAAN,CAAgBF,YAAYxzB,MAA5B,EAAoCwzB,YAAYxzB,MAAZ,GAAqBwzB,YAAY5sB,KAArE,CADD;;AAGA4sB,eAAY5sB,KAAZ,GAAoB,CAAE,CAAtB,CALM,CAKmB;AAEzB;AAED;;AAED;;AAEA,UAASrY,GAAT,CAAc4R,SAAd,EAA0B;;AAEzB,MAAKA,UAAUwzB,4BAAf,EAA8CxzB,YAAYA,UAAUsX,IAAtB;;AAE9C,SAAOia,QAAQnjC,GAAR,CAAa4R,SAAb,CAAP;AAEA;;AAED,UAASyzB,MAAT,CAAiBzzB,SAAjB,EAA6B;;AAE5B,MAAKA,UAAUwzB,4BAAf,EAA8CxzB,YAAYA,UAAUsX,IAAtB;;AAE9C,MAAIA,OAAOia,QAAQnjC,GAAR,CAAa4R,SAAb,CAAX;;AAEA,MAAKsX,IAAL,EAAY;;AAEXga,MAAGoC,YAAH,CAAiBpc,KAAKya,MAAtB;;AAEAR,WAAQoC,MAAR,CAAgB3zB,SAAhB;AAEA;AAED;;AAED,UAAS0M,MAAT,CAAiB1M,SAAjB,EAA4B0xB,UAA5B,EAAyC;;AAExC,MAAK1xB,UAAUwzB,4BAAf,EAA8CxzB,YAAYA,UAAUsX,IAAtB;;AAE9C,MAAIA,OAAOia,QAAQnjC,GAAR,CAAa4R,SAAb,CAAX;;AAEA,MAAKsX,SAAS/pB,SAAd,EAA0B;;AAEzBgkC,WAAQt1B,GAAR,CAAa+D,SAAb,EAAwByxB,aAAczxB,SAAd,EAAyB0xB,UAAzB,CAAxB;AAEA,GAJD,MAIO,IAAKpa,KAAKtD,OAAL,GAAehU,UAAUgU,OAA9B,EAAwC;;AAE9Cof,gBAAc9b,KAAKya,MAAnB,EAA2B/xB,SAA3B,EAAsC0xB,UAAtC;;AAEApa,QAAKtD,OAAL,GAAehU,UAAUgU,OAAzB;AAEA;AAED;;AAED,QAAO;;AAEN5lB,OAAKA,GAFC;AAGNqlC,UAAQA,MAHF;AAIN/mB,UAAQA;;AAJF,EAAP;AAQA;;AAED;;;;;;AAMA,SAASknB,KAAT,CAAgB7lC,CAAhB,EAAmB4M,CAAnB,EAAsB0H,CAAtB,EAAyBW,KAAzB,EAAiC;;AAEhC,MAAK4F,EAAL,GAAU7a,KAAK,CAAf;AACA,MAAK8a,EAAL,GAAUlO,KAAK,CAAf;AACA,MAAKmO,EAAL,GAAUzG,KAAK,CAAf;AACA,MAAKwxB,MAAL,GAAc7wB,SAAS4wB,MAAME,YAA7B;AAEA;;AAEDF,MAAMG,cAAN,GAAuB,CAAE,KAAF,EAAS,KAAT,EAAgB,KAAhB,EAAuB,KAAvB,EAA8B,KAA9B,EAAqC,KAArC,CAAvB;;AAEAH,MAAME,YAAN,GAAqB,KAArB;;AAEA5lC,OAAO8N,gBAAP,CAAyB43B,MAAM3lC,SAA/B,EAA0C;;AAEzCF,IAAG;;AAEFK,OAAK,YAAY;;AAEhB,UAAO,KAAKwa,EAAZ;AAEA,GANC;;AAQF3M,OAAK,UAAWtO,KAAX,EAAmB;;AAEvB,QAAKib,EAAL,GAAUjb,KAAV;AACA,QAAK6e,gBAAL;AAEA;;AAbC,EAFsC;;AAmBzC7R,IAAG;;AAEFvM,OAAK,YAAY;;AAEhB,UAAO,KAAKya,EAAZ;AAEA,GANC;;AAQF5M,OAAK,UAAWtO,KAAX,EAAmB;;AAEvB,QAAKkb,EAAL,GAAUlb,KAAV;AACA,QAAK6e,gBAAL;AAEA;;AAbC,EAnBsC;;AAoCzCnK,IAAG;;AAEFjU,OAAK,YAAY;;AAEhB,UAAO,KAAK0a,EAAZ;AAEA,GANC;;AAQF7M,OAAK,UAAWtO,KAAX,EAAmB;;AAEvB,QAAKmb,EAAL,GAAUnb,KAAV;AACA,QAAK6e,gBAAL;AAEA;;AAbC,EApCsC;;AAqDzCxJ,QAAO;;AAEN5U,OAAK,YAAY;;AAEhB,UAAO,KAAKylC,MAAZ;AAEA,GANK;;AAQN53B,OAAK,UAAWtO,KAAX,EAAmB;;AAEvB,QAAKkmC,MAAL,GAAclmC,KAAd;AACA,QAAK6e,gBAAL;AAEA;;AAbK;;AArDkC,CAA1C;;AAwEAte,OAAOK,MAAP,CAAeqlC,MAAM3lC,SAArB,EAAgC;;AAE/B4U,UAAS,IAFsB;;AAI/B5G,MAAK,UAAWlO,CAAX,EAAc4M,CAAd,EAAiB0H,CAAjB,EAAoBW,KAApB,EAA4B;;AAEhC,OAAK4F,EAAL,GAAU7a,CAAV;AACA,OAAK8a,EAAL,GAAUlO,CAAV;AACA,OAAKmO,EAAL,GAAUzG,CAAV;AACA,OAAKwxB,MAAL,GAAc7wB,SAAS,KAAK6wB,MAA5B;;AAEA,OAAKrnB,gBAAL;;AAEA,SAAO,IAAP;AAEA,EAf8B;;AAiB/B9P,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAKiM,EAA3B,EAA+B,KAAKC,EAApC,EAAwC,KAAKC,EAA7C,EAAiD,KAAK+qB,MAAtD,CAAP;AAEA,EArB8B;;AAuB/Bj3B,OAAM,UAAWgG,KAAX,EAAmB;;AAExB,OAAKgG,EAAL,GAAUhG,MAAMgG,EAAhB;AACA,OAAKC,EAAL,GAAUjG,MAAMiG,EAAhB;AACA,OAAKC,EAAL,GAAUlG,MAAMkG,EAAhB;AACA,OAAK+qB,MAAL,GAAcjxB,MAAMixB,MAApB;;AAEA,OAAKrnB,gBAAL;;AAEA,SAAO,IAAP;AAEA,EAlC8B;;AAoC/BnC,wBAAuB,UAAWjQ,CAAX,EAAc4I,KAAd,EAAqB0J,MAArB,EAA8B;;AAEpD,MAAI3S,QAAQb,MAAMa,KAAlB;;AAEA;;AAEA,MAAI4H,KAAKvH,EAAE6D,QAAX;AACA,MAAIkP,MAAMxL,GAAI,CAAJ,CAAV;AAAA,MAAmByL,MAAMzL,GAAI,CAAJ,CAAzB;AAAA,MAAkC0L,MAAM1L,GAAI,CAAJ,CAAxC;AACA,MAAI2L,MAAM3L,GAAI,CAAJ,CAAV;AAAA,MAAmB4L,MAAM5L,GAAI,CAAJ,CAAzB;AAAA,MAAkC6L,MAAM7L,GAAI,CAAJ,CAAxC;AACA,MAAI8L,MAAM9L,GAAI,CAAJ,CAAV;AAAA,MAAmB+L,MAAM/L,GAAI,CAAJ,CAAzB;AAAA,MAAkCgM,MAAMhM,GAAI,EAAJ,CAAxC;;AAEAqB,UAAQA,SAAS,KAAK6wB,MAAtB;;AAEA,MAAK7wB,UAAU,KAAf,EAAuB;;AAEtB,QAAK6F,EAAL,GAAUrb,KAAKwmC,IAAL,CAAWj6B,MAAOsT,GAAP,EAAY,CAAE,CAAd,EAAiB,CAAjB,CAAX,CAAV;;AAEA,OAAK7f,KAAKqR,GAAL,CAAUwO,GAAV,IAAkB,OAAvB,EAAiC;;AAEhC,SAAKzE,EAAL,GAAUpb,KAAKwR,KAAL,CAAY,CAAEwO,GAAd,EAAmBG,GAAnB,CAAV;AACA,SAAK7E,EAAL,GAAUtb,KAAKwR,KAAL,CAAY,CAAEoO,GAAd,EAAmBD,GAAnB,CAAV;AAEA,IALD,MAKO;;AAEN,SAAKvE,EAAL,GAAUpb,KAAKwR,KAAL,CAAY0O,GAAZ,EAAiBH,GAAjB,CAAV;AACA,SAAKzE,EAAL,GAAU,CAAV;AAEA;AAED,GAhBD,MAgBO,IAAK9F,UAAU,KAAf,EAAuB;;AAE7B,QAAK4F,EAAL,GAAUpb,KAAKwmC,IAAL,CAAW,CAAEj6B,MAAOyT,GAAP,EAAY,CAAE,CAAd,EAAiB,CAAjB,CAAb,CAAV;;AAEA,OAAKhgB,KAAKqR,GAAL,CAAU2O,GAAV,IAAkB,OAAvB,EAAiC;;AAEhC,SAAK3E,EAAL,GAAUrb,KAAKwR,KAAL,CAAYqO,GAAZ,EAAiBM,GAAjB,CAAV;AACA,SAAK7E,EAAL,GAAUtb,KAAKwR,KAAL,CAAYsO,GAAZ,EAAiBC,GAAjB,CAAV;AAEA,IALD,MAKO;;AAEN,SAAK1E,EAAL,GAAUrb,KAAKwR,KAAL,CAAY,CAAEyO,GAAd,EAAmBN,GAAnB,CAAV;AACA,SAAKrE,EAAL,GAAU,CAAV;AAEA;AAED,GAhBM,MAgBA,IAAK9F,UAAU,KAAf,EAAuB;;AAE7B,QAAK4F,EAAL,GAAUpb,KAAKwmC,IAAL,CAAWj6B,MAAO2T,GAAP,EAAY,CAAE,CAAd,EAAiB,CAAjB,CAAX,CAAV;;AAEA,OAAKlgB,KAAKqR,GAAL,CAAU6O,GAAV,IAAkB,OAAvB,EAAiC;;AAEhC,SAAK7E,EAAL,GAAUrb,KAAKwR,KAAL,CAAY,CAAEyO,GAAd,EAAmBE,GAAnB,CAAV;AACA,SAAK7E,EAAL,GAAUtb,KAAKwR,KAAL,CAAY,CAAEoO,GAAd,EAAmBG,GAAnB,CAAV;AAEA,IALD,MAKO;;AAEN,SAAK1E,EAAL,GAAU,CAAV;AACA,SAAKC,EAAL,GAAUtb,KAAKwR,KAAL,CAAYsO,GAAZ,EAAiBH,GAAjB,CAAV;AAEA;AAED,GAhBM,MAgBA,IAAKnK,UAAU,KAAf,EAAuB;;AAE7B,QAAK6F,EAAL,GAAUrb,KAAKwmC,IAAL,CAAW,CAAEj6B,MAAO0T,GAAP,EAAY,CAAE,CAAd,EAAiB,CAAjB,CAAb,CAAV;;AAEA,OAAKjgB,KAAKqR,GAAL,CAAU4O,GAAV,IAAkB,OAAvB,EAAiC;;AAEhC,SAAK7E,EAAL,GAAUpb,KAAKwR,KAAL,CAAY0O,GAAZ,EAAiBC,GAAjB,CAAV;AACA,SAAK7E,EAAL,GAAUtb,KAAKwR,KAAL,CAAYsO,GAAZ,EAAiBH,GAAjB,CAAV;AAEA,IALD,MAKO;;AAEN,SAAKvE,EAAL,GAAU,CAAV;AACA,SAAKE,EAAL,GAAUtb,KAAKwR,KAAL,CAAY,CAAEoO,GAAd,EAAmBG,GAAnB,CAAV;AAEA;AAED,GAhBM,MAgBA,IAAKvK,UAAU,KAAf,EAAuB;;AAE7B,QAAK8F,EAAL,GAAUtb,KAAKwmC,IAAL,CAAWj6B,MAAOuT,GAAP,EAAY,CAAE,CAAd,EAAiB,CAAjB,CAAX,CAAV;;AAEA,OAAK9f,KAAKqR,GAAL,CAAUyO,GAAV,IAAkB,OAAvB,EAAiC;;AAEhC,SAAK1E,EAAL,GAAUpb,KAAKwR,KAAL,CAAY,CAAEwO,GAAd,EAAmBD,GAAnB,CAAV;AACA,SAAK1E,EAAL,GAAUrb,KAAKwR,KAAL,CAAY,CAAEyO,GAAd,EAAmBN,GAAnB,CAAV;AAEA,IALD,MAKO;;AAEN,SAAKvE,EAAL,GAAU,CAAV;AACA,SAAKC,EAAL,GAAUrb,KAAKwR,KAAL,CAAYqO,GAAZ,EAAiBM,GAAjB,CAAV;AAEA;AAED,GAhBM,MAgBA,IAAK3K,UAAU,KAAf,EAAuB;;AAE7B,QAAK8F,EAAL,GAAUtb,KAAKwmC,IAAL,CAAW,CAAEj6B,MAAOqT,GAAP,EAAY,CAAE,CAAd,EAAiB,CAAjB,CAAb,CAAV;;AAEA,OAAK5f,KAAKqR,GAAL,CAAUuO,GAAV,IAAkB,OAAvB,EAAiC;;AAEhC,SAAKxE,EAAL,GAAUpb,KAAKwR,KAAL,CAAY0O,GAAZ,EAAiBH,GAAjB,CAAV;AACA,SAAK1E,EAAL,GAAUrb,KAAKwR,KAAL,CAAYqO,GAAZ,EAAiBF,GAAjB,CAAV;AAEA,IALD,MAKO;;AAEN,SAAKvE,EAAL,GAAUpb,KAAKwR,KAAL,CAAY,CAAEwO,GAAd,EAAmBG,GAAnB,CAAV;AACA,SAAK9E,EAAL,GAAU,CAAV;AAEA;AAED,GAhBM,MAgBA;;AAEN7L,WAAQC,IAAR,CAAc,oEAAoE+F,KAAlF;AAEA;;AAED,OAAK6wB,MAAL,GAAc7wB,KAAd;;AAEA,MAAK0J,WAAW,KAAhB,EAAwB,KAAKF,gBAAL;;AAExB,SAAO,IAAP;AAEA,EA7J8B;;AA+J/BynB,oBAAmB,YAAY;;AAE9B,MAAIhqB,SAAS,IAAIzJ,OAAJ,EAAb;;AAEA,SAAO,SAASyzB,iBAAT,CAA4BjwB,CAA5B,EAA+BhB,KAA/B,EAAsC0J,MAAtC,EAA+C;;AAErDzC,UAAOpG,0BAAP,CAAmCG,CAAnC;;AAEA,UAAO,KAAKqG,qBAAL,CAA4BJ,MAA5B,EAAoCjH,KAApC,EAA2C0J,MAA3C,CAAP;AAEA,GAND;AAQA,EAZkB,EA/JY;;AA6K/BwnB,iBAAgB,UAAWr3B,CAAX,EAAcmG,KAAd,EAAsB;;AAErC,SAAO,KAAK/G,GAAL,CAAUY,EAAE9O,CAAZ,EAAe8O,EAAElC,CAAjB,EAAoBkC,EAAEwF,CAAtB,EAAyBW,SAAS,KAAK6wB,MAAvC,CAAP;AAEA,EAjL8B;;AAmL/BM,UAAS,YAAY;;AAEpB;;AAEA,MAAInwB,IAAI,IAAIgH,UAAJ,EAAR;;AAEA,SAAO,SAASmpB,OAAT,CAAkBC,QAAlB,EAA6B;;AAEnCpwB,KAAEyI,YAAF,CAAgB,IAAhB;;AAEA,UAAO,KAAKwnB,iBAAL,CAAwBjwB,CAAxB,EAA2BowB,QAA3B,CAAP;AAEA,GAND;AAQA,EAdQ,EAnLsB;;AAmM/Bz0B,SAAQ,UAAWiD,KAAX,EAAmB;;AAE1B,SAASA,MAAMgG,EAAN,KAAa,KAAKA,EAApB,IAA8BhG,MAAMiG,EAAN,KAAa,KAAKA,EAAhD,IAA0DjG,MAAMkG,EAAN,KAAa,KAAKA,EAA5E,IAAsFlG,MAAMixB,MAAN,KAAiB,KAAKA,MAAnH;AAEA,EAvM8B;;AAyM/Bj0B,YAAW,UAAW5P,KAAX,EAAmB;;AAE7B,OAAK4Y,EAAL,GAAU5Y,MAAO,CAAP,CAAV;AACA,OAAK6Y,EAAL,GAAU7Y,MAAO,CAAP,CAAV;AACA,OAAK8Y,EAAL,GAAU9Y,MAAO,CAAP,CAAV;AACA,MAAKA,MAAO,CAAP,MAAezC,SAApB,EAAgC,KAAKsmC,MAAL,GAAc7jC,MAAO,CAAP,CAAd;;AAEhC,OAAKwc,gBAAL;;AAEA,SAAO,IAAP;AAEA,EApN8B;;AAsN/B1M,UAAS,UAAW9P,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEnC,MAAK7P,UAAUzC,SAAf,EAA2ByC,QAAQ,EAAR;AAC3B,MAAK6P,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B7P,QAAO6P,MAAP,IAAkB,KAAK+I,EAAvB;AACA5Y,QAAO6P,SAAS,CAAhB,IAAsB,KAAKgJ,EAA3B;AACA7Y,QAAO6P,SAAS,CAAhB,IAAsB,KAAKiJ,EAA3B;AACA9Y,QAAO6P,SAAS,CAAhB,IAAsB,KAAKg0B,MAA3B;;AAEA,SAAO7jC,KAAP;AAEA,EAlO8B;;AAoO/BqkC,YAAW,UAAWC,cAAX,EAA4B;;AAEtC,MAAKA,cAAL,EAAsB;;AAErB,UAAOA,eAAer4B,GAAf,CAAoB,KAAK2M,EAAzB,EAA6B,KAAKC,EAAlC,EAAsC,KAAKC,EAA3C,CAAP;AAEA,GAJD,MAIO;;AAEN,UAAO,IAAIvG,OAAJ,CAAa,KAAKqG,EAAlB,EAAsB,KAAKC,EAA3B,EAA+B,KAAKC,EAApC,CAAP;AAEA;AAED,EAhP8B;;AAkP/BoG,WAAU,UAAWC,QAAX,EAAsB;;AAE/B,OAAK3C,gBAAL,GAAwB2C,QAAxB;;AAEA,SAAO,IAAP;AAEA,EAxP8B;;AA0P/B3C,mBAAkB,YAAY,CAAE;;AA1PD,CAAhC;;AA8PA;;;;AAIA,SAAS+nB,MAAT,GAAkB;;AAEjB,MAAKC,IAAL,GAAY,IAAI,CAAhB;AAEA;;AAEDtmC,OAAOK,MAAP,CAAegmC,OAAOtmC,SAAtB,EAAiC;;AAEhCgO,MAAK,UAAWw4B,OAAX,EAAqB;;AAEzB,OAAKD,IAAL,GAAY,KAAKC,OAAL,GAAe,CAA3B;AAEA,EAN+B;;AAQhCC,SAAQ,UAAWD,OAAX,EAAqB;;AAE5B,OAAKD,IAAL,IAAa,KAAKC,OAAL,GAAe,CAA5B;AAEA,EAZ+B;;AAchCE,SAAQ,UAAWF,OAAX,EAAqB;;AAE5B,OAAKD,IAAL,IAAa,KAAKC,OAAL,GAAe,CAA5B;AAEA,EAlB+B;;AAoBhCG,UAAS,UAAWH,OAAX,EAAqB;;AAE7B,OAAKD,IAAL,IAAa,EAAI,KAAKC,OAAL,GAAe,CAAnB,CAAb;AAEA,EAxB+B;;AA0BhCI,OAAM,UAAWC,MAAX,EAAoB;;AAEzB,SAAO,CAAE,KAAKN,IAAL,GAAYM,OAAON,IAArB,MAAgC,CAAvC;AAEA;;AA9B+B,CAAjC;;AAkCA;;;;;;;;AAQA,IAAIO,aAAa,CAAjB;;AAEA,SAASC,QAAT,GAAoB;;AAEnB9mC,QAAOC,cAAP,CAAuB,IAAvB,EAA6B,IAA7B,EAAmC,EAAER,OAAOonC,YAAT,EAAnC;;AAEA,MAAKl7B,IAAL,GAAYX,MAAMI,YAAN,EAAZ;;AAEA,MAAKga,IAAL,GAAY,EAAZ;AACA,MAAKlkB,IAAL,GAAY,UAAZ;;AAEA,MAAK6lC,MAAL,GAAc,IAAd;AACA,MAAKC,QAAL,GAAgB,EAAhB;;AAEA,MAAK9wB,EAAL,GAAU4wB,SAASG,SAAT,CAAmBz4B,KAAnB,EAAV;;AAEA,KAAIgM,WAAW,IAAInG,OAAJ,EAAf;AACA,KAAI+P,WAAW,IAAIshB,KAAJ,EAAf;AACA,KAAIjrB,aAAa,IAAIqC,UAAJ,EAAjB;AACA,KAAItD,QAAQ,IAAInF,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAZ;;AAEA,UAAS6yB,gBAAT,GAA4B;;AAE3BzsB,aAAW8D,YAAX,CAAyB6F,QAAzB,EAAmC,KAAnC;AAEA;;AAED,UAAS+iB,kBAAT,GAA8B;;AAE7B/iB,WAAS2hB,iBAAT,CAA4BtrB,UAA5B,EAAwCpb,SAAxC,EAAmD,KAAnD;AAEA;;AAED+kB,UAASpD,QAAT,CAAmBkmB,gBAAnB;AACAzsB,YAAWuG,QAAX,CAAqBmmB,kBAArB;;AAEAnnC,QAAO8N,gBAAP,CAAyB,IAAzB,EAA+B;AAC9B0M,YAAU;AACT4sB,eAAY,IADH;AAET3nC,UAAO+a;AAFE,GADoB;AAK9B4J,YAAU;AACTgjB,eAAY,IADH;AAET3nC,UAAO2kB;AAFE,GALoB;AAS9B3J,cAAY;AACX2sB,eAAY,IADD;AAEX3nC,UAAOgb;AAFI,GATkB;AAa9BjB,SAAO;AACN4tB,eAAY,IADN;AAEN3nC,UAAO+Z;AAFD,GAbuB;AAiB9B6tB,mBAAiB;AAChB5nC,UAAO,IAAI6S,OAAJ;AADS,GAjBa;AAoB9Bke,gBAAc;AACb/wB,UAAO,IAAImkB,OAAJ;AADM;AApBgB,EAA/B;;AAyBA,MAAK7H,MAAL,GAAc,IAAIzJ,OAAJ,EAAd;AACA,MAAK6P,WAAL,GAAmB,IAAI7P,OAAJ,EAAnB;;AAEA,MAAKmT,gBAAL,GAAwBqhB,SAASQ,uBAAjC;AACA,MAAKC,sBAAL,GAA8B,KAA9B;;AAEA,MAAKX,MAAL,GAAc,IAAIP,MAAJ,EAAd;AACA,MAAKmB,OAAL,GAAe,IAAf;;AAEA,MAAKC,UAAL,GAAkB,KAAlB;AACA,MAAKC,aAAL,GAAqB,KAArB;;AAEA,MAAKC,aAAL,GAAqB,IAArB;AACA,MAAKC,WAAL,GAAmB,CAAnB;;AAEA,MAAKC,QAAL,GAAgB,EAAhB;AAEA;;AAEDf,SAASG,SAAT,GAAqB,IAAI5yB,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAArB;AACAyyB,SAASQ,uBAAT,GAAmC,IAAnC;;AAEAR,SAAS/mC,SAAT,GAAqBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAehlB,gBAAgBjB,SAA/B,CAAf,EAA2D;;AAE/E0O,cAAaq4B,QAFkE;;AAI/EgB,aAAY,IAJmE;;AAM/EC,iBAAgB,YAAY,CAAE,CANiD;AAO/EC,gBAAe,YAAY,CAAE,CAPkD;;AAS/EC,cAAa,UAAWlsB,MAAX,EAAoB;;AAEhC,OAAKA,MAAL,CAAY3F,gBAAZ,CAA8B2F,MAA9B,EAAsC,KAAKA,MAA3C;;AAEA,OAAKA,MAAL,CAAYF,SAAZ,CAAuB,KAAKrB,QAA5B,EAAsC,KAAKC,UAA3C,EAAuD,KAAKjB,KAA5D;AAEA,EAf8E;;AAiB/E8H,kBAAiB,UAAWxL,CAAX,EAAe;;AAE/B,OAAK2E,UAAL,CAAgBpE,WAAhB,CAA6BP,CAA7B;;AAEA,SAAO,IAAP;AAEA,EAvB8E;;AAyB/EoyB,2BAA0B,UAAW/tB,IAAX,EAAiBtJ,KAAjB,EAAyB;;AAElD;;AAEA,OAAK4J,UAAL,CAAgBsE,gBAAhB,CAAkC5E,IAAlC,EAAwCtJ,KAAxC;AAEA,EA/B8E;;AAiC/Es3B,uBAAsB,UAAWzzB,KAAX,EAAmB;;AAExC,OAAK+F,UAAL,CAAgB8D,YAAhB,CAA8B7J,KAA9B,EAAqC,IAArC;AAEA,EArC8E;;AAuC/E0zB,wBAAuB,UAAWl8B,CAAX,EAAe;;AAErC;;AAEA,OAAKuO,UAAL,CAAgB0B,qBAAhB,CAAuCjQ,CAAvC;AAEA,EA7C8E;;AA+C/Em8B,4BAA2B,UAAWvyB,CAAX,EAAe;;AAEzC;;AAEA,OAAK2E,UAAL,CAAgB/L,IAAhB,CAAsBoH,CAAtB;AAEA,EArD8E;;AAuD/EwyB,eAAc,YAAY;;AAEzB;AACA;;AAEA,MAAIC,KAAK,IAAIzrB,UAAJ,EAAT;;AAEA,SAAO,SAASwrB,YAAT,CAAuBnuB,IAAvB,EAA6BtJ,KAA7B,EAAqC;;AAE3C03B,MAAGxpB,gBAAH,CAAqB5E,IAArB,EAA2BtJ,KAA3B;;AAEA,QAAK4J,UAAL,CAAgBhL,QAAhB,CAA0B84B,EAA1B;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAjBa,EAvDiE;;AA0E/EC,oBAAmB,YAAY;;AAE9B;AACA;AACA;;AAEA,MAAID,KAAK,IAAIzrB,UAAJ,EAAT;;AAEA,SAAO,SAAS0rB,iBAAT,CAA4BruB,IAA5B,EAAkCtJ,KAAlC,EAA0C;;AAEhD03B,MAAGxpB,gBAAH,CAAqB5E,IAArB,EAA2BtJ,KAA3B;;AAEA,QAAK4J,UAAL,CAAgBpE,WAAhB,CAA6BkyB,EAA7B;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAlBkB,EA1E4D;;AA8F/EE,UAAS,YAAY;;AAEpB,MAAIl3B,KAAK,IAAI8C,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAT;;AAEA,SAAO,SAASo0B,OAAT,CAAkB53B,KAAlB,EAA0B;;AAEhC,UAAO,KAAKy3B,YAAL,CAAmB/2B,EAAnB,EAAuBV,KAAvB,CAAP;AAEA,GAJD;AAMA,EAVQ,EA9FsE;;AA0G/E63B,UAAS,YAAY;;AAEpB,MAAIn3B,KAAK,IAAI8C,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAT;;AAEA,SAAO,SAASq0B,OAAT,CAAkB73B,KAAlB,EAA0B;;AAEhC,UAAO,KAAKy3B,YAAL,CAAmB/2B,EAAnB,EAAuBV,KAAvB,CAAP;AAEA,GAJD;AAMA,EAVQ,EA1GsE;;AAsH/E83B,UAAS,YAAY;;AAEpB,MAAIp3B,KAAK,IAAI8C,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAT;;AAEA,SAAO,SAASs0B,OAAT,CAAkB93B,KAAlB,EAA0B;;AAEhC,UAAO,KAAKy3B,YAAL,CAAmB/2B,EAAnB,EAAuBV,KAAvB,CAAP;AAEA,GAJD;AAMA,EAVQ,EAtHsE;;AAkI/E+3B,kBAAiB,YAAY;;AAE5B;AACA;;AAEA,MAAIr3B,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASu0B,eAAT,CAA0BzuB,IAA1B,EAAgCoY,QAAhC,EAA2C;;AAEjDhhB,MAAG7C,IAAH,CAASyL,IAAT,EAAgBmH,eAAhB,CAAiC,KAAK7G,UAAtC;;AAEA,QAAKD,QAAL,CAAc5L,GAAd,CAAmB2C,GAAG7B,cAAH,CAAmB6iB,QAAnB,CAAnB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAjBgB,EAlI8D;;AAqJ/EsW,aAAY,YAAY;;AAEvB,MAAIt3B,KAAK,IAAI8C,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAT;;AAEA,SAAO,SAASw0B,UAAT,CAAqBtW,QAArB,EAAgC;;AAEtC,UAAO,KAAKqW,eAAL,CAAsBr3B,EAAtB,EAA0BghB,QAA1B,CAAP;AAEA,GAJD;AAMA,EAVW,EArJmE;;AAiK/EuW,aAAY,YAAY;;AAEvB,MAAIv3B,KAAK,IAAI8C,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAT;;AAEA,SAAO,SAASy0B,UAAT,CAAqBvW,QAArB,EAAgC;;AAEtC,UAAO,KAAKqW,eAAL,CAAsBr3B,EAAtB,EAA0BghB,QAA1B,CAAP;AAEA,GAJD;AAMA,EAVW,EAjKmE;;AA6K/EwW,aAAY,YAAY;;AAEvB,MAAIx3B,KAAK,IAAI8C,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAT;;AAEA,SAAO,SAAS00B,UAAT,CAAqBxW,QAArB,EAAgC;;AAEtC,UAAO,KAAKqW,eAAL,CAAsBr3B,EAAtB,EAA0BghB,QAA1B,CAAP;AAEA,GAJD;AAMA,EAVW,EA7KmE;;AAyL/EyW,eAAc,UAAWltB,MAAX,EAAoB;;AAEjC,SAAOA,OAAOrD,YAAP,CAAqB,KAAK0J,WAA1B,CAAP;AAEA,EA7L8E;;AA+L/E8mB,eAAc,YAAY;;AAEzB,MAAI3Y,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAAS22B,YAAT,CAAuBntB,MAAvB,EAAgC;;AAEtC,UAAOA,OAAOrD,YAAP,CAAqB6X,GAAGvX,UAAH,CAAe,KAAKoJ,WAApB,CAArB,CAAP;AAEA,GAJD;AAMA,EAVa,EA/LiE;;AA2M/EnM,SAAQ,YAAY;;AAEnB;;AAEA,MAAIsa,KAAK,IAAIhe,OAAJ,EAAT;AACA,MAAIwJ,SAAS,IAAIzH,OAAJ,EAAb;;AAEA,SAAO,SAAS2B,MAAT,CAAiBnW,CAAjB,EAAoB4M,CAApB,EAAuB0H,CAAvB,EAA2B;;AAEjC,OAAKtU,EAAEqhB,SAAP,EAAmB;;AAElBpF,WAAOpN,IAAP,CAAa7O,CAAb;AAEA,IAJD,MAIO;;AAENic,WAAO/N,GAAP,CAAYlO,CAAZ,EAAe4M,CAAf,EAAkB0H,CAAlB;AAEA;;AAED,OAAK,KAAK+0B,QAAV,EAAqB;;AAEpB5Y,OAAGta,MAAH,CAAW,KAAKwE,QAAhB,EAA0BsB,MAA1B,EAAkC,KAAK5F,EAAvC;AAEA,IAJD,MAIO;;AAENoa,OAAGta,MAAH,CAAW8F,MAAX,EAAmB,KAAKtB,QAAxB,EAAkC,KAAKtE,EAAvC;AAEA;;AAED,QAAKuE,UAAL,CAAgB0B,qBAAhB,CAAuCmU,EAAvC;AAEA,GAxBD;AA0BA,EAjCO,EA3MuE;;AA8O/E1hB,MAAK,UAAW8b,MAAX,EAAoB;;AAExB,MAAKhqB,UAAUC,MAAV,GAAmB,CAAxB,EAA4B;;AAE3B,QAAM,IAAIqB,IAAI,CAAd,EAAiBA,IAAItB,UAAUC,MAA/B,EAAuCqB,GAAvC,EAA8C;;AAE7C,SAAK4M,GAAL,CAAUlO,UAAWsB,CAAX,CAAV;AAEA;;AAED,UAAO,IAAP;AAEA;;AAED,MAAK0oB,WAAW,IAAhB,EAAuB;;AAEtB5b,WAAQyD,KAAR,CAAe,iEAAf,EAAkFmY,MAAlF;AACA,UAAO,IAAP;AAEA;;AAED,MAAOA,UAAUA,OAAOod,UAAxB,EAAuC;;AAEtC,OAAKpd,OAAOqc,MAAP,KAAkB,IAAvB,EAA8B;;AAE7Brc,WAAOqc,MAAP,CAAcxB,MAAd,CAAsB7a,MAAtB;AAEA;;AAEDA,UAAOqc,MAAP,GAAgB,IAAhB;AACArc,UAAO9oB,aAAP,CAAsB,EAAEV,MAAM,OAAR,EAAtB;;AAEA,QAAK8lC,QAAL,CAAczlC,IAAd,CAAoBmpB,MAApB;AAEA,GAbD,MAaO;;AAEN5b,WAAQyD,KAAR,CAAe,+DAAf,EAAgFmY,MAAhF;AAEA;;AAED,SAAO,IAAP;AAEA,EAxR8E;;AA0R/E6a,SAAQ,UAAW7a,MAAX,EAAoB;;AAE3B,MAAKhqB,UAAUC,MAAV,GAAmB,CAAxB,EAA4B;;AAE3B,QAAM,IAAIqB,IAAI,CAAd,EAAiBA,IAAItB,UAAUC,MAA/B,EAAuCqB,GAAvC,EAA8C;;AAE7C,SAAKujC,MAAL,CAAa7kC,UAAWsB,CAAX,CAAb;AAEA;;AAED,UAAO,IAAP;AAEA;;AAED,MAAIvB,QAAQ,KAAKumC,QAAL,CAAc1lC,OAAd,CAAuBopB,MAAvB,CAAZ;;AAEA,MAAKjqB,UAAU,CAAE,CAAjB,EAAqB;;AAEpBiqB,UAAOqc,MAAP,GAAgB,IAAhB;;AAEArc,UAAO9oB,aAAP,CAAsB,EAAEV,MAAM,SAAR,EAAtB;;AAEA,QAAK8lC,QAAL,CAAcrlC,MAAd,CAAsBlB,KAAtB,EAA6B,CAA7B;AAEA;;AAED,SAAO,IAAP;AAEA,EAtT8E;;AAwT/E0oC,gBAAe,UAAWC,EAAX,EAAgB;;AAE9B,SAAO,KAAKC,mBAAL,CAA0B,IAA1B,EAAgCD,EAAhC,CAAP;AAEA,EA5T8E;;AA8T/EE,kBAAiB,UAAWlkB,IAAX,EAAkB;;AAElC,SAAO,KAAKikB,mBAAL,CAA0B,MAA1B,EAAkCjkB,IAAlC,CAAP;AAEA,EAlU8E;;AAoU/EikB,sBAAqB,UAAWjkB,IAAX,EAAiB3lB,KAAjB,EAAyB;;AAE7C,MAAK,KAAM2lB,IAAN,MAAiB3lB,KAAtB,EAA8B,OAAO,IAAP;;AAE9B,OAAM,IAAIuC,IAAI,CAAR,EAAWC,IAAI,KAAK+kC,QAAL,CAAcrmC,MAAnC,EAA2CqB,IAAIC,CAA/C,EAAkDD,GAAlD,EAAyD;;AAExD,OAAIunC,QAAQ,KAAKvC,QAAL,CAAehlC,CAAf,CAAZ;AACA,OAAI0oB,SAAS6e,MAAMF,mBAAN,CAA2BjkB,IAA3B,EAAiC3lB,KAAjC,CAAb;;AAEA,OAAKirB,WAAWrrB,SAAhB,EAA4B;;AAE3B,WAAOqrB,MAAP;AAEA;AAED;;AAED,SAAOrrB,SAAP;AAEA,EAvV8E;;AAyV/EmqC,mBAAkB,UAAWlpC,MAAX,EAAoB;;AAErC,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,4DAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,OAAKsX,iBAAL,CAAwB,IAAxB;;AAEA,SAAOrrB,OAAOojB,qBAAP,CAA8B,KAAKvB,WAAnC,CAAP;AAEA,EAtW8E;;AAwW/EsnB,qBAAoB,YAAY;;AAE/B,MAAIjvB,WAAW,IAAInG,OAAJ,EAAf;AACA,MAAImF,QAAQ,IAAInF,OAAJ,EAAZ;;AAEA,SAAO,SAASo1B,kBAAT,CAA6BnpC,MAA7B,EAAsC;;AAE5C,OAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,8DAAd;AACAzO,aAAS,IAAIwc,UAAJ,EAAT;AAEA;;AAED,QAAK6O,iBAAL,CAAwB,IAAxB;;AAEA,QAAKxJ,WAAL,CAAiBtG,SAAjB,CAA4BrB,QAA5B,EAAsCla,MAAtC,EAA8CkZ,KAA9C;;AAEA,UAAOlZ,MAAP;AAEA,GAfD;AAiBA,EAtBmB,EAxW2D;;AAgY/EopC,gBAAe,YAAY;;AAE1B,MAAIlvB,WAAW,IAAInG,OAAJ,EAAf;AACA,MAAIoG,aAAa,IAAIqC,UAAJ,EAAjB;;AAEA,SAAO,SAAS4sB,aAAT,CAAwBppC,MAAxB,EAAiC;;AAEvC,OAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,yDAAd;AACAzO,aAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,QAAKsX,iBAAL,CAAwB,IAAxB;;AAEA,QAAKxJ,WAAL,CAAiBtG,SAAjB,CAA4BrB,QAA5B,EAAsCC,UAAtC,EAAkDna,MAAlD;;AAEA,UAAOA,MAAP;AAEA,GAfD;AAiBA,EAtBc,EAhYgE;;AAwZ/EqpC,oBAAmB,YAAY;;AAE9B,MAAIlvB,aAAa,IAAIqC,UAAJ,EAAjB;;AAEA,SAAO,SAAS6sB,iBAAT,CAA4BrpC,MAA5B,EAAqC;;AAE3C,OAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,6DAAd;AACAzO,aAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,QAAKo1B,kBAAL,CAAyBhvB,UAAzB;;AAEA,UAAOna,OAAOyN,GAAP,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB,EAAsBuT,eAAtB,CAAuC7G,UAAvC,CAAP;AAEA,GAbD;AAeA,EAnBkB,EAxZ4D;;AA6a/EmvB,UAAS,YAAY,CAAE,CA7awD;;AA+a/Exe,WAAU,UAAWnK,QAAX,EAAsB;;AAE/BA,WAAU,IAAV;;AAEA,MAAI+lB,WAAW,KAAKA,QAApB;;AAEA,OAAM,IAAIhlC,IAAI,CAAR,EAAWC,IAAI+kC,SAASrmC,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDglC,YAAUhlC,CAAV,EAAcopB,QAAd,CAAwBnK,QAAxB;AAEA;AAED,EA3b8E;;AA6b/E4oB,kBAAiB,UAAW5oB,QAAX,EAAsB;;AAEtC,MAAK,KAAKumB,OAAL,KAAiB,KAAtB,EAA8B;;AAE9BvmB,WAAU,IAAV;;AAEA,MAAI+lB,WAAW,KAAKA,QAApB;;AAEA,OAAM,IAAIhlC,IAAI,CAAR,EAAWC,IAAI+kC,SAASrmC,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDglC,YAAUhlC,CAAV,EAAc6nC,eAAd,CAA+B5oB,QAA/B;AAEA;AAED,EA3c8E;;AA6c/E6oB,oBAAmB,UAAW7oB,QAAX,EAAsB;;AAExC,MAAI8lB,SAAS,KAAKA,MAAlB;;AAEA,MAAKA,WAAW,IAAhB,EAAuB;;AAEtB9lB,YAAU8lB,MAAV;;AAEAA,UAAO+C,iBAAP,CAA0B7oB,QAA1B;AAEA;AAED,EAzd8E;;AA2d/EiF,eAAc,YAAY;;AAEzB,OAAKnK,MAAL,CAAYhG,OAAZ,CAAqB,KAAKyE,QAA1B,EAAoC,KAAKC,UAAzC,EAAqD,KAAKjB,KAA1D;;AAEA,OAAK+tB,sBAAL,GAA8B,IAA9B;AAEA,EAje8E;;AAme/E5b,oBAAmB,UAAWoe,KAAX,EAAmB;;AAErC,MAAK,KAAKtkB,gBAAV,EAA6B,KAAKS,YAAL;;AAE7B,MAAK,KAAKqhB,sBAAL,IAA+BwC,KAApC,EAA4C;;AAE3C,OAAK,KAAKhD,MAAL,KAAgB,IAArB,EAA4B;;AAE3B,SAAK5kB,WAAL,CAAiBzT,IAAjB,CAAuB,KAAKqN,MAA5B;AAEA,IAJD,MAIO;;AAEN,SAAKoG,WAAL,CAAiB/L,gBAAjB,CAAmC,KAAK2wB,MAAL,CAAY5kB,WAA/C,EAA4D,KAAKpG,MAAjE;AAEA;;AAED,QAAKwrB,sBAAL,GAA8B,KAA9B;;AAEAwC,WAAQ,IAAR;AAEA;;AAED;;AAEA,MAAI/C,WAAW,KAAKA,QAApB;;AAEA,OAAM,IAAIhlC,IAAI,CAAR,EAAWC,IAAI+kC,SAASrmC,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDglC,YAAUhlC,CAAV,EAAc2pB,iBAAd,CAAiCoe,KAAjC;AAEA;AAED,EAngB8E;;AAqgB/E5jB,SAAQ,UAAWC,IAAX,EAAkB;;AAEzB;AACA,MAAIC,eAAiBD,SAAS/mB,SAAT,IAAsB,OAAO+mB,IAAP,KAAgB,QAA3D;;AAEA,MAAI5lB,SAAS,EAAb;;AAEA;AACA;AACA;AACA,MAAK6lB,YAAL,EAAoB;;AAEnB;AACAD,UAAO;AACN4jB,gBAAY,EADN;AAENC,eAAW,EAFL;AAGN3jB,cAAU,EAHJ;AAINiB,YAAQ,EAJF;AAKN2iB,YAAQ;AALF,IAAP;;AAQA1pC,UAAO4mB,QAAP,GAAkB;AACjBtB,aAAS,GADQ;AAEjB5kB,UAAM,QAFW;AAGjBmmB,eAAW;AAHM,IAAlB;AAMA;;AAED;;AAEA,MAAIqD,SAAS,EAAb;;AAEAA,SAAO/e,IAAP,GAAc,KAAKA,IAAnB;AACA+e,SAAOxpB,IAAP,GAAc,KAAKA,IAAnB;;AAEA,MAAK,KAAKkkB,IAAL,KAAc,EAAnB,EAAwBsF,OAAOtF,IAAP,GAAc,KAAKA,IAAnB;AACxB,MAAK,KAAKqiB,UAAL,KAAoB,IAAzB,EAAgC/c,OAAO+c,UAAP,GAAoB,IAApB;AAChC,MAAK,KAAKC,aAAL,KAAuB,IAA5B,EAAmChd,OAAOgd,aAAP,GAAuB,IAAvB;AACnC,MAAK,KAAKF,OAAL,KAAiB,KAAtB,EAA8B9c,OAAO8c,OAAP,GAAiB,KAAjB;AAC9B,MAAK,KAAKG,aAAL,KAAuB,KAA5B,EAAoCjd,OAAOid,aAAP,GAAuB,KAAvB;AACpC,MAAK,KAAKC,WAAL,KAAqB,CAA1B,EAA8Bld,OAAOkd,WAAP,GAAqB,KAAKA,WAA1B;AAC9B,MAAKuC,KAAKC,SAAL,CAAgB,KAAKvC,QAArB,MAAoC,IAAzC,EAAgDnd,OAAOmd,QAAP,GAAkB,KAAKA,QAAvB;;AAEhDnd,SAAO3O,MAAP,GAAgB,KAAKA,MAAL,CAAYnK,OAAZ,EAAhB;;AAEA,MAAK,KAAK6T,gBAAL,KAA0B,KAA/B,EAAuCiF,OAAOjF,gBAAP,GAA0B,KAA1B;;AAEvC;;AAEA,WAAS4kB,SAAT,CAAoBC,OAApB,EAA6BC,OAA7B,EAAuC;;AAEtC,OAAKD,QAASC,QAAQ5+B,IAAjB,MAA4BtM,SAAjC,EAA6C;;AAE5CirC,YAASC,QAAQ5+B,IAAjB,IAA0B4+B,QAAQpkB,MAAR,CAAgBC,IAAhB,CAA1B;AAEA;;AAED,UAAOmkB,QAAQ5+B,IAAf;AAEA;;AAED,MAAK,KAAK2f,QAAL,KAAkBjsB,SAAvB,EAAmC;;AAElCqrB,UAAOY,QAAP,GAAkB+e,UAAWjkB,KAAK4jB,UAAhB,EAA4B,KAAK1e,QAAjC,CAAlB;;AAEA,OAAIkf,aAAa,KAAKlf,QAAL,CAAckf,UAA/B;;AAEA,OAAKA,eAAenrC,SAAf,IAA4BmrC,WAAWN,MAAX,KAAsB7qC,SAAvD,EAAmE;;AAElE,QAAI6qC,SAASM,WAAWN,MAAxB;;AAEA,QAAK/P,MAAMC,OAAN,CAAe8P,MAAf,CAAL,EAA+B;;AAE9B,UAAM,IAAIloC,IAAI,CAAR,EAAWC,IAAIioC,OAAOvpC,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,UAAIyoC,QAAQP,OAAQloC,CAAR,CAAZ;;AAEAqoC,gBAAWjkB,KAAK8jB,MAAhB,EAAwBO,KAAxB;AAEA;AAED,KAVD,MAUO;;AAENJ,eAAWjkB,KAAK8jB,MAAhB,EAAwBA,MAAxB;AAEA;AAED;AAED;;AAED,MAAK,KAAKQ,QAAL,KAAkBrrC,SAAvB,EAAmC;;AAElC,OAAK86B,MAAMC,OAAN,CAAe,KAAKsQ,QAApB,CAAL,EAAsC;;AAErC,QAAIC,QAAQ,EAAZ;;AAEA,SAAM,IAAI3oC,IAAI,CAAR,EAAWC,IAAI,KAAKyoC,QAAL,CAAc/pC,MAAnC,EAA2CqB,IAAIC,CAA/C,EAAkDD,GAAlD,EAAyD;;AAExD2oC,WAAMppC,IAAN,CAAY8oC,UAAWjkB,KAAK6jB,SAAhB,EAA2B,KAAKS,QAAL,CAAe1oC,CAAf,CAA3B,CAAZ;AAEA;;AAED0oB,WAAOggB,QAAP,GAAkBC,KAAlB;AAEA,IAZD,MAYO;;AAENjgB,WAAOggB,QAAP,GAAkBL,UAAWjkB,KAAK6jB,SAAhB,EAA2B,KAAKS,QAAhC,CAAlB;AAEA;AAED;;AAED;;AAEA,MAAK,KAAK1D,QAAL,CAAcrmC,MAAd,GAAuB,CAA5B,EAAgC;;AAE/B+pB,UAAOsc,QAAP,GAAkB,EAAlB;;AAEA,QAAM,IAAIhlC,IAAI,CAAd,EAAiBA,IAAI,KAAKglC,QAAL,CAAcrmC,MAAnC,EAA2CqB,GAA3C,EAAkD;;AAEjD0oB,WAAOsc,QAAP,CAAgBzlC,IAAhB,CAAsB,KAAKylC,QAAL,CAAehlC,CAAf,EAAmBmkB,MAAnB,CAA2BC,IAA3B,EAAkCsE,MAAxD;AAEA;AAED;;AAED,MAAKrE,YAAL,EAAoB;;AAEnB,OAAI2jB,aAAaY,iBAAkBxkB,KAAK4jB,UAAvB,CAAjB;AACA,OAAIC,YAAYW,iBAAkBxkB,KAAK6jB,SAAvB,CAAhB;AACA,OAAI3jB,WAAWskB,iBAAkBxkB,KAAKE,QAAvB,CAAf;AACA,OAAIiB,SAASqjB,iBAAkBxkB,KAAKmB,MAAvB,CAAb;AACA,OAAI2iB,SAASU,iBAAkBxkB,KAAK8jB,MAAvB,CAAb;;AAEA,OAAKF,WAAWrpC,MAAX,GAAoB,CAAzB,EAA6BH,OAAOwpC,UAAP,GAAoBA,UAApB;AAC7B,OAAKC,UAAUtpC,MAAV,GAAmB,CAAxB,EAA4BH,OAAOypC,SAAP,GAAmBA,SAAnB;AAC5B,OAAK3jB,SAAS3lB,MAAT,GAAkB,CAAvB,EAA2BH,OAAO8lB,QAAP,GAAkBA,QAAlB;AAC3B,OAAKiB,OAAO5mB,MAAP,GAAgB,CAArB,EAAyBH,OAAO+mB,MAAP,GAAgBA,MAAhB;AACzB,OAAK2iB,OAAOvpC,MAAP,GAAgB,CAArB,EAAyBH,OAAO0pC,MAAP,GAAgBA,MAAhB;AAEzB;;AAED1pC,SAAOkqB,MAAP,GAAgBA,MAAhB;;AAEA,SAAOlqB,MAAP;;AAEA;AACA;AACA;AACA,WAASoqC,gBAAT,CAA2BC,KAA3B,EAAmC;;AAElC,OAAIC,SAAS,EAAb;AACA,QAAM,IAAIC,GAAV,IAAiBF,KAAjB,EAAyB;;AAExB,QAAIzhB,OAAOyhB,MAAOE,GAAP,CAAX;AACA,WAAO3hB,KAAKhC,QAAZ;AACA0jB,WAAOvpC,IAAP,CAAa6nB,IAAb;AAEA;AACD,UAAO0hB,MAAP;AAEA;AAED,EA1qB8E;;AA4qB/Et8B,QAAO,UAAWw8B,SAAX,EAAuB;;AAE7B,SAAO,IAAI,KAAKv8B,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,EAAmCs8B,SAAnC,CAAP;AAEA,EAhrB8E;;AAkrB/Et8B,OAAM,UAAW9N,MAAX,EAAmBoqC,SAAnB,EAA+B;;AAEpC,MAAKA,cAAc3rC,SAAnB,EAA+B2rC,YAAY,IAAZ;;AAE/B,OAAK5lB,IAAL,GAAYxkB,OAAOwkB,IAAnB;;AAEA,OAAKlP,EAAL,CAAQxH,IAAR,CAAc9N,OAAOsV,EAArB;;AAEA,OAAKsE,QAAL,CAAc9L,IAAd,CAAoB9N,OAAO4Z,QAA3B;AACA,OAAKC,UAAL,CAAgB/L,IAAhB,CAAsB9N,OAAO6Z,UAA7B;AACA,OAAKjB,KAAL,CAAW9K,IAAX,CAAiB9N,OAAO4Y,KAAxB;;AAEA,OAAKuC,MAAL,CAAYrN,IAAZ,CAAkB9N,OAAOmb,MAAzB;AACA,OAAKoG,WAAL,CAAiBzT,IAAjB,CAAuB9N,OAAOuhB,WAA9B;;AAEA,OAAKsD,gBAAL,GAAwB7kB,OAAO6kB,gBAA/B;AACA,OAAK8hB,sBAAL,GAA8B3mC,OAAO2mC,sBAArC;;AAEA,OAAKX,MAAL,CAAYN,IAAZ,GAAmB1lC,OAAOgmC,MAAP,CAAcN,IAAjC;AACA,OAAKkB,OAAL,GAAe5mC,OAAO4mC,OAAtB;;AAEA,OAAKC,UAAL,GAAkB7mC,OAAO6mC,UAAzB;AACA,OAAKC,aAAL,GAAqB9mC,OAAO8mC,aAA5B;;AAEA,OAAKC,aAAL,GAAqB/mC,OAAO+mC,aAA5B;AACA,OAAKC,WAAL,GAAmBhnC,OAAOgnC,WAA1B;;AAEA,OAAKC,QAAL,GAAgBsC,KAAKc,KAAL,CAAYd,KAAKC,SAAL,CAAgBxpC,OAAOinC,QAAvB,CAAZ,CAAhB;;AAEA,MAAKmD,cAAc,IAAnB,EAA0B;;AAEzB,QAAM,IAAIhpC,IAAI,CAAd,EAAiBA,IAAIpB,OAAOomC,QAAP,CAAgBrmC,MAArC,EAA6CqB,GAA7C,EAAoD;;AAEnD,QAAIunC,QAAQ3oC,OAAOomC,QAAP,CAAiBhlC,CAAjB,CAAZ;AACA,SAAK4M,GAAL,CAAU26B,MAAM/6B,KAAN,EAAV;AAEA;AAED;;AAED,SAAO,IAAP;AAEA;;AA5tB8E,CAA3D,CAArB;;AAguBA;;;;;;AAMA,SAAS08B,MAAT,GAAkB;;AAEjBpE,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,QAAZ;;AAEA,MAAKiqC,kBAAL,GAA0B,IAAI74B,OAAJ,EAA1B;AACA,MAAK4P,gBAAL,GAAwB,IAAI5P,OAAJ,EAAxB;AAEA;;AAED44B,OAAOnrC,SAAP,GAAmBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAEtE0O,cAAay8B,MAFyD;;AAItEhC,WAAU,IAJ4D;;AAMtEx6B,OAAM,UAAW9N,MAAX,EAAmBoqC,SAAnB,EAA+B;;AAEpClE,WAAS/mC,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC,EAA4CoqC,SAA5C;;AAEA,OAAKG,kBAAL,CAAwBz8B,IAAxB,CAA8B9N,OAAOuqC,kBAArC;AACA,OAAKjpB,gBAAL,CAAsBxT,IAAtB,CAA4B9N,OAAOshB,gBAAnC;;AAEA,SAAO,IAAP;AAEA,EAfqE;;AAiBtEynB,oBAAmB,YAAY;;AAE9B,MAAIlvB,aAAa,IAAIqC,UAAJ,EAAjB;;AAEA,SAAO,SAAS6sB,iBAAT,CAA4BrpC,MAA5B,EAAqC;;AAE3C,OAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,2DAAd;AACAzO,aAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,QAAKo1B,kBAAL,CAAyBhvB,UAAzB;;AAEA,UAAOna,OAAOyN,GAAP,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAE,CAApB,EAAwBuT,eAAxB,CAAyC7G,UAAzC,CAAP;AAEA,GAbD;AAeA,EAnBkB,EAjBmD;;AAsCtEkR,oBAAmB,UAAWoe,KAAX,EAAmB;;AAErCjD,WAAS/mC,SAAT,CAAmB4rB,iBAAnB,CAAqC5qB,IAArC,CAA2C,IAA3C,EAAiDgpC,KAAjD;;AAEA,OAAKoB,kBAAL,CAAwBpyB,UAAxB,CAAoC,KAAKoJ,WAAzC;AAEA,EA5CqE;;AA8CtE3T,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA;;AAlDqE,CAApD,CAAnB;;AAsDA;;;;;AAKA,SAAS08B,kBAAT,CAA6B/uB,IAA7B,EAAmCC,KAAnC,EAA0CC,GAA1C,EAA+CC,MAA/C,EAAuDC,IAAvD,EAA6DC,GAA7D,EAAmE;;AAElEwuB,QAAOnqC,IAAP,CAAa,IAAb;;AAEA,MAAKG,IAAL,GAAY,oBAAZ;;AAEA,MAAKmqC,IAAL,GAAY,CAAZ;AACA,MAAKC,IAAL,GAAY,IAAZ;;AAEA,MAAKjvB,IAAL,GAAYA,IAAZ;AACA,MAAKC,KAAL,GAAaA,KAAb;AACA,MAAKC,GAAL,GAAWA,GAAX;AACA,MAAKC,MAAL,GAAcA,MAAd;;AAEA,MAAKC,IAAL,GAAcA,SAASpd,SAAX,GAAyBod,IAAzB,GAAgC,GAA5C;AACA,MAAKC,GAAL,GAAaA,QAAQrd,SAAV,GAAwBqd,GAAxB,GAA8B,IAAzC;;AAEA,MAAK6uB,sBAAL;AAEA;;AAEDH,mBAAmBrrC,SAAnB,GAA+BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAeklB,OAAOnrC,SAAtB,CAAf,EAAkD;;AAEhF0O,cAAa28B,kBAFmE;;AAIhFI,uBAAsB,IAJ0D;;AAMhF98B,OAAM,UAAW9N,MAAX,EAAmBoqC,SAAnB,EAA+B;;AAEpCE,SAAOnrC,SAAP,CAAiB2O,IAAjB,CAAsB3N,IAAtB,CAA4B,IAA5B,EAAkCH,MAAlC,EAA0CoqC,SAA1C;;AAEA,OAAK3uB,IAAL,GAAYzb,OAAOyb,IAAnB;AACA,OAAKC,KAAL,GAAa1b,OAAO0b,KAApB;AACA,OAAKC,GAAL,GAAW3b,OAAO2b,GAAlB;AACA,OAAKC,MAAL,GAAc5b,OAAO4b,MAArB;AACA,OAAKC,IAAL,GAAY7b,OAAO6b,IAAnB;AACA,OAAKC,GAAL,GAAW9b,OAAO8b,GAAlB;;AAEA,OAAK2uB,IAAL,GAAYzqC,OAAOyqC,IAAnB;AACA,OAAKC,IAAL,GAAY1qC,OAAO0qC,IAAP,KAAgB,IAAhB,GAAuB,IAAvB,GAA8BtrC,OAAOK,MAAP,CAAe,EAAf,EAAmBO,OAAO0qC,IAA1B,CAA1C;;AAEA,SAAO,IAAP;AAEA,EAtB+E;;AAwBhFG,gBAAe,UAAWC,SAAX,EAAsBC,UAAtB,EAAkC9rC,CAAlC,EAAqC4M,CAArC,EAAwCma,KAAxC,EAA+CC,MAA/C,EAAwD;;AAEtE,MAAK,KAAKykB,IAAL,KAAc,IAAnB,EAA0B;;AAEzB,QAAKA,IAAL,GAAY;AACXM,aAAS,IADE;AAEXF,eAAW,CAFA;AAGXC,gBAAY,CAHD;AAIXE,aAAS,CAJE;AAKXC,aAAS,CALE;AAMXllB,WAAO,CANI;AAOXC,YAAQ;AAPG,IAAZ;AAUA;;AAED,OAAKykB,IAAL,CAAUM,OAAV,GAAoB,IAApB;AACA,OAAKN,IAAL,CAAUI,SAAV,GAAsBA,SAAtB;AACA,OAAKJ,IAAL,CAAUK,UAAV,GAAuBA,UAAvB;AACA,OAAKL,IAAL,CAAUO,OAAV,GAAoBhsC,CAApB;AACA,OAAKyrC,IAAL,CAAUQ,OAAV,GAAoBr/B,CAApB;AACA,OAAK6+B,IAAL,CAAU1kB,KAAV,GAAkBA,KAAlB;AACA,OAAK0kB,IAAL,CAAUzkB,MAAV,GAAmBA,MAAnB;;AAEA,OAAK0kB,sBAAL;AAEA,EAlD+E;;AAoDhFQ,kBAAiB,YAAY;;AAE5B,MAAK,KAAKT,IAAL,KAAc,IAAnB,EAA0B;;AAEzB,QAAKA,IAAL,CAAUM,OAAV,GAAoB,KAApB;AAEA;;AAED,OAAKL,sBAAL;AAEA,EA9D+E;;AAgEhFA,yBAAwB,YAAY;;AAEnC,MAAIt6B,KAAK,CAAE,KAAKqL,KAAL,GAAa,KAAKD,IAApB,KAA+B,IAAI,KAAKgvB,IAAxC,CAAT;AACA,MAAIn6B,KAAK,CAAE,KAAKqL,GAAL,GAAW,KAAKC,MAAlB,KAA+B,IAAI,KAAK6uB,IAAxC,CAAT;AACA,MAAIhnB,KAAK,CAAE,KAAK/H,KAAL,GAAa,KAAKD,IAApB,IAA6B,CAAtC;AACA,MAAIiI,KAAK,CAAE,KAAK/H,GAAL,GAAW,KAAKC,MAAlB,IAA6B,CAAtC;;AAEA,MAAIH,OAAOgI,KAAKpT,EAAhB;AACA,MAAIqL,QAAQ+H,KAAKpT,EAAjB;AACA,MAAIsL,MAAM+H,KAAKpT,EAAf;AACA,MAAIsL,SAAS8H,KAAKpT,EAAlB;;AAEA,MAAK,KAAKo6B,IAAL,KAAc,IAAd,IAAsB,KAAKA,IAAL,CAAUM,OAArC,EAA+C;;AAE9C,OAAII,QAAQ,KAAKX,IAAL,IAAc,KAAKC,IAAL,CAAU1kB,KAAV,GAAkB,KAAK0kB,IAAL,CAAUI,SAA1C,CAAZ;AACA,OAAIO,QAAQ,KAAKZ,IAAL,IAAc,KAAKC,IAAL,CAAUzkB,MAAV,GAAmB,KAAKykB,IAAL,CAAUK,UAA3C,CAAZ;AACA,OAAIO,SAAS,CAAE,KAAK5vB,KAAL,GAAa,KAAKD,IAApB,IAA6B,KAAKivB,IAAL,CAAU1kB,KAApD;AACA,OAAIulB,SAAS,CAAE,KAAK5vB,GAAL,GAAW,KAAKC,MAAlB,IAA6B,KAAK8uB,IAAL,CAAUzkB,MAApD;;AAEAxK,WAAQ6vB,UAAW,KAAKZ,IAAL,CAAUO,OAAV,GAAoBG,KAA/B,CAAR;AACA1vB,WAAQD,OAAO6vB,UAAW,KAAKZ,IAAL,CAAU1kB,KAAV,GAAkBolB,KAA7B,CAAf;AACAzvB,UAAO4vB,UAAW,KAAKb,IAAL,CAAUQ,OAAV,GAAoBG,KAA/B,CAAP;AACAzvB,YAASD,MAAM4vB,UAAW,KAAKb,IAAL,CAAUzkB,MAAV,GAAmBolB,KAA9B,CAAf;AAEA;;AAED,OAAK/pB,gBAAL,CAAsBvF,gBAAtB,CAAwCN,IAAxC,EAA8CC,KAA9C,EAAqDC,GAArD,EAA0DC,MAA1D,EAAkE,KAAKC,IAAvE,EAA6E,KAAKC,GAAlF;AAEA,EA5F+E;;AA8FhFyJ,SAAQ,UAAWC,IAAX,EAAkB;;AAEzB,MAAIgD,OAAO0d,SAAS/mC,SAAT,CAAmBomB,MAAnB,CAA0BplB,IAA1B,CAAgC,IAAhC,EAAsCqlB,IAAtC,CAAX;;AAEAgD,OAAKsB,MAAL,CAAY2gB,IAAZ,GAAmB,KAAKA,IAAxB;AACAjiB,OAAKsB,MAAL,CAAYrO,IAAZ,GAAmB,KAAKA,IAAxB;AACA+M,OAAKsB,MAAL,CAAYpO,KAAZ,GAAoB,KAAKA,KAAzB;AACA8M,OAAKsB,MAAL,CAAYnO,GAAZ,GAAkB,KAAKA,GAAvB;AACA6M,OAAKsB,MAAL,CAAYlO,MAAZ,GAAqB,KAAKA,MAA1B;AACA4M,OAAKsB,MAAL,CAAYjO,IAAZ,GAAmB,KAAKA,IAAxB;AACA2M,OAAKsB,MAAL,CAAYhO,GAAZ,GAAkB,KAAKA,GAAvB;;AAEA,MAAK,KAAK4uB,IAAL,KAAc,IAAnB,EAA0BliB,KAAKsB,MAAL,CAAY4gB,IAAZ,GAAmBtrC,OAAOK,MAAP,CAAe,EAAf,EAAmB,KAAKirC,IAAxB,CAAnB;;AAE1B,SAAOliB,IAAP;AAEA;;AA9G+E,CAAlD,CAA/B;;AAkHA;;;;;AAKA,SAASgjB,KAAT,CAAgBj9B,CAAhB,EAAmBC,CAAnB,EAAsB+C,CAAtB,EAAyB8Q,MAAzB,EAAiCiY,KAAjC,EAAwCmR,aAAxC,EAAwD;;AAEvD,MAAKl9B,CAAL,GAASA,CAAT;AACA,MAAKC,CAAL,GAASA,CAAT;AACA,MAAK+C,CAAL,GAASA,CAAT;;AAEA,MAAK8Q,MAAL,GAAgBA,UAAUA,OAAO/B,SAAnB,GAAiC+B,MAAjC,GAA0C,IAAI5O,OAAJ,EAAxD;AACA,MAAKi4B,aAAL,GAAqBnS,MAAMC,OAAN,CAAenX,MAAf,IAA0BA,MAA1B,GAAmC,EAAxD;;AAEA,MAAKiY,KAAL,GAAeA,SAASA,MAAMhB,OAAjB,GAA6BgB,KAA7B,GAAqC,IAAIZ,KAAJ,EAAlD;AACA,MAAKiS,YAAL,GAAoBpS,MAAMC,OAAN,CAAec,KAAf,IAAyBA,KAAzB,GAAiC,EAArD;;AAEA,MAAKmR,aAAL,GAAqBA,kBAAkBhtC,SAAlB,GAA8BgtC,aAA9B,GAA8C,CAAnE;AAEA;;AAEDrsC,OAAOK,MAAP,CAAe+rC,MAAMrsC,SAArB,EAAgC;;AAE/ByO,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EAN8B;;AAQ/BA,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB,OAAKuO,CAAL,GAASvO,OAAOuO,CAAhB;AACA,OAAKC,CAAL,GAASxO,OAAOwO,CAAhB;AACA,OAAK+C,CAAL,GAASvR,OAAOuR,CAAhB;;AAEA,OAAK8Q,MAAL,CAAYvU,IAAZ,CAAkB9N,OAAOqiB,MAAzB;AACA,OAAKiY,KAAL,CAAWxsB,IAAX,CAAiB9N,OAAOs6B,KAAxB;;AAEA,OAAKmR,aAAL,GAAqBzrC,OAAOyrC,aAA5B;;AAEA,OAAM,IAAIrqC,IAAI,CAAR,EAAWooB,KAAKxpB,OAAO0rC,aAAP,CAAqB3rC,MAA3C,EAAmDqB,IAAIooB,EAAvD,EAA2DpoB,GAA3D,EAAkE;;AAEjE,QAAKsqC,aAAL,CAAoBtqC,CAApB,IAA0BpB,OAAO0rC,aAAP,CAAsBtqC,CAAtB,EAA0BwM,KAA1B,EAA1B;AAEA;;AAED,OAAM,IAAIxM,IAAI,CAAR,EAAWooB,KAAKxpB,OAAO2rC,YAAP,CAAoB5rC,MAA1C,EAAkDqB,IAAIooB,EAAtD,EAA0DpoB,GAA1D,EAAiE;;AAEhE,QAAKuqC,YAAL,CAAmBvqC,CAAnB,IAAyBpB,OAAO2rC,YAAP,CAAqBvqC,CAArB,EAAyBwM,KAAzB,EAAzB;AAEA;;AAED,SAAO,IAAP;AAEA;;AAjC8B,CAAhC;;AAqCA;;;;;;;;;AASA,IAAIg+B,aAAa,CAAjB,EAAoB;;AAEpB,SAASC,QAAT,GAAoB;;AAEnBzsC,QAAOC,cAAP,CAAuB,IAAvB,EAA6B,IAA7B,EAAmC,EAAER,OAAO+sC,cAAc,CAAvB,EAAnC;;AAEA,MAAK7gC,IAAL,GAAYX,MAAMI,YAAN,EAAZ;;AAEA,MAAKga,IAAL,GAAY,EAAZ;AACA,MAAKlkB,IAAL,GAAY,UAAZ;;AAEA,MAAKsqB,QAAL,GAAgB,EAAhB;AACA,MAAKkhB,MAAL,GAAc,EAAd;AACA,MAAKC,KAAL,GAAa,EAAb;AACA,MAAKC,aAAL,GAAqB,CAAC,EAAD,CAArB;;AAEA,MAAKC,YAAL,GAAoB,EAApB;AACA,MAAKC,YAAL,GAAoB,EAApB;;AAEA,MAAKC,WAAL,GAAmB,EAAnB;AACA,MAAKC,WAAL,GAAmB,EAAnB;;AAEA,MAAKC,aAAL,GAAqB,EAArB;;AAEA,MAAKC,WAAL,GAAmB,IAAnB;AACA,MAAKhb,cAAL,GAAsB,IAAtB;;AAEA;;AAEA,MAAKib,kBAAL,GAA0B,KAA1B;AACA,MAAKC,kBAAL,GAA0B,KAA1B;AACA,MAAKC,aAAL,GAAqB,KAArB;AACA,MAAKC,iBAAL,GAAyB,KAAzB;AACA,MAAKC,gBAAL,GAAwB,KAAxB;AACA,MAAKC,uBAAL,GAA+B,KAA/B;AACA,MAAKC,gBAAL,GAAwB,KAAxB;AAEA;;AAEDhB,SAAS1sC,SAAT,GAAqBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAehlB,gBAAgBjB,SAA/B,CAAf,EAA2D;;AAE/E0O,cAAag+B,QAFkE;;AAI/ElhB,aAAY,IAJmE;;AAM/E0c,cAAa,UAAWlsB,MAAX,EAAoB;;AAEhC,MAAIyU,eAAe,IAAI5M,OAAJ,GAAcI,eAAd,CAA+BjI,MAA/B,CAAnB;;AAEA,OAAM,IAAI/Z,IAAI,CAAR,EAAWooB,KAAK,KAAKoB,QAAL,CAAc7qB,MAApC,EAA4CqB,IAAIooB,EAAhD,EAAoDpoB,GAApD,EAA2D;;AAE1D,OAAI0rC,SAAS,KAAKliB,QAAL,CAAexpB,CAAf,CAAb;AACA0rC,UAAOj1B,YAAP,CAAqBsD,MAArB;AAEA;;AAED,OAAM,IAAI/Z,IAAI,CAAR,EAAWooB,KAAK,KAAKuiB,KAAL,CAAWhsC,MAAjC,EAAyCqB,IAAIooB,EAA7C,EAAiDpoB,GAAjD,EAAwD;;AAEvD,OAAI2rC,OAAO,KAAKhB,KAAL,CAAY3qC,CAAZ,CAAX;AACA2rC,QAAK1qB,MAAL,CAAYpT,YAAZ,CAA0B2gB,YAA1B,EAAyC5f,SAAzC;;AAEA,QAAM,IAAIqc,IAAI,CAAR,EAAW2gB,KAAKD,KAAKrB,aAAL,CAAmB3rC,MAAzC,EAAiDssB,IAAI2gB,EAArD,EAAyD3gB,GAAzD,EAAgE;;AAE/D0gB,SAAKrB,aAAL,CAAoBrf,CAApB,EAAwBpd,YAAxB,CAAsC2gB,YAAtC,EAAqD5f,SAArD;AAEA;AAED;;AAED,MAAK,KAAKs8B,WAAL,KAAqB,IAA1B,EAAiC;;AAEhC,QAAKW,kBAAL;AAEA;;AAED,MAAK,KAAK3b,cAAL,KAAwB,IAA7B,EAAoC;;AAEnC,QAAKC,qBAAL;AAEA;;AAED,OAAKib,kBAAL,GAA0B,IAA1B;AACA,OAAKE,iBAAL,GAAyB,IAAzB;;AAEA,SAAO,IAAP;AAEA,EA/C8E;;AAiD/E7E,UAAS,YAAY;;AAEpB;;AAEA,MAAInY,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAASm2B,OAAT,CAAkB53B,KAAlB,EAA0B;;AAEhCyf,MAAGxW,aAAH,CAAkBjJ,KAAlB;;AAEA,QAAKo3B,WAAL,CAAkB3X,EAAlB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAhBQ,EAjDsE;;AAmE/EoY,UAAS,YAAY;;AAEpB;;AAEA,MAAIpY,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAASo2B,OAAT,CAAkB73B,KAAlB,EAA0B;;AAEhCyf,MAAGtW,aAAH,CAAkBnJ,KAAlB;;AAEA,QAAKo3B,WAAL,CAAkB3X,EAAlB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAhBQ,EAnEsE;;AAqF/EqY,UAAS,YAAY;;AAEpB;;AAEA,MAAIrY,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAASq2B,OAAT,CAAkB93B,KAAlB,EAA0B;;AAEhCyf,MAAGrW,aAAH,CAAkBpJ,KAAlB;;AAEA,QAAKo3B,WAAL,CAAkB3X,EAAlB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAhBQ,EArFsE;;AAuG/E9L,YAAW,YAAY;;AAEtB;;AAEA,MAAI8L,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAASkS,SAAT,CAAoB3kB,CAApB,EAAuB4M,CAAvB,EAA0B0H,CAA1B,EAA8B;;AAEpCmc,MAAGzW,eAAH,CAAoBha,CAApB,EAAuB4M,CAAvB,EAA0B0H,CAA1B;;AAEA,QAAK8zB,WAAL,CAAkB3X,EAAlB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAhBU,EAvGoE;;AAyH/E9W,QAAO,YAAY;;AAElB;;AAEA,MAAI8W,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAASkH,KAAT,CAAgB3Z,CAAhB,EAAmB4M,CAAnB,EAAsB0H,CAAtB,EAA0B;;AAEhCmc,MAAGhW,SAAH,CAAcza,CAAd,EAAiB4M,CAAjB,EAAoB0H,CAApB;;AAEA,QAAK8zB,WAAL,CAAkB3X,EAAlB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAhBM,EAzHwE;;AA2I/Eta,SAAQ,YAAY;;AAEnB,MAAI83B,MAAM,IAAIhH,QAAJ,EAAV;;AAEA,SAAO,SAAS9wB,MAAT,CAAiB8F,MAAjB,EAA0B;;AAEhCgyB,OAAI93B,MAAJ,CAAY8F,MAAZ;;AAEAgyB,OAAI5nB,YAAJ;;AAEA,QAAK+hB,WAAL,CAAkB6F,IAAI/xB,MAAtB;AAEA,GARD;AAUA,EAdO,EA3IuE;;AA2J/EgyB,qBAAoB,UAAWziB,QAAX,EAAsB;;AAEzC,MAAIH,QAAQ,IAAZ;;AAEA,MAAI6iB,UAAU1iB,SAAS7qB,KAAT,KAAmB,IAAnB,GAA0B6qB,SAAS7qB,KAAT,CAAeqB,KAAzC,GAAiDzC,SAA/D;AACA,MAAIqsB,aAAaJ,SAASI,UAA1B;;AAEA,MAAIuiB,YAAYviB,WAAWlR,QAAX,CAAoB1Y,KAApC;AACA,MAAIosC,UAAUxiB,WAAWzI,MAAX,KAAsB5jB,SAAtB,GAAkCqsB,WAAWzI,MAAX,CAAkBnhB,KAApD,GAA4DzC,SAA1E;AACA,MAAIqtC,SAAShhB,WAAWwP,KAAX,KAAqB77B,SAArB,GAAiCqsB,WAAWwP,KAAX,CAAiBp5B,KAAlD,GAA0DzC,SAAvE;AACA,MAAI8uC,MAAMziB,WAAW/D,EAAX,KAAkBtoB,SAAlB,GAA8BqsB,WAAW/D,EAAX,CAAc7lB,KAA5C,GAAoDzC,SAA9D;AACA,MAAI+uC,OAAO1iB,WAAW2iB,GAAX,KAAmBhvC,SAAnB,GAA+BqsB,WAAW2iB,GAAX,CAAevsC,KAA9C,GAAsDzC,SAAjE;;AAEA,MAAK+uC,SAAS/uC,SAAd,EAA0B,KAAKutC,aAAL,CAAoB,CAApB,IAA0B,EAA1B;;AAE1B,MAAI0B,cAAc,EAAlB;AACA,MAAIC,UAAU,EAAd;AACA,MAAIC,WAAW,EAAf;;AAEA,OAAM,IAAIxsC,IAAI,CAAR,EAAWirB,IAAI,CAArB,EAAwBjrB,IAAIisC,UAAUttC,MAAtC,EAA8CqB,KAAK,CAAL,EAAQirB,KAAK,CAA3D,EAA+D;;AAE9D9B,SAAMK,QAAN,CAAejqB,IAAf,CAAqB,IAAI8S,OAAJ,CAAa45B,UAAWjsC,CAAX,CAAb,EAA6BisC,UAAWjsC,IAAI,CAAf,CAA7B,EAAiDisC,UAAWjsC,IAAI,CAAf,CAAjD,CAArB;;AAEA,OAAKksC,YAAY7uC,SAAjB,EAA6B;;AAE5BivC,gBAAY/sC,IAAZ,CAAkB,IAAI8S,OAAJ,CAAa65B,QAASlsC,CAAT,CAAb,EAA2BksC,QAASlsC,IAAI,CAAb,CAA3B,EAA6CksC,QAASlsC,IAAI,CAAb,CAA7C,CAAlB;AAEA;;AAED,OAAK0qC,WAAWrtC,SAAhB,EAA4B;;AAE3B8rB,UAAMuhB,MAAN,CAAanrC,IAAb,CAAmB,IAAI+4B,KAAJ,CAAWoS,OAAQ1qC,CAAR,CAAX,EAAwB0qC,OAAQ1qC,IAAI,CAAZ,CAAxB,EAAyC0qC,OAAQ1qC,IAAI,CAAZ,CAAzC,CAAnB;AAEA;;AAED,OAAKmsC,QAAQ9uC,SAAb,EAAyB;;AAExBkvC,YAAQhtC,IAAR,CAAc,IAAIsM,OAAJ,CAAasgC,IAAKlhB,CAAL,CAAb,EAAuBkhB,IAAKlhB,IAAI,CAAT,CAAvB,CAAd;AAEA;;AAED,OAAKmhB,SAAS/uC,SAAd,EAA0B;;AAEzBmvC,aAASjtC,IAAT,CAAe,IAAIsM,OAAJ,CAAaugC,KAAMnhB,CAAN,CAAb,EAAwBmhB,KAAMnhB,IAAI,CAAV,CAAxB,CAAf;AAEA;AAED;;AAED,WAASwhB,OAAT,CAAkBt/B,CAAlB,EAAqBC,CAArB,EAAwB+C,CAAxB,EAA2Bk6B,aAA3B,EAA2C;;AAE1C,OAAIC,gBAAgB4B,YAAY7uC,SAAZ,GAAwB,CAAEivC,YAAan/B,CAAb,EAAiBX,KAAjB,EAAF,EAA4B8/B,YAAal/B,CAAb,EAAiBZ,KAAjB,EAA5B,EAAsD8/B,YAAan8B,CAAb,EAAiB3D,KAAjB,EAAtD,CAAxB,GAA2G,EAA/H;AACA,OAAI+9B,eAAeG,WAAWrtC,SAAX,GAAuB,CAAE8rB,MAAMuhB,MAAN,CAAcv9B,CAAd,EAAkBX,KAAlB,EAAF,EAA6B2c,MAAMuhB,MAAN,CAAct9B,CAAd,EAAkBZ,KAAlB,EAA7B,EAAwD2c,MAAMuhB,MAAN,CAAcv6B,CAAd,EAAkB3D,KAAlB,EAAxD,CAAvB,GAA6G,EAAhI;;AAEA,OAAIm/B,OAAO,IAAIvB,KAAJ,CAAWj9B,CAAX,EAAcC,CAAd,EAAiB+C,CAAjB,EAAoBm6B,aAApB,EAAmCC,YAAnC,EAAiDF,aAAjD,CAAX;;AAEAlhB,SAAMwhB,KAAN,CAAYprC,IAAZ,CAAkBosC,IAAlB;;AAEA,OAAKQ,QAAQ9uC,SAAb,EAAyB;;AAExB8rB,UAAMyhB,aAAN,CAAqB,CAArB,EAAyBrrC,IAAzB,CAA+B,CAAEgtC,QAASp/B,CAAT,EAAaX,KAAb,EAAF,EAAwB+/B,QAASn/B,CAAT,EAAaZ,KAAb,EAAxB,EAA8C+/B,QAASp8B,CAAT,EAAa3D,KAAb,EAA9C,CAA/B;AAEA;;AAED,OAAK4/B,SAAS/uC,SAAd,EAA0B;;AAEzB8rB,UAAMyhB,aAAN,CAAqB,CAArB,EAAyBrrC,IAAzB,CAA+B,CAAEitC,SAAUr/B,CAAV,EAAcX,KAAd,EAAF,EAAyBggC,SAAUp/B,CAAV,EAAcZ,KAAd,EAAzB,EAAgDggC,SAAUr8B,CAAV,EAAc3D,KAAd,EAAhD,CAA/B;AAEA;AAED;;AAED,MAAIkgC,SAASpjB,SAASojB,MAAtB;;AAEA,MAAKA,OAAO/tC,MAAP,GAAgB,CAArB,EAAyB;;AAExB,QAAM,IAAIqB,IAAI,CAAd,EAAiBA,IAAI0sC,OAAO/tC,MAA5B,EAAoCqB,GAApC,EAA2C;;AAE1C,QAAI2sC,QAAQD,OAAQ1sC,CAAR,CAAZ;;AAEA,QAAIguB,QAAQ2e,MAAM3e,KAAlB;AACA,QAAIzX,QAAQo2B,MAAMp2B,KAAlB;;AAEA,SAAM,IAAI0U,IAAI+C,KAAR,EAAe4d,KAAK5d,QAAQzX,KAAlC,EAAyC0U,IAAI2gB,EAA7C,EAAiD3gB,KAAK,CAAtD,EAA0D;;AAEzD,SAAK+gB,YAAY3uC,SAAjB,EAA6B;;AAE5BovC,cAAST,QAAS/gB,CAAT,CAAT,EAAuB+gB,QAAS/gB,IAAI,CAAb,CAAvB,EAAyC+gB,QAAS/gB,IAAI,CAAb,CAAzC,EAA2D0hB,MAAMtC,aAAjE;AAEA,MAJD,MAIO;;AAENoC,cAASxhB,CAAT,EAAYA,IAAI,CAAhB,EAAmBA,IAAI,CAAvB,EAA0B0hB,MAAMtC,aAAhC;AAEA;AAED;AAED;AAED,GAzBD,MAyBO;;AAEN,OAAK2B,YAAY3uC,SAAjB,EAA6B;;AAE5B,SAAM,IAAI2C,IAAI,CAAd,EAAiBA,IAAIgsC,QAAQrtC,MAA7B,EAAqCqB,KAAK,CAA1C,EAA8C;;AAE7CysC,aAAST,QAAShsC,CAAT,CAAT,EAAuBgsC,QAAShsC,IAAI,CAAb,CAAvB,EAAyCgsC,QAAShsC,IAAI,CAAb,CAAzC;AAEA;AAED,IARD,MAQO;;AAEN,SAAM,IAAIA,IAAI,CAAd,EAAiBA,IAAIisC,UAAUttC,MAAV,GAAmB,CAAxC,EAA2CqB,KAAK,CAAhD,EAAoD;;AAEnDysC,aAASzsC,CAAT,EAAYA,IAAI,CAAhB,EAAmBA,IAAI,CAAvB;AAEA;AAED;AAED;;AAED,OAAK4sC,kBAAL;;AAEA,MAAKtjB,SAAS4hB,WAAT,KAAyB,IAA9B,EAAqC;;AAEpC,QAAKA,WAAL,GAAmB5hB,SAAS4hB,WAAT,CAAqB1+B,KAArB,EAAnB;AAEA;;AAED,MAAK8c,SAAS4G,cAAT,KAA4B,IAAjC,EAAwC;;AAEvC,QAAKA,cAAL,GAAsB5G,SAAS4G,cAAT,CAAwB1jB,KAAxB,EAAtB;AAEA;;AAED,SAAO,IAAP;AAEA,EApS8E;;AAsS/E0D,SAAQ,YAAY;;AAEnB,MAAIP,SAAS,IAAI0C,OAAJ,EAAb;;AAEA,SAAO,SAASnC,MAAT,GAAkB;;AAExB,QAAK27B,kBAAL;;AAEA,QAAKX,WAAL,CAAiBpiB,SAAjB,CAA4BnZ,MAA5B,EAAqCrB,MAArC;;AAEA,QAAKkU,SAAL,CAAgB7S,OAAO9R,CAAvB,EAA0B8R,OAAOlF,CAAjC,EAAoCkF,OAAOwC,CAA3C;;AAEA,UAAO,IAAP;AAEA,GAVD;AAYA,EAhBO,EAtSuE;;AAwT/EvD,YAAW,YAAY;;AAEtB,OAAKuhB,qBAAL;;AAEA,MAAIjgB,SAAS,KAAKggB,cAAL,CAAoBhgB,MAAjC;AACA,MAAIsR,SAAS,KAAK0O,cAAL,CAAoB1O,MAAjC;;AAEA,MAAItU,IAAIsU,WAAW,CAAX,GAAe,CAAf,GAAmB,MAAMA,MAAjC;;AAEA,MAAIzH,SAAS,IAAIzJ,OAAJ,EAAb;AACAyJ,SAAOhO,GAAP,CACCmB,CADD,EACI,CADJ,EACO,CADP,EACU,CAAEA,CAAF,GAAMgD,OAAOrS,CADvB,EAEC,CAFD,EAEIqP,CAFJ,EAEO,CAFP,EAEU,CAAEA,CAAF,GAAMgD,OAAOzF,CAFvB,EAGC,CAHD,EAGI,CAHJ,EAGOyC,CAHP,EAGU,CAAEA,CAAF,GAAMgD,OAAOiC,CAHvB,EAIC,CAJD,EAII,CAJJ,EAIO,CAJP,EAIU,CAJV;;AAOA,OAAK8zB,WAAL,CAAkBlsB,MAAlB;;AAEA,SAAO,IAAP;AAEA,EA7U8E;;AA+U/E6yB,qBAAoB,YAAY;;AAE/B,MAAIC,KAAK,IAAIx6B,OAAJ,EAAT;AAAA,MAAwBy6B,KAAK,IAAIz6B,OAAJ,EAA7B;;AAEA,OAAM,IAAIQ,IAAI,CAAR,EAAWk6B,KAAK,KAAKpC,KAAL,CAAWhsC,MAAjC,EAAyCkU,IAAIk6B,EAA7C,EAAiDl6B,GAAjD,EAAwD;;AAEvD,OAAI84B,OAAO,KAAKhB,KAAL,CAAY93B,CAAZ,CAAX;;AAEA,OAAIm6B,KAAK,KAAKxjB,QAAL,CAAemiB,KAAKx+B,CAApB,CAAT;AACA,OAAI8/B,KAAK,KAAKzjB,QAAL,CAAemiB,KAAKv+B,CAApB,CAAT;AACA,OAAI8/B,KAAK,KAAK1jB,QAAL,CAAemiB,KAAKx7B,CAApB,CAAT;;AAEA08B,MAAGt/B,UAAH,CAAe2/B,EAAf,EAAmBD,EAAnB;AACAH,MAAGv/B,UAAH,CAAey/B,EAAf,EAAmBC,EAAnB;AACAJ,MAAGvsB,KAAH,CAAUwsB,EAAV;;AAEAD,MAAGj+B,SAAH;;AAEA+8B,QAAK1qB,MAAL,CAAYvU,IAAZ,CAAkBmgC,EAAlB;AAEA;AAED,EArW8E;;AAuW/EM,uBAAsB,UAAWC,YAAX,EAA0B;;AAE/C,MAAKA,iBAAiB/vC,SAAtB,EAAkC+vC,eAAe,IAAf;;AAElC,MAAIzgC,CAAJ,EAAO0gC,EAAP,EAAWx6B,CAAX,EAAck6B,EAAd,EAAkBpB,IAAlB,EAAwBniB,QAAxB;;AAEAA,aAAW,IAAI2O,KAAJ,CAAW,KAAK3O,QAAL,CAAc7qB,MAAzB,CAAX;;AAEA,OAAMgO,IAAI,CAAJ,EAAO0gC,KAAK,KAAK7jB,QAAL,CAAc7qB,MAAhC,EAAwCgO,IAAI0gC,EAA5C,EAAgD1gC,GAAhD,EAAuD;;AAEtD6c,YAAU7c,CAAV,IAAgB,IAAI0F,OAAJ,EAAhB;AAEA;;AAED,MAAK+6B,YAAL,EAAoB;;AAEnB;AACA;;AAEA,OAAIJ,EAAJ,EAAQC,EAAR,EAAYC,EAAZ;AACA,OAAIL,KAAK,IAAIx6B,OAAJ,EAAT;AAAA,OAAwBy6B,KAAK,IAAIz6B,OAAJ,EAA7B;;AAEA,QAAMQ,IAAI,CAAJ,EAAOk6B,KAAK,KAAKpC,KAAL,CAAWhsC,MAA7B,EAAqCkU,IAAIk6B,EAAzC,EAA6Cl6B,GAA7C,EAAoD;;AAEnD84B,WAAO,KAAKhB,KAAL,CAAY93B,CAAZ,CAAP;;AAEAm6B,SAAK,KAAKxjB,QAAL,CAAemiB,KAAKx+B,CAApB,CAAL;AACA8/B,SAAK,KAAKzjB,QAAL,CAAemiB,KAAKv+B,CAApB,CAAL;AACA8/B,SAAK,KAAK1jB,QAAL,CAAemiB,KAAKx7B,CAApB,CAAL;;AAEA08B,OAAGt/B,UAAH,CAAe2/B,EAAf,EAAmBD,EAAnB;AACAH,OAAGv/B,UAAH,CAAey/B,EAAf,EAAmBC,EAAnB;AACAJ,OAAGvsB,KAAH,CAAUwsB,EAAV;;AAEAtjB,aAAUmiB,KAAKx+B,CAAf,EAAmBP,GAAnB,CAAwBigC,EAAxB;AACArjB,aAAUmiB,KAAKv+B,CAAf,EAAmBR,GAAnB,CAAwBigC,EAAxB;AACArjB,aAAUmiB,KAAKx7B,CAAf,EAAmBvD,GAAnB,CAAwBigC,EAAxB;AAEA;AAED,GA1BD,MA0BO;;AAEN,QAAKD,kBAAL;;AAEA,QAAM/5B,IAAI,CAAJ,EAAOk6B,KAAK,KAAKpC,KAAL,CAAWhsC,MAA7B,EAAqCkU,IAAIk6B,EAAzC,EAA6Cl6B,GAA7C,EAAoD;;AAEnD84B,WAAO,KAAKhB,KAAL,CAAY93B,CAAZ,CAAP;;AAEA2W,aAAUmiB,KAAKx+B,CAAf,EAAmBP,GAAnB,CAAwB++B,KAAK1qB,MAA7B;AACAuI,aAAUmiB,KAAKv+B,CAAf,EAAmBR,GAAnB,CAAwB++B,KAAK1qB,MAA7B;AACAuI,aAAUmiB,KAAKx7B,CAAf,EAAmBvD,GAAnB,CAAwB++B,KAAK1qB,MAA7B;AAEA;AAED;;AAED,OAAMtU,IAAI,CAAJ,EAAO0gC,KAAK,KAAK7jB,QAAL,CAAc7qB,MAAhC,EAAwCgO,IAAI0gC,EAA5C,EAAgD1gC,GAAhD,EAAuD;;AAEtD6c,YAAU7c,CAAV,EAAciC,SAAd;AAEA;;AAED,OAAMiE,IAAI,CAAJ,EAAOk6B,KAAK,KAAKpC,KAAL,CAAWhsC,MAA7B,EAAqCkU,IAAIk6B,EAAzC,EAA6Cl6B,GAA7C,EAAoD;;AAEnD84B,UAAO,KAAKhB,KAAL,CAAY93B,CAAZ,CAAP;;AAEA,OAAIy3B,gBAAgBqB,KAAKrB,aAAzB;;AAEA,OAAKA,cAAc3rC,MAAd,KAAyB,CAA9B,EAAkC;;AAEjC2rC,kBAAe,CAAf,EAAmB59B,IAAnB,CAAyB8c,SAAUmiB,KAAKx+B,CAAf,CAAzB;AACAm9B,kBAAe,CAAf,EAAmB59B,IAAnB,CAAyB8c,SAAUmiB,KAAKv+B,CAAf,CAAzB;AACAk9B,kBAAe,CAAf,EAAmB59B,IAAnB,CAAyB8c,SAAUmiB,KAAKx7B,CAAf,CAAzB;AAEA,IAND,MAMO;;AAENm6B,kBAAe,CAAf,IAAqB9gB,SAAUmiB,KAAKx+B,CAAf,EAAmBX,KAAnB,EAArB;AACA89B,kBAAe,CAAf,IAAqB9gB,SAAUmiB,KAAKv+B,CAAf,EAAmBZ,KAAnB,EAArB;AACA89B,kBAAe,CAAf,IAAqB9gB,SAAUmiB,KAAKx7B,CAAf,EAAmB3D,KAAnB,EAArB;AAEA;AAED;;AAED,MAAK,KAAKm+B,KAAL,CAAWhsC,MAAX,GAAoB,CAAzB,EAA6B;;AAE5B,QAAK2sC,iBAAL,GAAyB,IAAzB;AAEA;AAED,EAjc8E;;AAmc/EgC,2BAA0B,YAAY;;AAErC,MAAIz6B,CAAJ,EAAOk6B,EAAP,EAAWpB,IAAX;;AAEA,OAAKiB,kBAAL;;AAEA,OAAM/5B,IAAI,CAAJ,EAAOk6B,KAAK,KAAKpC,KAAL,CAAWhsC,MAA7B,EAAqCkU,IAAIk6B,EAAzC,EAA6Cl6B,GAA7C,EAAoD;;AAEnD84B,UAAO,KAAKhB,KAAL,CAAY93B,CAAZ,CAAP;;AAEA,OAAIy3B,gBAAgBqB,KAAKrB,aAAzB;;AAEA,OAAKA,cAAc3rC,MAAd,KAAyB,CAA9B,EAAkC;;AAEjC2rC,kBAAe,CAAf,EAAmB59B,IAAnB,CAAyBi/B,KAAK1qB,MAA9B;AACAqpB,kBAAe,CAAf,EAAmB59B,IAAnB,CAAyBi/B,KAAK1qB,MAA9B;AACAqpB,kBAAe,CAAf,EAAmB59B,IAAnB,CAAyBi/B,KAAK1qB,MAA9B;AAEA,IAND,MAMO;;AAENqpB,kBAAe,CAAf,IAAqBqB,KAAK1qB,MAAL,CAAYzU,KAAZ,EAArB;AACA89B,kBAAe,CAAf,IAAqBqB,KAAK1qB,MAAL,CAAYzU,KAAZ,EAArB;AACA89B,kBAAe,CAAf,IAAqBqB,KAAK1qB,MAAL,CAAYzU,KAAZ,EAArB;AAEA;AAED;;AAED,MAAK,KAAKm+B,KAAL,CAAWhsC,MAAX,GAAoB,CAAzB,EAA6B;;AAE5B,QAAK2sC,iBAAL,GAAyB,IAAzB;AAEA;AAED,EAre8E;;AAue/EiC,sBAAqB,YAAY;;AAEhC,MAAIvtC,CAAJ,EAAOooB,EAAP,EAAWvV,CAAX,EAAck6B,EAAd,EAAkBpB,IAAlB;;AAEA;AACA;AACA;;AAEA,OAAM94B,IAAI,CAAJ,EAAOk6B,KAAK,KAAKpC,KAAL,CAAWhsC,MAA7B,EAAqCkU,IAAIk6B,EAAzC,EAA6Cl6B,GAA7C,EAAoD;;AAEnD84B,UAAO,KAAKhB,KAAL,CAAY93B,CAAZ,CAAP;;AAEA,OAAK,CAAE84B,KAAK6B,oBAAZ,EAAmC;;AAElC7B,SAAK6B,oBAAL,GAA4B7B,KAAK1qB,MAAL,CAAYzU,KAAZ,EAA5B;AAEA,IAJD,MAIO;;AAENm/B,SAAK6B,oBAAL,CAA0B9gC,IAA1B,CAAgCi/B,KAAK1qB,MAArC;AAEA;;AAED,OAAK,CAAE0qB,KAAK8B,uBAAZ,EAAsC9B,KAAK8B,uBAAL,GAA+B,EAA/B;;AAEtC,QAAMztC,IAAI,CAAJ,EAAOooB,KAAKujB,KAAKrB,aAAL,CAAmB3rC,MAArC,EAA6CqB,IAAIooB,EAAjD,EAAqDpoB,GAArD,EAA4D;;AAE3D,QAAK,CAAE2rC,KAAK8B,uBAAL,CAA8BztC,CAA9B,CAAP,EAA2C;;AAE1C2rC,UAAK8B,uBAAL,CAA8BztC,CAA9B,IAAoC2rC,KAAKrB,aAAL,CAAoBtqC,CAApB,EAAwBwM,KAAxB,EAApC;AAEA,KAJD,MAIO;;AAENm/B,UAAK8B,uBAAL,CAA8BztC,CAA9B,EAAkC0M,IAAlC,CAAwCi/B,KAAKrB,aAAL,CAAoBtqC,CAApB,CAAxC;AAEA;AAED;AAED;;AAED;;AAEA,MAAI0tC,SAAS,IAAIjD,QAAJ,EAAb;AACAiD,SAAO/C,KAAP,GAAe,KAAKA,KAApB;;AAEA,OAAM3qC,IAAI,CAAJ,EAAOooB,KAAK,KAAKyiB,YAAL,CAAkBlsC,MAApC,EAA4CqB,IAAIooB,EAAhD,EAAoDpoB,GAApD,EAA2D;;AAE1D;;AAEA,OAAK,CAAE,KAAK8qC,YAAL,CAAmB9qC,CAAnB,CAAP,EAAgC;;AAE/B,SAAK8qC,YAAL,CAAmB9qC,CAAnB,IAAyB,EAAzB;AACA,SAAK8qC,YAAL,CAAmB9qC,CAAnB,EAAuB2tC,WAAvB,GAAqC,EAArC;AACA,SAAK7C,YAAL,CAAmB9qC,CAAnB,EAAuBsqC,aAAvB,GAAuC,EAAvC;;AAEA,QAAIsD,iBAAiB,KAAK9C,YAAL,CAAmB9qC,CAAnB,EAAuB2tC,WAA5C;AACA,QAAIE,mBAAmB,KAAK/C,YAAL,CAAmB9qC,CAAnB,EAAuBsqC,aAA9C;;AAEA,QAAIwD,UAAJ,EAAgBxD,aAAhB;;AAEA,SAAMz3B,IAAI,CAAJ,EAAOk6B,KAAK,KAAKpC,KAAL,CAAWhsC,MAA7B,EAAqCkU,IAAIk6B,EAAzC,EAA6Cl6B,GAA7C,EAAoD;;AAEnDi7B,kBAAa,IAAIz7B,OAAJ,EAAb;AACAi4B,qBAAgB,EAAEn9B,GAAG,IAAIkF,OAAJ,EAAL,EAAoBjF,GAAG,IAAIiF,OAAJ,EAAvB,EAAsClC,GAAG,IAAIkC,OAAJ,EAAzC,EAAhB;;AAEAu7B,oBAAeruC,IAAf,CAAqBuuC,UAArB;AACAD,sBAAiBtuC,IAAjB,CAAuB+qC,aAAvB;AAEA;AAED;;AAED,OAAIQ,eAAe,KAAKA,YAAL,CAAmB9qC,CAAnB,CAAnB;;AAEA;;AAEA0tC,UAAOlkB,QAAP,GAAkB,KAAKqhB,YAAL,CAAmB7qC,CAAnB,EAAuBwpB,QAAzC;;AAEA;;AAEAkkB,UAAOd,kBAAP;AACAc,UAAOP,oBAAP;;AAEA;;AAEA,OAAIW,UAAJ,EAAgBxD,aAAhB;;AAEA,QAAMz3B,IAAI,CAAJ,EAAOk6B,KAAK,KAAKpC,KAAL,CAAWhsC,MAA7B,EAAqCkU,IAAIk6B,EAAzC,EAA6Cl6B,GAA7C,EAAoD;;AAEnD84B,WAAO,KAAKhB,KAAL,CAAY93B,CAAZ,CAAP;;AAEAi7B,iBAAahD,aAAa6C,WAAb,CAA0B96B,CAA1B,CAAb;AACAy3B,oBAAgBQ,aAAaR,aAAb,CAA4Bz3B,CAA5B,CAAhB;;AAEAi7B,eAAWphC,IAAX,CAAiBi/B,KAAK1qB,MAAtB;;AAEAqpB,kBAAcn9B,CAAd,CAAgBT,IAAhB,CAAsBi/B,KAAKrB,aAAL,CAAoB,CAApB,CAAtB;AACAA,kBAAcl9B,CAAd,CAAgBV,IAAhB,CAAsBi/B,KAAKrB,aAAL,CAAoB,CAApB,CAAtB;AACAA,kBAAcn6B,CAAd,CAAgBzD,IAAhB,CAAsBi/B,KAAKrB,aAAL,CAAoB,CAApB,CAAtB;AAEA;AAED;;AAED;;AAEA,OAAMz3B,IAAI,CAAJ,EAAOk6B,KAAK,KAAKpC,KAAL,CAAWhsC,MAA7B,EAAqCkU,IAAIk6B,EAAzC,EAA6Cl6B,GAA7C,EAAoD;;AAEnD84B,UAAO,KAAKhB,KAAL,CAAY93B,CAAZ,CAAP;;AAEA84B,QAAK1qB,MAAL,GAAc0qB,KAAK6B,oBAAnB;AACA7B,QAAKrB,aAAL,GAAqBqB,KAAK8B,uBAA1B;AAEA;AAED,EA1lB8E;;AA4lB/E5B,qBAAoB,YAAY;;AAE/B,MAAK,KAAKX,WAAL,KAAqB,IAA1B,EAAiC;;AAEhC,QAAKA,WAAL,GAAmB,IAAI5jB,IAAJ,EAAnB;AAEA;;AAED,OAAK4jB,WAAL,CAAiBjjB,aAAjB,CAAgC,KAAKuB,QAArC;AAEA,EAtmB8E;;AAwmB/E2G,wBAAuB,YAAY;;AAElC,MAAK,KAAKD,cAAL,KAAwB,IAA7B,EAAoC;;AAEnC,QAAKA,cAAL,GAAsB,IAAIzE,MAAJ,EAAtB;AAEA;;AAED,OAAKyE,cAAL,CAAoBjI,aAApB,CAAmC,KAAKuB,QAAxC;AAEA,EAlnB8E;;AAonB/EmO,QAAO,UAAWrO,QAAX,EAAqBvP,MAArB,EAA6Bg0B,mBAA7B,EAAmD;;AAEzD,MAAK,EAAIzkB,YAAYA,SAASC,UAAzB,CAAL,EAA6C;;AAE5Czc,WAAQyD,KAAR,CAAe,qEAAf,EAAsF+Y,QAAtF;AACA;AAEA;;AAED,MAAIkF,YAAJ;AAAA,MACCwf,eAAe,KAAKxkB,QAAL,CAAc7qB,MAD9B;AAAA,MAECsvC,YAAY,KAAKzkB,QAFlB;AAAA,MAGC0kB,YAAY5kB,SAASE,QAHtB;AAAA,MAIC2kB,SAAS,KAAKxD,KAJf;AAAA,MAKCyD,SAAS9kB,SAASqhB,KALnB;AAAA,MAMC0D,OAAO,KAAKzD,aAAL,CAAoB,CAApB,CANR;AAAA,MAOCwB,OAAO9iB,SAASshB,aAAT,CAAwB,CAAxB,CAPR;AAAA,MAQC0D,UAAU,KAAK5D,MARhB;AAAA,MASC6D,UAAUjlB,SAASohB,MATpB;;AAWA,MAAKqD,wBAAwB1wC,SAA7B,EAAyC0wC,sBAAsB,CAAtB;;AAEzC,MAAKh0B,WAAW1c,SAAhB,EAA4B;;AAE3BmxB,kBAAe,IAAI5M,OAAJ,GAAcI,eAAd,CAA+BjI,MAA/B,CAAf;AAEA;;AAED;;AAEA,OAAM,IAAI/Z,IAAI,CAAR,EAAWooB,KAAK8lB,UAAUvvC,MAAhC,EAAwCqB,IAAIooB,EAA5C,EAAgDpoB,GAAhD,EAAuD;;AAEtD,OAAI0rC,SAASwC,UAAWluC,CAAX,CAAb;;AAEA,OAAIwuC,aAAa9C,OAAOl/B,KAAP,EAAjB;;AAEA,OAAKuN,WAAW1c,SAAhB,EAA4BmxC,WAAW/3B,YAAX,CAAyBsD,MAAzB;;AAE5Bk0B,aAAU1uC,IAAV,CAAgBivC,UAAhB;AAEA;;AAED;;AAEA,OAAM,IAAIxuC,IAAI,CAAR,EAAWooB,KAAKmmB,QAAQ5vC,MAA9B,EAAsCqB,IAAIooB,EAA1C,EAA8CpoB,GAA9C,EAAqD;;AAEpDsuC,WAAQ/uC,IAAR,CAAcgvC,QAASvuC,CAAT,EAAawM,KAAb,EAAd;AAEA;;AAED;;AAEA,OAAMxM,IAAI,CAAJ,EAAOooB,KAAKgmB,OAAOzvC,MAAzB,EAAiCqB,IAAIooB,EAArC,EAAyCpoB,GAAzC,EAAgD;;AAE/C,OAAI2rC,OAAOyC,OAAQpuC,CAAR,CAAX;AAAA,OAAwByuC,QAAxB;AAAA,OAAkCxtB,MAAlC;AAAA,OAA0CiY,KAA1C;AAAA,OACCwV,oBAAoB/C,KAAKrB,aAD1B;AAAA,OAECqE,mBAAmBhD,KAAKpB,YAFzB;;AAIAkE,cAAW,IAAIrE,KAAJ,CAAWuB,KAAKx+B,CAAL,GAAS6gC,YAApB,EAAkCrC,KAAKv+B,CAAL,GAAS4gC,YAA3C,EAAyDrC,KAAKx7B,CAAL,GAAS69B,YAAlE,CAAX;AACAS,YAASxtB,MAAT,CAAgBvU,IAAhB,CAAsBi/B,KAAK1qB,MAA3B;;AAEA,OAAKuN,iBAAiBnxB,SAAtB,EAAkC;;AAEjCoxC,aAASxtB,MAAT,CAAgBpT,YAAhB,CAA8B2gB,YAA9B,EAA6C5f,SAA7C;AAEA;;AAED,QAAM,IAAIqc,IAAI,CAAR,EAAW2gB,KAAK8C,kBAAkB/vC,MAAxC,EAAgDssB,IAAI2gB,EAApD,EAAwD3gB,GAAxD,EAA+D;;AAE9DhK,aAASytB,kBAAmBzjB,CAAnB,EAAuBze,KAAvB,EAAT;;AAEA,QAAKgiB,iBAAiBnxB,SAAtB,EAAkC;;AAEjC4jB,YAAOpT,YAAP,CAAqB2gB,YAArB,EAAoC5f,SAApC;AAEA;;AAED6/B,aAASnE,aAAT,CAAuB/qC,IAAvB,CAA6B0hB,MAA7B;AAEA;;AAEDwtB,YAASvV,KAAT,CAAexsB,IAAf,CAAqBi/B,KAAKzS,KAA1B;;AAEA,QAAM,IAAIjO,IAAI,CAAR,EAAW2gB,KAAK+C,iBAAiBhwC,MAAvC,EAA+CssB,IAAI2gB,EAAnD,EAAuD3gB,GAAvD,EAA8D;;AAE7DiO,YAAQyV,iBAAkB1jB,CAAlB,CAAR;AACAwjB,aAASlE,YAAT,CAAsBhrC,IAAtB,CAA4B25B,MAAM1sB,KAAN,EAA5B;AAEA;;AAEDiiC,YAASpE,aAAT,GAAyBsB,KAAKtB,aAAL,GAAqB0D,mBAA9C;;AAEAI,UAAO5uC,IAAP,CAAakvC,QAAb;AAEA;;AAED;;AAEA,OAAMzuC,IAAI,CAAJ,EAAOooB,KAAKgkB,KAAKztC,MAAvB,EAA+BqB,IAAIooB,EAAnC,EAAuCpoB,GAAvC,EAA8C;;AAE7C,OAAI2lB,KAAKymB,KAAMpsC,CAAN,CAAT;AAAA,OAAoB4uC,SAAS,EAA7B;;AAEA,OAAKjpB,OAAOtoB,SAAZ,EAAwB;;AAEvB;AAEA;;AAED,QAAM,IAAI4tB,IAAI,CAAR,EAAW2gB,KAAKjmB,GAAGhnB,MAAzB,EAAiCssB,IAAI2gB,EAArC,EAAyC3gB,GAAzC,EAAgD;;AAE/C2jB,WAAOrvC,IAAP,CAAaomB,GAAIsF,CAAJ,EAAQze,KAAR,EAAb;AAEA;;AAED6hC,QAAK9uC,IAAL,CAAWqvC,MAAX;AAEA;AAED,EA1uB8E;;AA4uB/EC,YAAW,UAAWC,IAAX,EAAkB;;AAE5B,MAAK,EAAIA,QAAQA,KAAKC,MAAjB,CAAL,EAAiC;;AAEhCjiC,WAAQyD,KAAR,CAAe,iEAAf,EAAkFu+B,IAAlF;AACA;AAEA;;AAED,MAAKA,KAAKrrB,gBAAV,EAA6BqrB,KAAK5qB,YAAL;;AAE7B,OAAKyT,KAAL,CAAYmX,KAAKxlB,QAAjB,EAA2BwlB,KAAK/0B,MAAhC;AAEA,EAzvB8E;;AA2vB/E;;;;;;AAMAi1B,gBAAe,YAAY;;AAE1B,MAAIC,cAAc,EAAlB,CAF0B,CAEJ;AACtB,MAAIC,SAAS,EAAb;AAAA,MAAiBC,UAAU,EAA3B;;AAEA,MAAIxiC,CAAJ,EAAOo8B,GAAP;AACA,MAAIqG,kBAAkB,CAAtB,CAN0B,CAMD;AACzB,MAAIC,YAAY/xC,KAAKC,GAAL,CAAU,EAAV,EAAc6xC,eAAd,CAAhB;AACA,MAAIpvC,CAAJ,EAAOooB,EAAP,EAAWujB,IAAX;AACA,MAAIK,OAAJ,EAAa/gB,CAAb,EAAgB2gB,EAAhB;;AAEA,OAAM5rC,IAAI,CAAJ,EAAOooB,KAAK,KAAKoB,QAAL,CAAc7qB,MAAhC,EAAwCqB,IAAIooB,EAA5C,EAAgDpoB,GAAhD,EAAuD;;AAEtD2M,OAAI,KAAK6c,QAAL,CAAexpB,CAAf,CAAJ;AACA+oC,SAAMzrC,KAAK8Q,KAAL,CAAYzB,EAAE9O,CAAF,GAAMwxC,SAAlB,IAAgC,GAAhC,GAAsC/xC,KAAK8Q,KAAL,CAAYzB,EAAElC,CAAF,GAAM4kC,SAAlB,CAAtC,GAAsE,GAAtE,GAA4E/xC,KAAK8Q,KAAL,CAAYzB,EAAEwF,CAAF,GAAMk9B,SAAlB,CAAlF;;AAEA,OAAKJ,YAAalG,GAAb,MAAuB1rC,SAA5B,EAAwC;;AAEvC4xC,gBAAalG,GAAb,IAAqB/oC,CAArB;AACAkvC,WAAO3vC,IAAP,CAAa,KAAKiqB,QAAL,CAAexpB,CAAf,CAAb;AACAmvC,YAASnvC,CAAT,IAAekvC,OAAOvwC,MAAP,GAAgB,CAA/B;AAEA,IAND,MAMO;;AAEN;AACAwwC,YAASnvC,CAAT,IAAemvC,QAASF,YAAalG,GAAb,CAAT,CAAf;AAEA;AAED;;AAGD;AACA;AACA,MAAIuG,sBAAsB,EAA1B;;AAEA,OAAMtvC,IAAI,CAAJ,EAAOooB,KAAK,KAAKuiB,KAAL,CAAWhsC,MAA7B,EAAqCqB,IAAIooB,EAAzC,EAA6CpoB,GAA7C,EAAoD;;AAEnD2rC,UAAO,KAAKhB,KAAL,CAAY3qC,CAAZ,CAAP;;AAEA2rC,QAAKx+B,CAAL,GAASgiC,QAASxD,KAAKx+B,CAAd,CAAT;AACAw+B,QAAKv+B,CAAL,GAAS+hC,QAASxD,KAAKv+B,CAAd,CAAT;AACAu+B,QAAKx7B,CAAL,GAASg/B,QAASxD,KAAKx7B,CAAd,CAAT;;AAEA67B,aAAU,CAAEL,KAAKx+B,CAAP,EAAUw+B,KAAKv+B,CAAf,EAAkBu+B,KAAKx7B,CAAvB,CAAV;;AAEA;AACA;AACA,QAAM,IAAIlG,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B,QAAK+hC,QAAS/hC,CAAT,MAAiB+hC,QAAS,CAAE/hC,IAAI,CAAN,IAAY,CAArB,CAAtB,EAAiD;;AAEhDqlC,yBAAoB/vC,IAApB,CAA0BS,CAA1B;AACA;AAEA;AAED;AAED;;AAED,OAAMA,IAAIsvC,oBAAoB3wC,MAApB,GAA6B,CAAvC,EAA0CqB,KAAK,CAA/C,EAAkDA,GAAlD,EAAyD;;AAExD,OAAIuvC,MAAMD,oBAAqBtvC,CAArB,CAAV;;AAEA,QAAK2qC,KAAL,CAAWhrC,MAAX,CAAmB4vC,GAAnB,EAAwB,CAAxB;;AAEA,QAAMtkB,IAAI,CAAJ,EAAO2gB,KAAK,KAAKhB,aAAL,CAAmBjsC,MAArC,EAA6CssB,IAAI2gB,EAAjD,EAAqD3gB,GAArD,EAA4D;;AAE3D,SAAK2f,aAAL,CAAoB3f,CAApB,EAAwBtrB,MAAxB,CAAgC4vC,GAAhC,EAAqC,CAArC;AAEA;AAED;;AAED;;AAEA,MAAIC,OAAO,KAAKhmB,QAAL,CAAc7qB,MAAd,GAAuBuwC,OAAOvwC,MAAzC;AACA,OAAK6qB,QAAL,GAAgB0lB,MAAhB;AACA,SAAOM,IAAP;AAEA,EAl1B8E;;AAo1B/EvnB,gBAAe,UAAWC,MAAX,EAAoB;;AAElC,OAAKsB,QAAL,GAAgB,EAAhB;;AAEA,OAAM,IAAIxpB,IAAI,CAAR,EAAWC,IAAIioB,OAAOvpB,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAIgpB,QAAQd,OAAQloB,CAAR,CAAZ;AACA,QAAKwpB,QAAL,CAAcjqB,IAAd,CAAoB,IAAI8S,OAAJ,CAAa2W,MAAMnrB,CAAnB,EAAsBmrB,MAAMve,CAA5B,EAA+Bue,MAAM7W,CAAN,IAAW,CAA1C,CAApB;AAEA;;AAED,SAAO,IAAP;AAEA,EAj2B8E;;AAm2B/Es9B,2BAA0B,YAAY;;AAErC,MAAI9E,QAAQ,KAAKA,KAAjB;AACA,MAAIhsC,SAASgsC,MAAMhsC,MAAnB;;AAEA;;AAEA,OAAM,IAAIqB,IAAI,CAAd,EAAiBA,IAAIrB,MAArB,EAA6BqB,GAA7B,EAAoC;;AAEnC2qC,SAAO3qC,CAAP,EAAW0vC,GAAX,GAAiB1vC,CAAjB;AAEA;;AAED;;AAEA,WAAS2vC,iBAAT,CAA4BxiC,CAA5B,EAA+BC,CAA/B,EAAmC;;AAElC,UAAOD,EAAEk9B,aAAF,GAAkBj9B,EAAEi9B,aAA3B;AAEA;;AAEDM,QAAMiF,IAAN,CAAYD,iBAAZ;;AAEA;;AAEA,MAAItB,OAAO,KAAKzD,aAAL,CAAoB,CAApB,CAAX;AACA,MAAIwB,OAAO,KAAKxB,aAAL,CAAoB,CAApB,CAAX;;AAEA,MAAIiF,OAAJ,EAAaC,OAAb;;AAEA,MAAKzB,QAAQA,KAAK1vC,MAAL,KAAgBA,MAA7B,EAAsCkxC,UAAU,EAAV;AACtC,MAAKzD,QAAQA,KAAKztC,MAAL,KAAgBA,MAA7B,EAAsCmxC,UAAU,EAAV;;AAEtC,OAAM,IAAI9vC,IAAI,CAAd,EAAiBA,IAAIrB,MAArB,EAA6BqB,GAA7B,EAAoC;;AAEnC,OAAIonC,KAAKuD,MAAO3qC,CAAP,EAAW0vC,GAApB;;AAEA,OAAKG,OAAL,EAAeA,QAAQtwC,IAAR,CAAc8uC,KAAMjH,EAAN,CAAd;AACf,OAAK0I,OAAL,EAAeA,QAAQvwC,IAAR,CAAc6sC,KAAMhF,EAAN,CAAd;AAEf;;AAED,MAAKyI,OAAL,EAAe,KAAKjF,aAAL,CAAoB,CAApB,IAA0BiF,OAA1B;AACf,MAAKC,OAAL,EAAe,KAAKlF,aAAL,CAAoB,CAApB,IAA0BkF,OAA1B;AAEf,EAh5B8E;;AAk5B/E3rB,SAAQ,YAAY;;AAEnB,MAAIiD,OAAO;AACVhC,aAAU;AACTtB,aAAS,GADA;AAET5kB,UAAM,UAFG;AAGTmmB,eAAW;AAHF;AADA,GAAX;;AAQA;;AAEA+B,OAAKzd,IAAL,GAAY,KAAKA,IAAjB;AACAyd,OAAKloB,IAAL,GAAY,KAAKA,IAAjB;AACA,MAAK,KAAKkkB,IAAL,KAAc,EAAnB,EAAwBgE,KAAKhE,IAAL,GAAY,KAAKA,IAAjB;;AAExB,MAAK,KAAKolB,UAAL,KAAoBnrC,SAAzB,EAAqC;;AAEpC,OAAImrC,aAAa,KAAKA,UAAtB;;AAEA,QAAM,IAAIO,GAAV,IAAiBP,UAAjB,EAA8B;;AAE7B,QAAKA,WAAYO,GAAZ,MAAsB1rC,SAA3B,EAAuC+pB,KAAM2hB,GAAN,IAAcP,WAAYO,GAAZ,CAAd;AAEvC;;AAED,UAAO3hB,IAAP;AAEA;;AAED,MAAIoC,WAAW,EAAf;;AAEA,OAAM,IAAIxpB,IAAI,CAAd,EAAiBA,IAAI,KAAKwpB,QAAL,CAAc7qB,MAAnC,EAA2CqB,GAA3C,EAAkD;;AAEjD,OAAI0rC,SAAS,KAAKliB,QAAL,CAAexpB,CAAf,CAAb;AACAwpB,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;AAEA;;AAED,MAAIw4B,QAAQ,EAAZ;AACA,MAAIuB,UAAU,EAAd;AACA,MAAI6D,cAAc,EAAlB;AACA,MAAIrF,SAAS,EAAb;AACA,MAAIsF,aAAa,EAAjB;AACA,MAAI7D,MAAM,EAAV;AACA,MAAI8D,UAAU,EAAd;;AAEA,OAAM,IAAIjwC,IAAI,CAAd,EAAiBA,IAAI,KAAK2qC,KAAL,CAAWhsC,MAAhC,EAAwCqB,GAAxC,EAA+C;;AAE9C,OAAI2rC,OAAO,KAAKhB,KAAL,CAAY3qC,CAAZ,CAAX;;AAEA,OAAIkwC,cAAc,IAAlB;AACA,OAAIC,YAAY,KAAhB,CAL8C,CAKvB;AACvB,OAAIC,kBAAkB,KAAKxF,aAAL,CAAoB,CAApB,EAAyB5qC,CAAzB,MAAiC3C,SAAvD;AACA,OAAIgzC,gBAAgB1E,KAAK1qB,MAAL,CAAYtiB,MAAZ,KAAuB,CAA3C;AACA,OAAI2xC,sBAAsB3E,KAAKrB,aAAL,CAAmB3rC,MAAnB,GAA4B,CAAtD;AACA,OAAI4xC,eAAe5E,KAAKzS,KAAL,CAAWtb,CAAX,KAAiB,CAAjB,IAAsB+tB,KAAKzS,KAAL,CAAWnX,CAAX,KAAiB,CAAvC,IAA4C4pB,KAAKzS,KAAL,CAAW9rB,CAAX,KAAiB,CAAhF;AACA,OAAIojC,qBAAqB7E,KAAKpB,YAAL,CAAkB5rC,MAAlB,GAA2B,CAApD;;AAEA,OAAI8xC,WAAW,CAAf;;AAEAA,cAAWC,OAAQD,QAAR,EAAkB,CAAlB,EAAqB,CAArB,CAAX,CAd8C,CAcT;AACrCA,cAAWC,OAAQD,QAAR,EAAkB,CAAlB,EAAqBP,WAArB,CAAX;AACAO,cAAWC,OAAQD,QAAR,EAAkB,CAAlB,EAAqBN,SAArB,CAAX;AACAM,cAAWC,OAAQD,QAAR,EAAkB,CAAlB,EAAqBL,eAArB,CAAX;AACAK,cAAWC,OAAQD,QAAR,EAAkB,CAAlB,EAAqBJ,aAArB,CAAX;AACAI,cAAWC,OAAQD,QAAR,EAAkB,CAAlB,EAAqBH,mBAArB,CAAX;AACAG,cAAWC,OAAQD,QAAR,EAAkB,CAAlB,EAAqBF,YAArB,CAAX;AACAE,cAAWC,OAAQD,QAAR,EAAkB,CAAlB,EAAqBD,kBAArB,CAAX;;AAEA7F,SAAMprC,IAAN,CAAYkxC,QAAZ;AACA9F,SAAMprC,IAAN,CAAYosC,KAAKx+B,CAAjB,EAAoBw+B,KAAKv+B,CAAzB,EAA4Bu+B,KAAKx7B,CAAjC;AACAw6B,SAAMprC,IAAN,CAAYosC,KAAKtB,aAAjB;;AAEA,OAAK+F,eAAL,EAAuB;;AAEtB,QAAIxF,gBAAgB,KAAKA,aAAL,CAAoB,CAApB,EAAyB5qC,CAAzB,CAApB;;AAEA2qC,UAAMprC,IAAN,CACCoxC,WAAY/F,cAAe,CAAf,CAAZ,CADD,EAEC+F,WAAY/F,cAAe,CAAf,CAAZ,CAFD,EAGC+F,WAAY/F,cAAe,CAAf,CAAZ,CAHD;AAMA;;AAED,OAAKyF,aAAL,EAAqB;;AAEpB1F,UAAMprC,IAAN,CAAYqxC,eAAgBjF,KAAK1qB,MAArB,CAAZ;AAEA;;AAED,OAAKqvB,mBAAL,EAA2B;;AAE1B,QAAIhG,gBAAgBqB,KAAKrB,aAAzB;;AAEAK,UAAMprC,IAAN,CACCqxC,eAAgBtG,cAAe,CAAf,CAAhB,CADD,EAECsG,eAAgBtG,cAAe,CAAf,CAAhB,CAFD,EAGCsG,eAAgBtG,cAAe,CAAf,CAAhB,CAHD;AAMA;;AAED,OAAKiG,YAAL,EAAoB;;AAEnB5F,UAAMprC,IAAN,CAAYsxC,cAAelF,KAAKzS,KAApB,CAAZ;AAEA;;AAED,OAAKsX,kBAAL,EAA0B;;AAEzB,QAAIjG,eAAeoB,KAAKpB,YAAxB;;AAEAI,UAAMprC,IAAN,CACCsxC,cAAetG,aAAc,CAAd,CAAf,CADD,EAECsG,cAAetG,aAAc,CAAd,CAAf,CAFD,EAGCsG,cAAetG,aAAc,CAAd,CAAf,CAHD;AAMA;AAED;;AAED,WAASmG,MAAT,CAAiBjzC,KAAjB,EAAwB+a,QAAxB,EAAkCoxB,OAAlC,EAA4C;;AAE3C,UAAOA,UAAUnsC,QAAU,KAAK+a,QAAzB,GAAsC/a,QAAU,EAAI,KAAK+a,QAAT,CAAvD;AAEA;;AAED,WAASo4B,cAAT,CAAyB3vB,MAAzB,EAAkC;;AAEjC,OAAI6vB,OAAO7vB,OAAOpjB,CAAP,CAASM,QAAT,KAAsB8iB,OAAOxW,CAAP,CAAStM,QAAT,EAAtB,GAA4C8iB,OAAO9O,CAAP,CAAShU,QAAT,EAAvD;;AAEA,OAAK4xC,YAAae,IAAb,MAAwBzzC,SAA7B,EAAyC;;AAExC,WAAO0yC,YAAae,IAAb,CAAP;AAEA;;AAEDf,eAAae,IAAb,IAAsB5E,QAAQvtC,MAAR,GAAiB,CAAvC;AACAutC,WAAQ3sC,IAAR,CAAc0hB,OAAOpjB,CAArB,EAAwBojB,OAAOxW,CAA/B,EAAkCwW,OAAO9O,CAAzC;;AAEA,UAAO49B,YAAae,IAAb,CAAP;AAEA;;AAED,WAASD,aAAT,CAAwB3X,KAAxB,EAAgC;;AAE/B,OAAI4X,OAAO5X,MAAMtb,CAAN,CAAQzf,QAAR,KAAqB+6B,MAAMnX,CAAN,CAAQ5jB,QAAR,EAArB,GAA0C+6B,MAAM9rB,CAAN,CAAQjP,QAAR,EAArD;;AAEA,OAAK6xC,WAAYc,IAAZ,MAAuBzzC,SAA5B,EAAwC;;AAEvC,WAAO2yC,WAAYc,IAAZ,CAAP;AAEA;;AAEDd,cAAYc,IAAZ,IAAqBpG,OAAO/rC,MAA5B;AACA+rC,UAAOnrC,IAAP,CAAa25B,MAAMU,MAAN,EAAb;;AAEA,UAAOoW,WAAYc,IAAZ,CAAP;AAEA;;AAED,WAASH,UAAT,CAAqBhrB,EAArB,EAA0B;;AAEzB,OAAImrB,OAAOnrB,GAAG9nB,CAAH,CAAKM,QAAL,KAAkBwnB,GAAGlb,CAAH,CAAKtM,QAAL,EAA7B;;AAEA,OAAK8xC,QAASa,IAAT,MAAoBzzC,SAAzB,EAAqC;;AAEpC,WAAO4yC,QAASa,IAAT,CAAP;AAEA;;AAEDb,WAASa,IAAT,IAAkB3E,IAAIxtC,MAAJ,GAAa,CAA/B;AACAwtC,OAAI5sC,IAAJ,CAAUomB,GAAG9nB,CAAb,EAAgB8nB,GAAGlb,CAAnB;;AAEA,UAAOwlC,QAASa,IAAT,CAAP;AAEA;;AAED1pB,OAAKA,IAAL,GAAY,EAAZ;;AAEAA,OAAKA,IAAL,CAAUoC,QAAV,GAAqBA,QAArB;AACApC,OAAKA,IAAL,CAAU8kB,OAAV,GAAoBA,OAApB;AACA,MAAKxB,OAAO/rC,MAAP,GAAgB,CAArB,EAAyByoB,KAAKA,IAAL,CAAUsjB,MAAV,GAAmBA,MAAnB;AACzB,MAAKyB,IAAIxtC,MAAJ,GAAa,CAAlB,EAAsByoB,KAAKA,IAAL,CAAU+kB,GAAV,GAAgB,CAAEA,GAAF,CAAhB,CA1LH,CA0L4B;AAC/C/kB,OAAKA,IAAL,CAAUujB,KAAV,GAAkBA,KAAlB;;AAEA,SAAOvjB,IAAP;AAEA,EAjlC8E;;AAmlC/E5a,QAAO,YAAY;;AAElB;;;;;;;;;;;;;;;AAwBA,SAAO,IAAIi+B,QAAJ,GAAe/9B,IAAf,CAAqB,IAArB,CAAP;AAEA,EA/mC8E;;AAinC/EA,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB,MAAIoB,CAAJ,EAAOooB,EAAP,EAAW6C,CAAX,EAAc2gB,EAAd,EAAkBmF,CAAlB,EAAqBC,EAArB;;AAEA;;AAEA,OAAKxnB,QAAL,GAAgB,EAAhB;AACA,OAAKkhB,MAAL,GAAc,EAAd;AACA,OAAKC,KAAL,GAAa,EAAb;AACA,OAAKC,aAAL,GAAqB,CAAC,EAAD,CAArB;AACA,OAAKC,YAAL,GAAoB,EAApB;AACA,OAAKC,YAAL,GAAoB,EAApB;AACA,OAAKC,WAAL,GAAmB,EAAnB;AACA,OAAKC,WAAL,GAAmB,EAAnB;AACA,OAAKC,aAAL,GAAqB,EAArB;AACA,OAAKC,WAAL,GAAmB,IAAnB;AACA,OAAKhb,cAAL,GAAsB,IAAtB;;AAEA;;AAEA,OAAK9M,IAAL,GAAYxkB,OAAOwkB,IAAnB;;AAEA;;AAEA,MAAIoG,WAAW5qB,OAAO4qB,QAAtB;;AAEA,OAAMxpB,IAAI,CAAJ,EAAOooB,KAAKoB,SAAS7qB,MAA3B,EAAmCqB,IAAIooB,EAAvC,EAA2CpoB,GAA3C,EAAkD;;AAEjD,QAAKwpB,QAAL,CAAcjqB,IAAd,CAAoBiqB,SAAUxpB,CAAV,EAAcwM,KAAd,EAApB;AAEA;;AAED;;AAEA,MAAIk+B,SAAS9rC,OAAO8rC,MAApB;;AAEA,OAAM1qC,IAAI,CAAJ,EAAOooB,KAAKsiB,OAAO/rC,MAAzB,EAAiCqB,IAAIooB,EAArC,EAAyCpoB,GAAzC,EAAgD;;AAE/C,QAAK0qC,MAAL,CAAYnrC,IAAZ,CAAkBmrC,OAAQ1qC,CAAR,EAAYwM,KAAZ,EAAlB;AAEA;;AAED;;AAEA,MAAIm+B,QAAQ/rC,OAAO+rC,KAAnB;;AAEA,OAAM3qC,IAAI,CAAJ,EAAOooB,KAAKuiB,MAAMhsC,MAAxB,EAAgCqB,IAAIooB,EAApC,EAAwCpoB,GAAxC,EAA+C;;AAE9C,QAAK2qC,KAAL,CAAWprC,IAAX,CAAiBorC,MAAO3qC,CAAP,EAAWwM,KAAX,EAAjB;AAEA;;AAED;;AAEA,OAAMxM,IAAI,CAAJ,EAAOooB,KAAKxpB,OAAOgsC,aAAP,CAAqBjsC,MAAvC,EAA+CqB,IAAIooB,EAAnD,EAAuDpoB,GAAvD,EAA8D;;AAE7D,OAAI4qC,gBAAgBhsC,OAAOgsC,aAAP,CAAsB5qC,CAAtB,CAApB;;AAEA,OAAK,KAAK4qC,aAAL,CAAoB5qC,CAApB,MAA4B3C,SAAjC,EAA6C;;AAE5C,SAAKutC,aAAL,CAAoB5qC,CAApB,IAA0B,EAA1B;AAEA;;AAED,QAAMirB,IAAI,CAAJ,EAAO2gB,KAAKhB,cAAcjsC,MAAhC,EAAwCssB,IAAI2gB,EAA5C,EAAgD3gB,GAAhD,EAAuD;;AAEtD,QAAIkhB,MAAMvB,cAAe3f,CAAf,CAAV;AAAA,QAA8BgmB,UAAU,EAAxC;;AAEA,SAAMF,IAAI,CAAJ,EAAOC,KAAK7E,IAAIxtC,MAAtB,EAA8BoyC,IAAIC,EAAlC,EAAsCD,GAAtC,EAA6C;;AAE5C,SAAIprB,KAAKwmB,IAAK4E,CAAL,CAAT;;AAEAE,aAAQ1xC,IAAR,CAAcomB,GAAGnZ,KAAH,EAAd;AAEA;;AAED,SAAKo+B,aAAL,CAAoB5qC,CAApB,EAAwBT,IAAxB,CAA8B0xC,OAA9B;AAEA;AAED;;AAED;;AAEA,MAAIpG,eAAejsC,OAAOisC,YAA1B;;AAEA,OAAM7qC,IAAI,CAAJ,EAAOooB,KAAKyiB,aAAalsC,MAA/B,EAAuCqB,IAAIooB,EAA3C,EAA+CpoB,GAA/C,EAAsD;;AAErD,OAAIkxC,cAAc,EAAlB;AACAA,eAAY9tB,IAAZ,GAAmBynB,aAAc7qC,CAAd,EAAkBojB,IAArC;;AAEA;;AAEA,OAAKynB,aAAc7qC,CAAd,EAAkBwpB,QAAlB,KAA+BnsB,SAApC,EAAgD;;AAE/C6zC,gBAAY1nB,QAAZ,GAAuB,EAAvB;;AAEA,SAAMyB,IAAI,CAAJ,EAAO2gB,KAAKf,aAAc7qC,CAAd,EAAkBwpB,QAAlB,CAA2B7qB,MAA7C,EAAqDssB,IAAI2gB,EAAzD,EAA6D3gB,GAA7D,EAAoE;;AAEnEimB,iBAAY1nB,QAAZ,CAAqBjqB,IAArB,CAA2BsrC,aAAc7qC,CAAd,EAAkBwpB,QAAlB,CAA4ByB,CAA5B,EAAgCze,KAAhC,EAA3B;AAEA;AAED;;AAED;;AAEA,OAAKq+B,aAAc7qC,CAAd,EAAkBksC,OAAlB,KAA8B7uC,SAAnC,EAA+C;;AAE9C6zC,gBAAYhF,OAAZ,GAAsB,EAAtB;;AAEA,SAAMjhB,IAAI,CAAJ,EAAO2gB,KAAKf,aAAc7qC,CAAd,EAAkBksC,OAAlB,CAA0BvtC,MAA5C,EAAoDssB,IAAI2gB,EAAxD,EAA4D3gB,GAA5D,EAAmE;;AAElEimB,iBAAYhF,OAAZ,CAAoB3sC,IAApB,CAA0BsrC,aAAc7qC,CAAd,EAAkBksC,OAAlB,CAA2BjhB,CAA3B,EAA+Bze,KAA/B,EAA1B;AAEA;AAED;;AAED,QAAKq+B,YAAL,CAAkBtrC,IAAlB,CAAwB2xC,WAAxB;AAEA;;AAED;;AAEA,MAAIpG,eAAelsC,OAAOksC,YAA1B;;AAEA,OAAM9qC,IAAI,CAAJ,EAAOooB,KAAK0iB,aAAansC,MAA/B,EAAuCqB,IAAIooB,EAA3C,EAA+CpoB,GAA/C,EAAsD;;AAErD,OAAImxC,cAAc,EAAlB;;AAEA;;AAEA,OAAKrG,aAAc9qC,CAAd,EAAkBsqC,aAAlB,KAAoCjtC,SAAzC,EAAqD;;AAEpD8zC,gBAAY7G,aAAZ,GAA4B,EAA5B;;AAEA,SAAMrf,IAAI,CAAJ,EAAO2gB,KAAKd,aAAc9qC,CAAd,EAAkBsqC,aAAlB,CAAgC3rC,MAAlD,EAA0DssB,IAAI2gB,EAA9D,EAAkE3gB,GAAlE,EAAyE;;AAExE,SAAImmB,kBAAkBtG,aAAc9qC,CAAd,EAAkBsqC,aAAlB,CAAiCrf,CAAjC,CAAtB;AACA,SAAIomB,mBAAmB,EAAvB;;AAEAA,sBAAiBlkC,CAAjB,GAAqBikC,gBAAgBjkC,CAAhB,CAAkBX,KAAlB,EAArB;AACA6kC,sBAAiBjkC,CAAjB,GAAqBgkC,gBAAgBhkC,CAAhB,CAAkBZ,KAAlB,EAArB;AACA6kC,sBAAiBlhC,CAAjB,GAAqBihC,gBAAgBjhC,CAAhB,CAAkB3D,KAAlB,EAArB;;AAEA2kC,iBAAY7G,aAAZ,CAA0B/qC,IAA1B,CAAgC8xC,gBAAhC;AAEA;AAED;;AAED;;AAEA,OAAKvG,aAAc9qC,CAAd,EAAkB2tC,WAAlB,KAAkCtwC,SAAvC,EAAmD;;AAElD8zC,gBAAYxD,WAAZ,GAA0B,EAA1B;;AAEA,SAAM1iB,IAAI,CAAJ,EAAO2gB,KAAKd,aAAc9qC,CAAd,EAAkB2tC,WAAlB,CAA8BhvC,MAAhD,EAAwDssB,IAAI2gB,EAA5D,EAAgE3gB,GAAhE,EAAuE;;AAEtEkmB,iBAAYxD,WAAZ,CAAwBpuC,IAAxB,CAA8BurC,aAAc9qC,CAAd,EAAkB2tC,WAAlB,CAA+B1iB,CAA/B,EAAmCze,KAAnC,EAA9B;AAEA;AAED;;AAED,QAAKs+B,YAAL,CAAkBvrC,IAAlB,CAAwB4xC,WAAxB;AAEA;;AAED;;AAEA,MAAIpG,cAAcnsC,OAAOmsC,WAAzB;;AAEA,OAAM/qC,IAAI,CAAJ,EAAOooB,KAAK2iB,YAAYpsC,MAA9B,EAAsCqB,IAAIooB,EAA1C,EAA8CpoB,GAA9C,EAAqD;;AAEpD,QAAK+qC,WAAL,CAAiBxrC,IAAjB,CAAuBwrC,YAAa/qC,CAAb,EAAiBwM,KAAjB,EAAvB;AAEA;;AAED;;AAEA,MAAIw+B,cAAcpsC,OAAOosC,WAAzB;;AAEA,OAAMhrC,IAAI,CAAJ,EAAOooB,KAAK4iB,YAAYrsC,MAA9B,EAAsCqB,IAAIooB,EAA1C,EAA8CpoB,GAA9C,EAAqD;;AAEpD,QAAKgrC,WAAL,CAAiBzrC,IAAjB,CAAuByrC,YAAahrC,CAAb,EAAiBwM,KAAjB,EAAvB;AAEA;;AAED;;AAEA,MAAIy+B,gBAAgBrsC,OAAOqsC,aAA3B;;AAEA,OAAMjrC,IAAI,CAAJ,EAAOooB,KAAK6iB,cAActsC,MAAhC,EAAwCqB,IAAIooB,EAA5C,EAAgDpoB,GAAhD,EAAuD;;AAEtD,QAAKirC,aAAL,CAAmB1rC,IAAnB,CAAyB0rC,cAAejrC,CAAf,CAAzB;AAEA;;AAED;;AAEA,MAAIkrC,cAActsC,OAAOssC,WAAzB;;AAEA,MAAKA,gBAAgB,IAArB,EAA4B;;AAE3B,QAAKA,WAAL,GAAmBA,YAAY1+B,KAAZ,EAAnB;AAEA;;AAED;;AAEA,MAAI0jB,iBAAiBtxB,OAAOsxB,cAA5B;;AAEA,MAAKA,mBAAmB,IAAxB,EAA+B;;AAE9B,QAAKA,cAAL,GAAsBA,eAAe1jB,KAAf,EAAtB;AAEA;;AAED;;AAEA,OAAK2+B,kBAAL,GAA0BvsC,OAAOusC,kBAAjC;AACA,OAAKC,kBAAL,GAA0BxsC,OAAOwsC,kBAAjC;AACA,OAAKC,aAAL,GAAqBzsC,OAAOysC,aAA5B;AACA,OAAKC,iBAAL,GAAyB1sC,OAAO0sC,iBAAhC;AACA,OAAKC,gBAAL,GAAwB3sC,OAAO2sC,gBAA/B;AACA,OAAKC,uBAAL,GAA+B5sC,OAAO4sC,uBAAtC;AACA,OAAKC,gBAAL,GAAwB7sC,OAAO6sC,gBAA/B;;AAEA,SAAO,IAAP;AAEA,EAz1C8E;;AA21C/EhmB,UAAS,YAAY;;AAEpB,OAAK7lB,aAAL,CAAoB,EAAEV,MAAM,SAAR,EAApB;AAEA;;AA/1C8E,CAA3D,CAArB;;AAm2CA;;;;AAIA,SAASoyC,eAAT,CAA0BxxC,KAA1B,EAAiCyxC,QAAjC,EAA2CC,UAA3C,EAAwD;;AAEvD,KAAKrZ,MAAMC,OAAN,CAAet4B,KAAf,CAAL,EAA8B;;AAE7B,QAAM,IAAIvB,SAAJ,CAAe,uDAAf,CAAN;AAEA;;AAED,MAAK6kB,IAAL,GAAY,EAAZ;;AAEA,MAAKtjB,KAAL,GAAaA,KAAb;AACA,MAAKyxC,QAAL,GAAgBA,QAAhB;AACA,MAAKh7B,KAAL,GAAazW,UAAUzC,SAAV,GAAsByC,MAAMnB,MAAN,GAAe4yC,QAArC,GAAgD,CAA7D;AACA,MAAKC,UAAL,GAAkBA,eAAe,IAAjC;;AAEA,MAAK9P,OAAL,GAAe,KAAf;AACA,MAAKyB,WAAL,GAAmB,EAAExzB,QAAQ,CAAV,EAAa4G,OAAO,CAAE,CAAtB,EAAnB;;AAEA,MAAKuN,OAAL,GAAe,CAAf;AAEA;;AAED9lB,OAAOC,cAAP,CAAuBqzC,gBAAgBvzC,SAAvC,EAAkD,aAAlD,EAAiE;;AAEhEgO,MAAK,UAAWtO,KAAX,EAAmB;;AAEvB,MAAKA,UAAU,IAAf,EAAsB,KAAKqmB,OAAL;AAEtB;;AAN+D,CAAjE;;AAUA9lB,OAAOK,MAAP,CAAeizC,gBAAgBvzC,SAA/B,EAA0C;;AAEzC0zC,oBAAmB,IAFsB;;AAIzCzP,mBAAkB,YAAY,CAAE,CAJS;;AAMzC0P,WAAU,UAAW5xC,KAAX,EAAmB;;AAE5B,MAAKq4B,MAAMC,OAAN,CAAet4B,KAAf,CAAL,EAA8B;;AAE7B,SAAM,IAAIvB,SAAJ,CAAe,uDAAf,CAAN;AAEA;;AAED,OAAKgY,KAAL,GAAazW,UAAUzC,SAAV,GAAsByC,MAAMnB,MAAN,GAAe,KAAK4yC,QAA1C,GAAqD,CAAlE;AACA,OAAKzxC,KAAL,GAAaA,KAAb;;AAEA,SAAO,IAAP;AAEA,EAnBwC;;AAqBzC6xC,aAAY,UAAWl0C,KAAX,EAAmB;;AAE9B,OAAKikC,OAAL,GAAejkC,KAAf;;AAEA,SAAO,IAAP;AAEA,EA3BwC;;AA6BzCiP,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB,OAAKwkB,IAAL,GAAYxkB,OAAOwkB,IAAnB;AACA,OAAKtjB,KAAL,GAAa,IAAIlB,OAAOkB,KAAP,CAAa2M,WAAjB,CAA8B7N,OAAOkB,KAArC,CAAb;AACA,OAAKyxC,QAAL,GAAgB3yC,OAAO2yC,QAAvB;AACA,OAAKh7B,KAAL,GAAa3X,OAAO2X,KAApB;AACA,OAAKi7B,UAAL,GAAkB5yC,OAAO4yC,UAAzB;;AAEA,OAAK9P,OAAL,GAAe9iC,OAAO8iC,OAAtB;;AAEA,SAAO,IAAP;AAEA,EAzCwC;;AA2CzCkQ,SAAQ,UAAWC,MAAX,EAAmB/hC,SAAnB,EAA8BgiC,MAA9B,EAAuC;;AAE9CD,YAAU,KAAKN,QAAf;AACAO,YAAUhiC,UAAUyhC,QAApB;;AAEA,OAAM,IAAIvxC,IAAI,CAAR,EAAWC,IAAI,KAAKsxC,QAA1B,EAAoCvxC,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,QAAKF,KAAL,CAAY+xC,SAAS7xC,CAArB,IAA2B8P,UAAUhQ,KAAV,CAAiBgyC,SAAS9xC,CAA1B,CAA3B;AAEA;;AAED,SAAO,IAAP;AAEA,EAxDwC;;AA0DzC+xC,YAAW,UAAWjyC,KAAX,EAAmB;;AAE7B,OAAKA,KAAL,CAAWiM,GAAX,CAAgBjM,KAAhB;;AAEA,SAAO,IAAP;AAEA,EAhEwC;;AAkEzCkyC,kBAAiB,UAAWtH,MAAX,EAAoB;;AAEpC,MAAI5qC,QAAQ,KAAKA,KAAjB;AAAA,MAAwB6P,SAAS,CAAjC;;AAEA,OAAM,IAAI3P,IAAI,CAAR,EAAWC,IAAIyqC,OAAO/rC,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAIk5B,QAAQwR,OAAQ1qC,CAAR,CAAZ;;AAEA,OAAKk5B,UAAU77B,SAAf,EAA2B;;AAE1ByP,YAAQC,IAAR,CAAc,6DAAd,EAA6E/M,CAA7E;AACAk5B,YAAQ,IAAIZ,KAAJ,EAAR;AAEA;;AAEDx4B,SAAO6P,QAAP,IAAqBupB,MAAMtb,CAA3B;AACA9d,SAAO6P,QAAP,IAAqBupB,MAAMnX,CAA3B;AACAjiB,SAAO6P,QAAP,IAAqBupB,MAAM9rB,CAA3B;AAEA;;AAED,SAAO,IAAP;AAEA,EAzFwC;;AA2FzC6kC,oBAAmB,UAAWC,OAAX,EAAqB;;AAEvC,MAAIpyC,QAAQ,KAAKA,KAAjB;AAAA,MAAwB6P,SAAS,CAAjC;;AAEA,OAAM,IAAI3P,IAAI,CAAR,EAAWC,IAAIiyC,QAAQvzC,MAA7B,EAAqCqB,IAAIC,CAAzC,EAA4CD,GAA5C,EAAmD;;AAElD,OAAI8Z,SAASo4B,QAASlyC,CAAT,CAAb;;AAEA,OAAK8Z,WAAWzc,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,gEAAd,EAAgF/M,CAAhF;AACA8Z,aAAS,IAAIjO,OAAJ,EAAT;AAEA;;AAED/L,SAAO6P,QAAP,IAAqBmK,OAAOjc,CAA5B;AACAiC,SAAO6P,QAAP,IAAqBmK,OAAOrP,CAA5B;AAEA;;AAED,SAAO,IAAP;AAEA,EAjHwC;;AAmHzC0nC,oBAAmB,UAAWD,OAAX,EAAqB;;AAEvC,MAAIpyC,QAAQ,KAAKA,KAAjB;AAAA,MAAwB6P,SAAS,CAAjC;;AAEA,OAAM,IAAI3P,IAAI,CAAR,EAAWC,IAAIiyC,QAAQvzC,MAA7B,EAAqCqB,IAAIC,CAAzC,EAA4CD,GAA5C,EAAmD;;AAElD,OAAI8Z,SAASo4B,QAASlyC,CAAT,CAAb;;AAEA,OAAK8Z,WAAWzc,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,gEAAd,EAAgF/M,CAAhF;AACA8Z,aAAS,IAAIzH,OAAJ,EAAT;AAEA;;AAEDvS,SAAO6P,QAAP,IAAqBmK,OAAOjc,CAA5B;AACAiC,SAAO6P,QAAP,IAAqBmK,OAAOrP,CAA5B;AACA3K,SAAO6P,QAAP,IAAqBmK,OAAO3H,CAA5B;AAEA;;AAED,SAAO,IAAP;AAEA,EA1IwC;;AA4IzCigC,oBAAmB,UAAWF,OAAX,EAAqB;;AAEvC,MAAIpyC,QAAQ,KAAKA,KAAjB;AAAA,MAAwB6P,SAAS,CAAjC;;AAEA,OAAM,IAAI3P,IAAI,CAAR,EAAWC,IAAIiyC,QAAQvzC,MAA7B,EAAqCqB,IAAIC,CAAzC,EAA4CD,GAA5C,EAAmD;;AAElD,OAAI8Z,SAASo4B,QAASlyC,CAAT,CAAb;;AAEA,OAAK8Z,WAAWzc,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,gEAAd,EAAgF/M,CAAhF;AACA8Z,aAAS,IAAI8L,OAAJ,EAAT;AAEA;;AAED9lB,SAAO6P,QAAP,IAAqBmK,OAAOjc,CAA5B;AACAiC,SAAO6P,QAAP,IAAqBmK,OAAOrP,CAA5B;AACA3K,SAAO6P,QAAP,IAAqBmK,OAAO3H,CAA5B;AACArS,SAAO6P,QAAP,IAAqBmK,OAAOjN,CAA5B;AAEA;;AAED,SAAO,IAAP;AAEA,EApKwC;;AAsKzCd,MAAK,UAAWtO,KAAX,EAAkBkS,MAAlB,EAA2B;;AAE/B,MAAKA,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,OAAK7P,KAAL,CAAWiM,GAAX,CAAgBtO,KAAhB,EAAuBkS,MAAvB;;AAEA,SAAO,IAAP;AAEA,EA9KwC;;AAgLzCI,OAAM,UAAWtR,KAAX,EAAmB;;AAExB,SAAO,KAAKqB,KAAL,CAAYrB,QAAQ,KAAK8yC,QAAzB,CAAP;AAEA,EApLwC;;AAsLzCplC,OAAM,UAAW1N,KAAX,EAAkBZ,CAAlB,EAAsB;;AAE3B,OAAKiC,KAAL,CAAYrB,QAAQ,KAAK8yC,QAAzB,IAAsC1zC,CAAtC;;AAEA,SAAO,IAAP;AAEA,EA5LwC;;AA8LzCmS,OAAM,UAAWvR,KAAX,EAAmB;;AAExB,SAAO,KAAKqB,KAAL,CAAYrB,QAAQ,KAAK8yC,QAAb,GAAwB,CAApC,CAAP;AAEA,EAlMwC;;AAoMzCnlC,OAAM,UAAW3N,KAAX,EAAkBgM,CAAlB,EAAsB;;AAE3B,OAAK3K,KAAL,CAAYrB,QAAQ,KAAK8yC,QAAb,GAAwB,CAApC,IAA0C9mC,CAA1C;;AAEA,SAAO,IAAP;AAEA,EA1MwC;;AA4MzC+L,OAAM,UAAW/X,KAAX,EAAmB;;AAExB,SAAO,KAAKqB,KAAL,CAAYrB,QAAQ,KAAK8yC,QAAb,GAAwB,CAApC,CAAP;AAEA,EAhNwC;;AAkNzCpyB,OAAM,UAAW1gB,KAAX,EAAkB0T,CAAlB,EAAsB;;AAE3B,OAAKrS,KAAL,CAAYrB,QAAQ,KAAK8yC,QAAb,GAAwB,CAApC,IAA0Cp/B,CAA1C;;AAEA,SAAO,IAAP;AAEA,EAxNwC;;AA0NzCgU,OAAM,UAAW1nB,KAAX,EAAmB;;AAExB,SAAO,KAAKqB,KAAL,CAAYrB,QAAQ,KAAK8yC,QAAb,GAAwB,CAApC,CAAP;AAEA,EA9NwC;;AAgOzCzrB,OAAM,UAAWrnB,KAAX,EAAkBoO,CAAlB,EAAsB;;AAE3B,OAAK/M,KAAL,CAAYrB,QAAQ,KAAK8yC,QAAb,GAAwB,CAApC,IAA0C1kC,CAA1C;;AAEA,SAAO,IAAP;AAEA,EAtOwC;;AAwOzCwlC,QAAO,UAAW5zC,KAAX,EAAkBZ,CAAlB,EAAqB4M,CAArB,EAAyB;;AAE/BhM,WAAS,KAAK8yC,QAAd;;AAEA,OAAKzxC,KAAL,CAAYrB,QAAQ,CAApB,IAA0BZ,CAA1B;AACA,OAAKiC,KAAL,CAAYrB,QAAQ,CAApB,IAA0BgM,CAA1B;;AAEA,SAAO,IAAP;AAEA,EAjPwC;;AAmPzCiM,SAAQ,UAAWjY,KAAX,EAAkBZ,CAAlB,EAAqB4M,CAArB,EAAwB0H,CAAxB,EAA4B;;AAEnC1T,WAAS,KAAK8yC,QAAd;;AAEA,OAAKzxC,KAAL,CAAYrB,QAAQ,CAApB,IAA0BZ,CAA1B;AACA,OAAKiC,KAAL,CAAYrB,QAAQ,CAApB,IAA0BgM,CAA1B;AACA,OAAK3K,KAAL,CAAYrB,QAAQ,CAApB,IAA0B0T,CAA1B;;AAEA,SAAO,IAAP;AAEA,EA7PwC;;AA+PzCmgC,UAAS,UAAW7zC,KAAX,EAAkBZ,CAAlB,EAAqB4M,CAArB,EAAwB0H,CAAxB,EAA2BtF,CAA3B,EAA+B;;AAEvCpO,WAAS,KAAK8yC,QAAd;;AAEA,OAAKzxC,KAAL,CAAYrB,QAAQ,CAApB,IAA0BZ,CAA1B;AACA,OAAKiC,KAAL,CAAYrB,QAAQ,CAApB,IAA0BgM,CAA1B;AACA,OAAK3K,KAAL,CAAYrB,QAAQ,CAApB,IAA0B0T,CAA1B;AACA,OAAKrS,KAAL,CAAYrB,QAAQ,CAApB,IAA0BoO,CAA1B;;AAEA,SAAO,IAAP;AAEA,EA1QwC;;AA4QzC0lC,WAAU,UAAWtzB,QAAX,EAAsB;;AAE/B,OAAK+iB,gBAAL,GAAwB/iB,QAAxB;;AAEA,SAAO,IAAP;AAEA,EAlRwC;;AAoRzCzS,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAK3M,KAA3B,EAAkC,KAAKyxC,QAAvC,EAAkD7kC,IAAlD,CAAwD,IAAxD,CAAP;AAEA;;AAxRwC,CAA1C;;AA4RA;;AAEA,SAAS8lC,mBAAT,CAA8B1yC,KAA9B,EAAqCyxC,QAArC,EAA+CC,UAA/C,EAA4D;;AAE3DF,iBAAgBvyC,IAAhB,CAAsB,IAAtB,EAA4B,IAAI6jC,SAAJ,CAAe9iC,KAAf,CAA5B,EAAoDyxC,QAApD,EAA8DC,UAA9D;AAEA;;AAEDgB,oBAAoBz0C,SAApB,GAAgCC,OAAOgmB,MAAP,CAAestB,gBAAgBvzC,SAA/B,CAAhC;AACAy0C,oBAAoBz0C,SAApB,CAA8B0O,WAA9B,GAA4C+lC,mBAA5C;;AAGA,SAASC,oBAAT,CAA+B3yC,KAA/B,EAAsCyxC,QAAtC,EAAgDC,UAAhD,EAA6D;;AAE5DF,iBAAgBvyC,IAAhB,CAAsB,IAAtB,EAA4B,IAAI+jC,UAAJ,CAAgBhjC,KAAhB,CAA5B,EAAqDyxC,QAArD,EAA+DC,UAA/D;AAEA;;AAEDiB,qBAAqB10C,SAArB,GAAiCC,OAAOgmB,MAAP,CAAestB,gBAAgBvzC,SAA/B,CAAjC;AACA00C,qBAAqB10C,SAArB,CAA+B0O,WAA/B,GAA6CgmC,oBAA7C;;AAGA,SAASC,2BAAT,CAAsC5yC,KAAtC,EAA6CyxC,QAA7C,EAAuDC,UAAvD,EAAoE;;AAEnEF,iBAAgBvyC,IAAhB,CAAsB,IAAtB,EAA4B,IAAI4zC,iBAAJ,CAAuB7yC,KAAvB,CAA5B,EAA4DyxC,QAA5D,EAAsEC,UAAtE;AAEA;;AAEDkB,4BAA4B30C,SAA5B,GAAwCC,OAAOgmB,MAAP,CAAestB,gBAAgBvzC,SAA/B,CAAxC;AACA20C,4BAA4B30C,SAA5B,CAAsC0O,WAAtC,GAAoDimC,2BAApD;;AAGA,SAASE,oBAAT,CAA+B9yC,KAA/B,EAAsCyxC,QAAtC,EAAgDC,UAAhD,EAA6D;;AAE5DF,iBAAgBvyC,IAAhB,CAAsB,IAAtB,EAA4B,IAAIujC,UAAJ,CAAgBxiC,KAAhB,CAA5B,EAAqDyxC,QAArD,EAA+DC,UAA/D;AAEA;;AAEDoB,qBAAqB70C,SAArB,GAAiCC,OAAOgmB,MAAP,CAAestB,gBAAgBvzC,SAA/B,CAAjC;AACA60C,qBAAqB70C,SAArB,CAA+B0O,WAA/B,GAA6CmmC,oBAA7C;;AAGA,SAASC,qBAAT,CAAgC/yC,KAAhC,EAAuCyxC,QAAvC,EAAiDC,UAAjD,EAA8D;;AAE7DF,iBAAgBvyC,IAAhB,CAAsB,IAAtB,EAA4B,IAAIqjC,WAAJ,CAAiBtiC,KAAjB,CAA5B,EAAsDyxC,QAAtD,EAAgEC,UAAhE;AAEA;;AAEDqB,sBAAsB90C,SAAtB,GAAkCC,OAAOgmB,MAAP,CAAestB,gBAAgBvzC,SAA/B,CAAlC;AACA80C,sBAAsB90C,SAAtB,CAAgC0O,WAAhC,GAA8ComC,qBAA9C;;AAGA,SAASC,oBAAT,CAA+BhzC,KAA/B,EAAsCyxC,QAAtC,EAAgDC,UAAhD,EAA6D;;AAE5DF,iBAAgBvyC,IAAhB,CAAsB,IAAtB,EAA4B,IAAI2jC,UAAJ,CAAgB5iC,KAAhB,CAA5B,EAAqDyxC,QAArD,EAA+DC,UAA/D;AAEA;;AAEDsB,qBAAqB/0C,SAArB,GAAiCC,OAAOgmB,MAAP,CAAestB,gBAAgBvzC,SAA/B,CAAjC;AACA+0C,qBAAqB/0C,SAArB,CAA+B0O,WAA/B,GAA6CqmC,oBAA7C;;AAGA,SAASC,qBAAT,CAAgCjzC,KAAhC,EAAuCyxC,QAAvC,EAAiDC,UAAjD,EAA8D;;AAE7DF,iBAAgBvyC,IAAhB,CAAsB,IAAtB,EAA4B,IAAIyjC,WAAJ,CAAiB1iC,KAAjB,CAA5B,EAAsDyxC,QAAtD,EAAgEC,UAAhE;AAEA;;AAEDuB,sBAAsBh1C,SAAtB,GAAkCC,OAAOgmB,MAAP,CAAestB,gBAAgBvzC,SAA/B,CAAlC;AACAg1C,sBAAsBh1C,SAAtB,CAAgC0O,WAAhC,GAA8CsmC,qBAA9C;;AAGA,SAASC,sBAAT,CAAiClzC,KAAjC,EAAwCyxC,QAAxC,EAAkDC,UAAlD,EAA+D;;AAE9DF,iBAAgBvyC,IAAhB,CAAsB,IAAtB,EAA4B,IAAImjC,YAAJ,CAAkBpiC,KAAlB,CAA5B,EAAuDyxC,QAAvD,EAAiEC,UAAjE;AAEA;;AAEDwB,uBAAuBj1C,SAAvB,GAAmCC,OAAOgmB,MAAP,CAAestB,gBAAgBvzC,SAA/B,CAAnC;AACAi1C,uBAAuBj1C,SAAvB,CAAiC0O,WAAjC,GAA+CumC,sBAA/C;;AAGA,SAASC,sBAAT,CAAiCnzC,KAAjC,EAAwCyxC,QAAxC,EAAkDC,UAAlD,EAA+D;;AAE9DF,iBAAgBvyC,IAAhB,CAAsB,IAAtB,EAA4B,IAAIojC,YAAJ,CAAkBriC,KAAlB,CAA5B,EAAuDyxC,QAAvD,EAAiEC,UAAjE;AAEA;;AAEDyB,uBAAuBl1C,SAAvB,GAAmCC,OAAOgmB,MAAP,CAAestB,gBAAgBvzC,SAA/B,CAAnC;AACAk1C,uBAAuBl1C,SAAvB,CAAiC0O,WAAjC,GAA+CwmC,sBAA/C;;AAEA;;;;AAIA,SAASC,cAAT,GAA0B;;AAEzB,MAAK1pB,QAAL,GAAgB,EAAhB;AACA,MAAK0iB,OAAL,GAAe,EAAf;AACA,MAAKxB,MAAL,GAAc,EAAd;AACA,MAAKyB,GAAL,GAAW,EAAX;AACA,MAAKC,IAAL,GAAY,EAAZ;;AAEA,MAAKM,MAAL,GAAc,EAAd;;AAEA,MAAK7B,YAAL,GAAoB,EAApB;;AAEA,MAAKE,WAAL,GAAmB,EAAnB;AACA,MAAKC,WAAL,GAAmB,EAAnB;;AAEA;;AAEA,MAAKE,WAAL,GAAmB,IAAnB;AACA,MAAKhb,cAAL,GAAsB,IAAtB;;AAEA;;AAEA,MAAKkb,kBAAL,GAA0B,KAA1B;AACA,MAAKE,iBAAL,GAAyB,KAAzB;AACA,MAAKC,gBAAL,GAAwB,KAAxB;AACA,MAAKF,aAAL,GAAqB,KAArB;AACA,MAAKI,gBAAL,GAAwB,KAAxB;AAEA;;AAEDztC,OAAOK,MAAP,CAAe60C,eAAen1C,SAA9B,EAAyC;;AAExCo1C,gBAAe,UAAW7pB,QAAX,EAAsB;;AAEpC,MAAIqjB,KAAJ;AACA,MAAID,SAAS,EAAb;AACA,MAAIrC,gBAAgBhtC,SAApB;;AAEA,MAAIstC,QAAQrhB,SAASqhB,KAArB;;AAEA,OAAM,IAAI3qC,IAAI,CAAd,EAAiBA,IAAI2qC,MAAMhsC,MAA3B,EAAmCqB,GAAnC,EAA0C;;AAEzC,OAAI2rC,OAAOhB,MAAO3qC,CAAP,CAAX;;AAEA;;AAEA,OAAK2rC,KAAKtB,aAAL,KAAuBA,aAA5B,EAA4C;;AAE3CA,oBAAgBsB,KAAKtB,aAArB;;AAEA,QAAKsC,UAAUtvC,SAAf,EAA2B;;AAE1BsvC,WAAMp2B,KAAN,GAAgBvW,IAAI,CAAN,GAAY2sC,MAAM3e,KAAhC;AACA0e,YAAOntC,IAAP,CAAaotC,KAAb;AAEA;;AAEDA,YAAQ;AACP3e,YAAOhuB,IAAI,CADJ;AAEPqqC,oBAAeA;AAFR,KAAR;AAKA;AAED;;AAED,MAAKsC,UAAUtvC,SAAf,EAA2B;;AAE1BsvC,SAAMp2B,KAAN,GAAgBvW,IAAI,CAAN,GAAY2sC,MAAM3e,KAAhC;AACA0e,UAAOntC,IAAP,CAAaotC,KAAb;AAEA;;AAED,OAAKD,MAAL,GAAcA,MAAd;AAEA,EA7CuC;;AA+CxC0G,eAAc,UAAW9pB,QAAX,EAAsB;;AAEnC,MAAIqhB,QAAQrhB,SAASqhB,KAArB;AACA,MAAInhB,WAAWF,SAASE,QAAxB;AACA,MAAIohB,gBAAgBthB,SAASshB,aAA7B;;AAEA,MAAIwF,kBAAkBxF,cAAe,CAAf,KAAsBA,cAAe,CAAf,EAAmBjsC,MAAnB,GAA4B,CAAxE;AACA,MAAI00C,mBAAmBzI,cAAe,CAAf,KAAsBA,cAAe,CAAf,EAAmBjsC,MAAnB,GAA4B,CAAzE;;AAEA;;AAEA,MAAIksC,eAAevhB,SAASuhB,YAA5B;AACA,MAAIyI,qBAAqBzI,aAAalsC,MAAtC;;AAEA,MAAI40C,oBAAJ;;AAEA,MAAKD,qBAAqB,CAA1B,EAA8B;;AAE7BC,0BAAuB,EAAvB;;AAEA,QAAM,IAAIvzC,IAAI,CAAd,EAAiBA,IAAIszC,kBAArB,EAAyCtzC,GAAzC,EAAgD;;AAE/CuzC,yBAAsBvzC,CAAtB,IAA4B,EAA5B;AAEA;;AAED,QAAK6qC,YAAL,CAAkBryB,QAAlB,GAA6B+6B,oBAA7B;AAEA;;AAED,MAAIzI,eAAexhB,SAASwhB,YAA5B;AACA,MAAI0I,qBAAqB1I,aAAansC,MAAtC;;AAEA,MAAI80C,kBAAJ;;AAEA,MAAKD,qBAAqB,CAA1B,EAA8B;;AAE7BC,wBAAqB,EAArB;;AAEA,QAAM,IAAIzzC,IAAI,CAAd,EAAiBA,IAAIwzC,kBAArB,EAAyCxzC,GAAzC,EAAgD;;AAE/CyzC,uBAAoBzzC,CAApB,IAA0B,EAA1B;AAEA;;AAED,QAAK6qC,YAAL,CAAkB5pB,MAAlB,GAA2BwyB,kBAA3B;AAEA;;AAED;;AAEA,MAAIzI,cAAc1hB,SAAS0hB,WAA3B;AACA,MAAID,cAAczhB,SAASyhB,WAA3B;;AAEA,MAAI2I,iBAAiB1I,YAAYrsC,MAAZ,KAAuB6qB,SAAS7qB,MAArD;AACA,MAAIg1C,iBAAiB5I,YAAYpsC,MAAZ,KAAuB6qB,SAAS7qB,MAArD;;AAEA;;AAEA,MAAKgsC,MAAMhsC,MAAN,KAAiB,CAAtB,EAA0B;;AAEzBmO,WAAQyD,KAAR,CAAe,8DAAf;AAEA;;AAED,OAAM,IAAIvQ,IAAI,CAAd,EAAiBA,IAAI2qC,MAAMhsC,MAA3B,EAAmCqB,GAAnC,EAA0C;;AAEzC,OAAI2rC,OAAOhB,MAAO3qC,CAAP,CAAX;;AAEA,QAAKwpB,QAAL,CAAcjqB,IAAd,CAAoBiqB,SAAUmiB,KAAKx+B,CAAf,CAApB,EAAwCqc,SAAUmiB,KAAKv+B,CAAf,CAAxC,EAA4Doc,SAAUmiB,KAAKx7B,CAAf,CAA5D;;AAEA,OAAIm6B,gBAAgBqB,KAAKrB,aAAzB;;AAEA,OAAKA,cAAc3rC,MAAd,KAAyB,CAA9B,EAAkC;;AAEjC,SAAKutC,OAAL,CAAa3sC,IAAb,CAAmB+qC,cAAe,CAAf,CAAnB,EAAuCA,cAAe,CAAf,CAAvC,EAA2DA,cAAe,CAAf,CAA3D;AAEA,IAJD,MAIO;;AAEN,QAAIrpB,SAAS0qB,KAAK1qB,MAAlB;;AAEA,SAAKirB,OAAL,CAAa3sC,IAAb,CAAmB0hB,MAAnB,EAA2BA,MAA3B,EAAmCA,MAAnC;AAEA;;AAED,OAAIspB,eAAeoB,KAAKpB,YAAxB;;AAEA,OAAKA,aAAa5rC,MAAb,KAAwB,CAA7B,EAAiC;;AAEhC,SAAK+rC,MAAL,CAAYnrC,IAAZ,CAAkBgrC,aAAc,CAAd,CAAlB,EAAqCA,aAAc,CAAd,CAArC,EAAwDA,aAAc,CAAd,CAAxD;AAEA,IAJD,MAIO;;AAEN,QAAIrR,QAAQyS,KAAKzS,KAAjB;;AAEA,SAAKwR,MAAL,CAAYnrC,IAAZ,CAAkB25B,KAAlB,EAAyBA,KAAzB,EAAgCA,KAAhC;AAEA;;AAED,OAAKkX,oBAAoB,IAAzB,EAAgC;;AAE/B,QAAIwD,YAAYhJ,cAAe,CAAf,EAAoB5qC,CAApB,CAAhB;;AAEA,QAAK4zC,cAAcv2C,SAAnB,EAA+B;;AAE9B,UAAK8uC,GAAL,CAAS5sC,IAAT,CAAeq0C,UAAW,CAAX,CAAf,EAA+BA,UAAW,CAAX,CAA/B,EAA+CA,UAAW,CAAX,CAA/C;AAEA,KAJD,MAIO;;AAEN9mC,aAAQC,IAAR,CAAc,0DAAd,EAA0E/M,CAA1E;;AAEA,UAAKmsC,GAAL,CAAS5sC,IAAT,CAAe,IAAIsM,OAAJ,EAAf,EAA8B,IAAIA,OAAJ,EAA9B,EAA6C,IAAIA,OAAJ,EAA7C;AAEA;AAED;;AAED,OAAKwnC,qBAAqB,IAA1B,EAAiC;;AAEhC,QAAIO,YAAYhJ,cAAe,CAAf,EAAoB5qC,CAApB,CAAhB;;AAEA,QAAK4zC,cAAcv2C,SAAnB,EAA+B;;AAE9B,UAAK+uC,IAAL,CAAU7sC,IAAV,CAAgBq0C,UAAW,CAAX,CAAhB,EAAgCA,UAAW,CAAX,CAAhC,EAAgDA,UAAW,CAAX,CAAhD;AAEA,KAJD,MAIO;;AAEN9mC,aAAQC,IAAR,CAAc,2DAAd,EAA2E/M,CAA3E;;AAEA,UAAKosC,IAAL,CAAU7sC,IAAV,CAAgB,IAAIsM,OAAJ,EAAhB,EAA+B,IAAIA,OAAJ,EAA/B,EAA8C,IAAIA,OAAJ,EAA9C;AAEA;AAED;;AAED;;AAEA,QAAM,IAAIof,IAAI,CAAd,EAAiBA,IAAIqoB,kBAArB,EAAyCroB,GAAzC,EAAgD;;AAE/C,QAAIimB,cAAcrG,aAAc5f,CAAd,EAAkBzB,QAApC;;AAEA+pB,yBAAsBtoB,CAAtB,EAA0B1rB,IAA1B,CAAgC2xC,YAAavF,KAAKx+B,CAAlB,CAAhC,EAAuD+jC,YAAavF,KAAKv+B,CAAlB,CAAvD,EAA8E8jC,YAAavF,KAAKx7B,CAAlB,CAA9E;AAEA;;AAED,QAAM,IAAI8a,IAAI,CAAd,EAAiBA,IAAIuoB,kBAArB,EAAyCvoB,GAAzC,EAAgD;;AAE/C,QAAIkmB,cAAcrG,aAAc7f,CAAd,EAAkBqf,aAAlB,CAAiCtqC,CAAjC,CAAlB;;AAEAyzC,uBAAoBxoB,CAApB,EAAwB1rB,IAAxB,CAA8B4xC,YAAYhkC,CAA1C,EAA6CgkC,YAAY/jC,CAAzD,EAA4D+jC,YAAYhhC,CAAxE;AAEA;;AAED;;AAEA,OAAKujC,cAAL,EAAsB;;AAErB,SAAK1I,WAAL,CAAiBzrC,IAAjB,CAAuByrC,YAAaW,KAAKx+B,CAAlB,CAAvB,EAA8C69B,YAAaW,KAAKv+B,CAAlB,CAA9C,EAAqE49B,YAAaW,KAAKx7B,CAAlB,CAArE;AAEA;;AAED,OAAKwjC,cAAL,EAAsB;;AAErB,SAAK5I,WAAL,CAAiBxrC,IAAjB,CAAuBwrC,YAAaY,KAAKx+B,CAAlB,CAAvB,EAA8C49B,YAAaY,KAAKv+B,CAAlB,CAA9C,EAAqE29B,YAAaY,KAAKx7B,CAAlB,CAArE;AAEA;AAED;;AAED,OAAKgjC,aAAL,CAAoB7pB,QAApB;;AAEA,OAAK8hB,kBAAL,GAA0B9hB,SAAS8hB,kBAAnC;AACA,OAAKE,iBAAL,GAAyBhiB,SAASgiB,iBAAlC;AACA,OAAKC,gBAAL,GAAwBjiB,SAASiiB,gBAAjC;AACA,OAAKF,aAAL,GAAqB/hB,SAAS+hB,aAA9B;AACA,OAAKI,gBAAL,GAAwBniB,SAASmiB,gBAAjC;;AAEA,SAAO,IAAP;AAEA;;AAlOuC,CAAzC;;AAsOA;;;;AAIA,SAASoI,QAAT,CAAmB/zC,KAAnB,EAA2B;;AAE1B,KAAKA,MAAMnB,MAAN,KAAiB,CAAtB,EAA0B,OAAO,CAAE4oB,QAAT;;AAE1B,KAAIxd,MAAMjK,MAAO,CAAP,CAAV;;AAEA,MAAM,IAAIE,IAAI,CAAR,EAAWC,IAAIH,MAAMnB,MAA3B,EAAmCqB,IAAIC,CAAvC,EAA0C,EAAGD,CAA7C,EAAiD;;AAEhD,MAAKF,MAAOE,CAAP,IAAa+J,GAAlB,EAAwBA,MAAMjK,MAAOE,CAAP,CAAN;AAExB;;AAED,QAAO+J,GAAP;AAEA;;AAED;;;;;AAKA,IAAI+pC,mBAAmB,CAAvB,EAA0B;;AAE1B,SAASC,cAAT,GAA0B;;AAEzB/1C,QAAOC,cAAP,CAAuB,IAAvB,EAA6B,IAA7B,EAAmC,EAAER,OAAOq2C,oBAAoB,CAA7B,EAAnC;;AAEA,MAAKnqC,IAAL,GAAYX,MAAMI,YAAN,EAAZ;;AAEA,MAAKga,IAAL,GAAY,EAAZ;AACA,MAAKlkB,IAAL,GAAY,gBAAZ;;AAEA,MAAKT,KAAL,GAAa,IAAb;AACA,MAAKirB,UAAL,GAAkB,EAAlB;;AAEA,MAAKsqB,eAAL,GAAuB,EAAvB;;AAEA,MAAKtH,MAAL,GAAc,EAAd;;AAEA,MAAKxB,WAAL,GAAmB,IAAnB;AACA,MAAKhb,cAAL,GAAsB,IAAtB;;AAEA,MAAK+jB,SAAL,GAAiB,EAAEjmB,OAAO,CAAT,EAAYzX,OAAOgR,QAAnB,EAAjB;;AAEA,MAAKse,QAAL,GAAgB,EAAhB;AAEA;;AAEDkO,eAAeh2C,SAAf,GAA2BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAehlB,gBAAgBjB,SAA/B,CAAf,EAA2D;;AAErF0O,cAAasnC,cAFwE;;AAIrFtqB,mBAAkB,IAJmE;;AAMrFyqB,WAAU,YAAY;;AAErB,SAAO,KAAKz1C,KAAZ;AAEA,EAVoF;;AAYrF01C,WAAU,UAAW11C,KAAX,EAAmB;;AAE5B,MAAK05B,MAAMC,OAAN,CAAe35B,KAAf,CAAL,EAA8B;;AAE7B,QAAKA,KAAL,GAAa,KAAMo1C,SAAUp1C,KAAV,IAAoB,KAApB,GAA4Bs0C,qBAA5B,GAAoDF,qBAA1D,EAAmFp0C,KAAnF,EAA0F,CAA1F,CAAb;AAEA,GAJD,MAIO;;AAEN,QAAKA,KAAL,GAAaA,KAAb;AAEA;AAED,EAxBoF;;AA0BrF21C,eAAc,UAAWhxB,IAAX,EAAiBtT,SAAjB,EAA6B;;AAE1C,MAAK,EAAIA,aAAaA,UAAU2hC,iBAA3B,KAAkD,EAAI3hC,aAAaA,UAAUwzB,4BAA3B,CAAvD,EAAmH;;AAElHx2B,WAAQC,IAAR,CAAc,wEAAd;;AAEA,UAAO,KAAKqnC,YAAL,CAAmBhxB,IAAnB,EAAyB,IAAIkuB,eAAJ,CAAqB5yC,UAAW,CAAX,CAArB,EAAqCA,UAAW,CAAX,CAArC,CAAzB,CAAP;AAEA;;AAED,MAAK0kB,SAAS,OAAd,EAAwB;;AAEvBtW,WAAQC,IAAR,CAAc,yEAAd;AACA,QAAKonC,QAAL,CAAerkC,SAAf;;AAEA,UAAO,IAAP;AAEA;;AAED,OAAK4Z,UAAL,CAAiBtG,IAAjB,IAA0BtT,SAA1B;;AAEA,SAAO,IAAP;AAEA,EAjDoF;;AAmDrFukC,eAAc,UAAWjxB,IAAX,EAAkB;;AAE/B,SAAO,KAAKsG,UAAL,CAAiBtG,IAAjB,CAAP;AAEA,EAvDoF;;AAyDrFkxB,kBAAiB,UAAWlxB,IAAX,EAAkB;;AAElC,SAAO,KAAKsG,UAAL,CAAiBtG,IAAjB,CAAP;;AAEA,SAAO,IAAP;AAEA,EA/DoF;;AAiErFmxB,WAAU,UAAWvmB,KAAX,EAAkBzX,KAAlB,EAAyB8zB,aAAzB,EAAyC;;AAElD,OAAKqC,MAAL,CAAYntC,IAAZ,CAAkB;;AAEjByuB,UAAOA,KAFU;AAGjBzX,UAAOA,KAHU;AAIjB8zB,kBAAeA,kBAAkBhtC,SAAlB,GAA8BgtC,aAA9B,GAA8C;;AAJ5C,GAAlB;AAQA,EA3EoF;;AA6ErFmK,cAAa,YAAY;;AAExB,OAAK9H,MAAL,GAAc,EAAd;AAEA,EAjFoF;;AAmFrF+H,eAAc,UAAWzmB,KAAX,EAAkBzX,KAAlB,EAA0B;;AAEvC,OAAK09B,SAAL,CAAejmB,KAAf,GAAuBA,KAAvB;AACA,OAAKimB,SAAL,CAAe19B,KAAf,GAAuBA,KAAvB;AAEA,EAxFoF;;AA0FrF0vB,cAAa,UAAWlsB,MAAX,EAAoB;;AAEhC,MAAIvB,WAAW,KAAKkR,UAAL,CAAgBlR,QAA/B;;AAEA,MAAKA,aAAanb,SAAlB,EAA8B;;AAE7B0c,UAAOzD,sBAAP,CAA+BkC,QAA/B;AACAA,YAASk8B,WAAT,GAAuB,IAAvB;AAEA;;AAED,MAAIzzB,SAAS,KAAKyI,UAAL,CAAgBzI,MAA7B;;AAEA,MAAKA,WAAW5jB,SAAhB,EAA4B;;AAE3B,OAAImxB,eAAe,IAAI5M,OAAJ,GAAcI,eAAd,CAA+BjI,MAA/B,CAAnB;;AAEAyU,gBAAalY,sBAAb,CAAqC2K,MAArC;AACAA,UAAOyzB,WAAP,GAAqB,IAArB;AAEA;;AAED,MAAK,KAAKxJ,WAAL,KAAqB,IAA1B,EAAiC;;AAEhC,QAAKW,kBAAL;AAEA;;AAED,MAAK,KAAK3b,cAAL,KAAwB,IAA7B,EAAoC;;AAEnC,QAAKC,qBAAL;AAEA;;AAED,SAAO,IAAP;AAEA,EA9HoF;;AAgIrFsW,UAAS,YAAY;;AAEpB;;AAEA,MAAInY,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAASm2B,OAAT,CAAkB53B,KAAlB,EAA0B;;AAEhCyf,MAAGxW,aAAH,CAAkBjJ,KAAlB;;AAEA,QAAKo3B,WAAL,CAAkB3X,EAAlB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAhBQ,EAhI4E;;AAkJrFoY,UAAS,YAAY;;AAEpB;;AAEA,MAAIpY,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAASo2B,OAAT,CAAkB73B,KAAlB,EAA0B;;AAEhCyf,MAAGtW,aAAH,CAAkBnJ,KAAlB;;AAEA,QAAKo3B,WAAL,CAAkB3X,EAAlB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAhBQ,EAlJ4E;;AAoKrFqY,UAAS,YAAY;;AAEpB;;AAEA,MAAIrY,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAASq2B,OAAT,CAAkB93B,KAAlB,EAA0B;;AAEhCyf,MAAGrW,aAAH,CAAkBpJ,KAAlB;;AAEA,QAAKo3B,WAAL,CAAkB3X,EAAlB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAhBQ,EApK4E;;AAsLrF9L,YAAW,YAAY;;AAEtB;;AAEA,MAAI8L,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAASkS,SAAT,CAAoB3kB,CAApB,EAAuB4M,CAAvB,EAA0B0H,CAA1B,EAA8B;;AAEpCmc,MAAGzW,eAAH,CAAoBha,CAApB,EAAuB4M,CAAvB,EAA0B0H,CAA1B;;AAEA,QAAK8zB,WAAL,CAAkB3X,EAAlB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAhBU,EAtL0E;;AAwMrF9W,QAAO,YAAY;;AAElB;;AAEA,MAAI8W,KAAK,IAAIhe,OAAJ,EAAT;;AAEA,SAAO,SAASkH,KAAT,CAAgB3Z,CAAhB,EAAmB4M,CAAnB,EAAsB0H,CAAtB,EAA0B;;AAEhCmc,MAAGhW,SAAH,CAAcza,CAAd,EAAiB4M,CAAjB,EAAoB0H,CAApB;;AAEA,QAAK8zB,WAAL,CAAkB3X,EAAlB;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAhBM,EAxM8E;;AA0NrFta,SAAQ,YAAY;;AAEnB,MAAI83B,MAAM,IAAIhH,QAAJ,EAAV;;AAEA,SAAO,SAAS9wB,MAAT,CAAiB8F,MAAjB,EAA0B;;AAEhCgyB,OAAI93B,MAAJ,CAAY8F,MAAZ;;AAEAgyB,OAAI5nB,YAAJ;;AAEA,QAAK+hB,WAAL,CAAkB6F,IAAI/xB,MAAtB;AAEA,GARD;AAUA,EAdO,EA1N6E;;AA0OrF7J,SAAQ,YAAY;;AAEnB,MAAIP,SAAS,IAAI0C,OAAJ,EAAb;;AAEA,SAAO,SAASnC,MAAT,GAAkB;;AAExB,QAAK27B,kBAAL;;AAEA,QAAKX,WAAL,CAAiBpiB,SAAjB,CAA4BnZ,MAA5B,EAAqCrB,MAArC;;AAEA,QAAKkU,SAAL,CAAgB7S,OAAO9R,CAAvB,EAA0B8R,OAAOlF,CAAjC,EAAoCkF,OAAOwC,CAA3C;;AAEA,UAAO,IAAP;AAEA,GAVD;AAYA,EAhBO,EA1O6E;;AA4PrFsW,gBAAe,UAAWC,MAAX,EAAoB;;AAElC;;AAEA,MAAIY,WAAWZ,OAAOY,QAAtB;;AAEA,MAAKZ,OAAOisB,QAAP,IAAmBjsB,OAAOksB,MAA/B,EAAwC;;AAEvC,OAAI3I,YAAY,IAAI+G,sBAAJ,CAA4B1pB,SAASE,QAAT,CAAkB7qB,MAAlB,GAA2B,CAAvD,EAA0D,CAA1D,CAAhB;AACA,OAAI+rC,SAAS,IAAIsI,sBAAJ,CAA4B1pB,SAASohB,MAAT,CAAgB/rC,MAAhB,GAAyB,CAArD,EAAwD,CAAxD,CAAb;;AAEA,QAAKy1C,YAAL,CAAmB,UAAnB,EAA+BnI,UAAUkG,iBAAV,CAA6B7oB,SAASE,QAAtC,CAA/B;AACA,QAAK4qB,YAAL,CAAmB,OAAnB,EAA4B1J,OAAOsH,eAAP,CAAwB1oB,SAASohB,MAAjC,CAA5B;;AAEA,OAAKphB,SAAS2hB,aAAT,IAA0B3hB,SAAS2hB,aAAT,CAAuBtsC,MAAvB,KAAkC2qB,SAASE,QAAT,CAAkB7qB,MAAnF,EAA4F;;AAE3F,QAAIssC,gBAAgB,IAAI+H,sBAAJ,CAA4B1pB,SAAS2hB,aAAT,CAAuBtsC,MAAnD,EAA2D,CAA3D,CAApB;;AAEA,SAAKy1C,YAAL,CAAmB,cAAnB,EAAmCnJ,cAAc8G,SAAd,CAAyBzoB,SAAS2hB,aAAlC,CAAnC;AAEA;;AAED,OAAK3hB,SAAS4G,cAAT,KAA4B,IAAjC,EAAwC;;AAEvC,SAAKA,cAAL,GAAsB5G,SAAS4G,cAAT,CAAwB1jB,KAAxB,EAAtB;AAEA;;AAED,OAAK8c,SAAS4hB,WAAT,KAAyB,IAA9B,EAAqC;;AAEpC,SAAKA,WAAL,GAAmB5hB,SAAS4hB,WAAT,CAAqB1+B,KAArB,EAAnB;AAEA;AAED,GA5BD,MA4BO,IAAKkc,OAAOqmB,MAAZ,EAAqB;;AAE3B,OAAKzlB,YAAYA,SAASC,UAA1B,EAAuC;;AAEtC,SAAK6pB,YAAL,CAAmB9pB,QAAnB;AAEA;AAED;;AAED,SAAO,IAAP;AAEA,EA1SoF;;AA4SrFrB,gBAAe,UAAWC,MAAX,EAAoB;;AAElC,MAAI1P,WAAW,EAAf;;AAEA,OAAM,IAAIxY,IAAI,CAAR,EAAWC,IAAIioB,OAAOvpB,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAIgpB,QAAQd,OAAQloB,CAAR,CAAZ;AACAwY,YAASjZ,IAAT,CAAeypB,MAAMnrB,CAArB,EAAwBmrB,MAAMve,CAA9B,EAAiCue,MAAM7W,CAAN,IAAW,CAA5C;AAEA;;AAED,OAAKiiC,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4Bx6B,QAA5B,EAAsC,CAAtC,CAA/B;;AAEA,SAAO,IAAP;AAEA,EA3ToF;;AA6TrFq8B,mBAAkB,UAAWnsB,MAAX,EAAoB;;AAErC,MAAIY,WAAWZ,OAAOY,QAAtB;;AAEA,MAAKZ,OAAOqmB,MAAZ,EAAqB;;AAEpB,OAAI+F,SAASxrB,SAASyrB,gBAAtB;;AAEA,OAAKzrB,SAAS6hB,kBAAT,KAAgC,IAArC,EAA4C;;AAE3C2J,aAASz3C,SAAT;AACAisB,aAAS6hB,kBAAT,GAA8B,KAA9B;AAEA;;AAED,OAAK2J,WAAWz3C,SAAhB,EAA4B;;AAE3B,WAAO,KAAK+1C,YAAL,CAAmB9pB,QAAnB,CAAP;AAEA;;AAEDwrB,UAAO1J,kBAAP,GAA4B9hB,SAAS8hB,kBAArC;AACA0J,UAAOxJ,iBAAP,GAA2BhiB,SAASgiB,iBAApC;AACAwJ,UAAOvJ,gBAAP,GAA0BjiB,SAASiiB,gBAAnC;AACAuJ,UAAOzJ,aAAP,GAAuB/hB,SAAS+hB,aAAhC;AACAyJ,UAAOrJ,gBAAP,GAA0BniB,SAASmiB,gBAAnC;;AAEAniB,YAAS8hB,kBAAT,GAA8B,KAA9B;AACA9hB,YAASgiB,iBAAT,GAA6B,KAA7B;AACAhiB,YAASiiB,gBAAT,GAA4B,KAA5B;AACAjiB,YAAS+hB,aAAT,GAAyB,KAAzB;AACA/hB,YAASmiB,gBAAT,GAA4B,KAA5B;;AAEAniB,cAAWwrB,MAAX;AAEA;;AAED,MAAIhlC,SAAJ;;AAEA,MAAKwZ,SAAS8hB,kBAAT,KAAgC,IAArC,EAA4C;;AAE3Ct7B,eAAY,KAAK4Z,UAAL,CAAgBlR,QAA5B;;AAEA,OAAK1I,cAAczS,SAAnB,EAA+B;;AAE9ByS,cAAUqiC,iBAAV,CAA6B7oB,SAASE,QAAtC;AACA1Z,cAAU4kC,WAAV,GAAwB,IAAxB;AAEA;;AAEDprB,YAAS8hB,kBAAT,GAA8B,KAA9B;AAEA;;AAED,MAAK9hB,SAASgiB,iBAAT,KAA+B,IAApC,EAA2C;;AAE1Cx7B,eAAY,KAAK4Z,UAAL,CAAgBzI,MAA5B;;AAEA,OAAKnR,cAAczS,SAAnB,EAA+B;;AAE9ByS,cAAUqiC,iBAAV,CAA6B7oB,SAAS4iB,OAAtC;AACAp8B,cAAU4kC,WAAV,GAAwB,IAAxB;AAEA;;AAEDprB,YAASgiB,iBAAT,GAA6B,KAA7B;AAEA;;AAED,MAAKhiB,SAASiiB,gBAAT,KAA8B,IAAnC,EAA0C;;AAEzCz7B,eAAY,KAAK4Z,UAAL,CAAgBwP,KAA5B;;AAEA,OAAKppB,cAAczS,SAAnB,EAA+B;;AAE9ByS,cAAUkiC,eAAV,CAA2B1oB,SAASohB,MAApC;AACA56B,cAAU4kC,WAAV,GAAwB,IAAxB;AAEA;;AAEDprB,YAASiiB,gBAAT,GAA4B,KAA5B;AAEA;;AAED,MAAKjiB,SAAS+hB,aAAd,EAA8B;;AAE7Bv7B,eAAY,KAAK4Z,UAAL,CAAgB/D,EAA5B;;AAEA,OAAK7V,cAAczS,SAAnB,EAA+B;;AAE9ByS,cAAUmiC,iBAAV,CAA6B3oB,SAAS6iB,GAAtC;AACAr8B,cAAU4kC,WAAV,GAAwB,IAAxB;AAEA;;AAEDprB,YAAS+hB,aAAT,GAAyB,KAAzB;AAEA;;AAED,MAAK/hB,SAASkiB,uBAAd,EAAwC;;AAEvC17B,eAAY,KAAK4Z,UAAL,CAAgBsrB,YAA5B;;AAEA,OAAKllC,cAAczS,SAAnB,EAA+B;;AAE9ByS,cAAUiiC,SAAV,CAAqBzoB,SAAS2hB,aAA9B;AACAn7B,cAAU4kC,WAAV,GAAwB,IAAxB;AAEA;;AAEDprB,YAASkiB,uBAAT,GAAmC,KAAnC;AAEA;;AAED,MAAKliB,SAASmiB,gBAAd,EAAiC;;AAEhCniB,YAAS6pB,aAAT,CAAwBzqB,OAAOY,QAA/B;AACA,QAAKojB,MAAL,GAAcpjB,SAASojB,MAAvB;;AAEApjB,YAASmiB,gBAAT,GAA4B,KAA5B;AAEA;;AAED,SAAO,IAAP;AAEA,EA1boF;;AA4brF2H,eAAc,UAAW9pB,QAAX,EAAsB;;AAEnCA,WAASyrB,gBAAT,GAA4B,IAAI7B,cAAJ,GAAqBE,YAArB,CAAmC9pB,QAAnC,CAA5B;;AAEA,SAAO,KAAK2rB,kBAAL,CAAyB3rB,SAASyrB,gBAAlC,CAAP;AAEA,EAlcoF;;AAocrFE,qBAAoB,UAAW3rB,QAAX,EAAsB;;AAEzC,MAAI2iB,YAAY,IAAI/J,YAAJ,CAAkB5Y,SAASE,QAAT,CAAkB7qB,MAAlB,GAA2B,CAA7C,CAAhB;AACA,OAAKy1C,YAAL,CAAmB,UAAnB,EAA+B,IAAI9C,eAAJ,CAAqBrF,SAArB,EAAgC,CAAhC,EAAoCkG,iBAApC,CAAuD7oB,SAASE,QAAhE,CAA/B;;AAEA,MAAKF,SAAS4iB,OAAT,CAAiBvtC,MAAjB,GAA0B,CAA/B,EAAmC;;AAElC,OAAIutC,UAAU,IAAIhK,YAAJ,CAAkB5Y,SAAS4iB,OAAT,CAAiBvtC,MAAjB,GAA0B,CAA5C,CAAd;AACA,QAAKy1C,YAAL,CAAmB,QAAnB,EAA6B,IAAI9C,eAAJ,CAAqBpF,OAArB,EAA8B,CAA9B,EAAkCiG,iBAAlC,CAAqD7oB,SAAS4iB,OAA9D,CAA7B;AAEA;;AAED,MAAK5iB,SAASohB,MAAT,CAAgB/rC,MAAhB,GAAyB,CAA9B,EAAkC;;AAEjC,OAAI+rC,SAAS,IAAIxI,YAAJ,CAAkB5Y,SAASohB,MAAT,CAAgB/rC,MAAhB,GAAyB,CAA3C,CAAb;AACA,QAAKy1C,YAAL,CAAmB,OAAnB,EAA4B,IAAI9C,eAAJ,CAAqB5G,MAArB,EAA6B,CAA7B,EAAiCsH,eAAjC,CAAkD1oB,SAASohB,MAA3D,CAA5B;AAEA;;AAED,MAAKphB,SAAS6iB,GAAT,CAAaxtC,MAAb,GAAsB,CAA3B,EAA+B;;AAE9B,OAAIwtC,MAAM,IAAIjK,YAAJ,CAAkB5Y,SAAS6iB,GAAT,CAAaxtC,MAAb,GAAsB,CAAxC,CAAV;AACA,QAAKy1C,YAAL,CAAmB,IAAnB,EAAyB,IAAI9C,eAAJ,CAAqBnF,GAArB,EAA0B,CAA1B,EAA8B8F,iBAA9B,CAAiD3oB,SAAS6iB,GAA1D,CAAzB;AAEA;;AAED,MAAK7iB,SAAS8iB,IAAT,CAAcztC,MAAd,GAAuB,CAA5B,EAAgC;;AAE/B,OAAIytC,OAAO,IAAIlK,YAAJ,CAAkB5Y,SAAS8iB,IAAT,CAAcztC,MAAd,GAAuB,CAAzC,CAAX;AACA,QAAKy1C,YAAL,CAAmB,KAAnB,EAA0B,IAAI9C,eAAJ,CAAqBlF,IAArB,EAA2B,CAA3B,EAA+B6F,iBAA/B,CAAkD3oB,SAAS8iB,IAA3D,CAA1B;AAEA;;AAED;;AAEA,OAAKM,MAAL,GAAcpjB,SAASojB,MAAvB;;AAEA;;AAEA,OAAM,IAAItpB,IAAV,IAAkBkG,SAASuhB,YAA3B,EAA0C;;AAEzC,OAAI/qC,QAAQ,EAAZ;AACA,OAAI+qC,eAAevhB,SAASuhB,YAAT,CAAuBznB,IAAvB,CAAnB;;AAEA,QAAM,IAAIpjB,IAAI,CAAR,EAAWC,IAAI4qC,aAAalsC,MAAlC,EAA0CqB,IAAIC,CAA9C,EAAiDD,GAAjD,EAAwD;;AAEvD,QAAIkxC,cAAcrG,aAAc7qC,CAAd,CAAlB;;AAEA,QAAI8P,YAAY,IAAIkjC,sBAAJ,CAA4B9B,YAAYvyC,MAAZ,GAAqB,CAAjD,EAAoD,CAApD,CAAhB;;AAEAmB,UAAMP,IAAN,CAAYuQ,UAAUqiC,iBAAV,CAA6BjB,WAA7B,CAAZ;AAEA;;AAED,QAAK8C,eAAL,CAAsB5wB,IAAtB,IAA+BtjB,KAA/B;AAEA;;AAED;;AAEA,MAAKwpB,SAAS0hB,WAAT,CAAqBrsC,MAArB,GAA8B,CAAnC,EAAuC;;AAEtC,OAAIqsC,cAAc,IAAIgI,sBAAJ,CAA4B1pB,SAAS0hB,WAAT,CAAqBrsC,MAArB,GAA8B,CAA1D,EAA6D,CAA7D,CAAlB;AACA,QAAKy1C,YAAL,CAAmB,WAAnB,EAAgCpJ,YAAYoH,iBAAZ,CAA+B9oB,SAAS0hB,WAAxC,CAAhC;AAEA;;AAED,MAAK1hB,SAASyhB,WAAT,CAAqBpsC,MAArB,GAA8B,CAAnC,EAAuC;;AAEtC,OAAIosC,cAAc,IAAIiI,sBAAJ,CAA4B1pB,SAASyhB,WAAT,CAAqBpsC,MAArB,GAA8B,CAA1D,EAA6D,CAA7D,CAAlB;AACA,QAAKy1C,YAAL,CAAmB,YAAnB,EAAiCrJ,YAAYqH,iBAAZ,CAA+B9oB,SAASyhB,WAAxC,CAAjC;AAEA;;AAED;;AAEA,MAAKzhB,SAAS4G,cAAT,KAA4B,IAAjC,EAAwC;;AAEvC,QAAKA,cAAL,GAAsB5G,SAAS4G,cAAT,CAAwB1jB,KAAxB,EAAtB;AAEA;;AAED,MAAK8c,SAAS4hB,WAAT,KAAyB,IAA9B,EAAqC;;AAEpC,QAAKA,WAAL,GAAmB5hB,SAAS4hB,WAAT,CAAqB1+B,KAArB,EAAnB;AAEA;;AAED,SAAO,IAAP;AAEA,EA9hBoF;;AAgiBrFq/B,qBAAoB,YAAY;;AAE/B,MAAK,KAAKX,WAAL,KAAqB,IAA1B,EAAiC;;AAEhC,QAAKA,WAAL,GAAmB,IAAI5jB,IAAJ,EAAnB;AAEA;;AAED,MAAI9O,WAAW,KAAKkR,UAAL,CAAgBlR,QAA/B;;AAEA,MAAKA,aAAanb,SAAlB,EAA8B;;AAE7B,QAAK6tC,WAAL,CAAiBljB,sBAAjB,CAAyCxP,QAAzC;AAEA,GAJD,MAIO;;AAEN,QAAK0yB,WAAL,CAAiB/iB,SAAjB;AAEA;;AAED,MAAK+sB,MAAO,KAAKhK,WAAL,CAAiBphC,GAAjB,CAAqBjM,CAA5B,KAAmCq3C,MAAO,KAAKhK,WAAL,CAAiBphC,GAAjB,CAAqBW,CAA5B,CAAnC,IAAsEyqC,MAAO,KAAKhK,WAAL,CAAiBphC,GAAjB,CAAqBqI,CAA5B,CAA3E,EAA6G;;AAE5GrF,WAAQyD,KAAR,CAAe,mIAAf,EAAoJ,IAApJ;AAEA;AAED,EA1jBoF;;AA4jBrF4f,wBAAuB,YAAY;;AAElC,MAAIvH,MAAM,IAAItB,IAAJ,EAAV;AACA,MAAIxN,SAAS,IAAIzH,OAAJ,EAAb;;AAEA,SAAO,SAAS8d,qBAAT,GAAiC;;AAEvC,OAAK,KAAKD,cAAL,KAAwB,IAA7B,EAAoC;;AAEnC,SAAKA,cAAL,GAAsB,IAAIzE,MAAJ,EAAtB;AAEA;;AAED,OAAIjT,WAAW,KAAKkR,UAAL,CAAgBlR,QAA/B;;AAEA,OAAKA,QAAL,EAAgB;;AAEf,QAAItI,SAAS,KAAKggB,cAAL,CAAoBhgB,MAAjC;;AAEA0Y,QAAIZ,sBAAJ,CAA4BxP,QAA5B;AACAoQ,QAAIE,SAAJ,CAAe5Y,MAAf;;AAEA;AACA;;AAEA,QAAI6c,cAAc,CAAlB;;AAEA,SAAM,IAAI/sB,IAAI,CAAR,EAAWooB,KAAK5P,SAASjC,KAA/B,EAAsCvW,IAAIooB,EAA1C,EAA8CpoB,GAA9C,EAAqD;;AAEpD8Z,YAAOjc,CAAP,GAAW2a,SAASzI,IAAT,CAAe/P,CAAf,CAAX;AACA8Z,YAAOrP,CAAP,GAAW+N,SAASxI,IAAT,CAAehQ,CAAf,CAAX;AACA8Z,YAAO3H,CAAP,GAAWqG,SAAShC,IAAT,CAAexW,CAAf,CAAX;AACA+sB,mBAAczvB,KAAKyM,GAAL,CAAUgjB,WAAV,EAAuB7c,OAAOlB,iBAAP,CAA0B8K,MAA1B,CAAvB,CAAd;AAEA;;AAED,SAAKoW,cAAL,CAAoB1O,MAApB,GAA6BlkB,KAAKmR,IAAL,CAAWse,WAAX,CAA7B;;AAEA,QAAKmoB,MAAO,KAAKhlB,cAAL,CAAoB1O,MAA3B,CAAL,EAA2C;;AAE1C1U,aAAQyD,KAAR,CAAe,8HAAf,EAA+I,IAA/I;AAEA;AAED;AAED,GAzCD;AA2CA,EAhDsB,EA5jB8D;;AA8mBrFq8B,qBAAoB,YAAY;;AAE/B;;AAEA,EAlnBoF;;AAonBrFO,uBAAsB,YAAY;;AAEjC,MAAI1uC,QAAQ,KAAKA,KAAjB;AACA,MAAIirB,aAAa,KAAKA,UAAtB;AACA,MAAIgjB,SAAS,KAAKA,MAAlB;;AAEA,MAAKhjB,WAAWlR,QAAhB,EAA2B;;AAE1B,OAAIyzB,YAAYviB,WAAWlR,QAAX,CAAoB1Y,KAApC;;AAEA,OAAK4pB,WAAWzI,MAAX,KAAsB5jB,SAA3B,EAAuC;;AAEtC,SAAK+2C,YAAL,CAAmB,QAAnB,EAA6B,IAAI9C,eAAJ,CAAqB,IAAIpP,YAAJ,CAAkB+J,UAAUttC,MAA5B,CAArB,EAA2D,CAA3D,CAA7B;AAEA,IAJD,MAIO;;AAEN;;AAEA,QAAImB,QAAQ4pB,WAAWzI,MAAX,CAAkBnhB,KAA9B;;AAEA,SAAM,IAAIE,IAAI,CAAR,EAAWooB,KAAKtoB,MAAMnB,MAA5B,EAAoCqB,IAAIooB,EAAxC,EAA4CpoB,GAA5C,EAAmD;;AAElDF,WAAOE,CAAP,IAAa,CAAb;AAEA;AAED;;AAED,OAAIksC,UAAUxiB,WAAWzI,MAAX,CAAkBnhB,KAAhC;;AAEA,OAAIktC,EAAJ,EAAQC,EAAR,EAAYC,EAAZ;AACA,OAAIiI,KAAK,IAAI9iC,OAAJ,EAAT;AAAA,OAAwB+iC,KAAK,IAAI/iC,OAAJ,EAA7B;AAAA,OAA4CgjC,KAAK,IAAIhjC,OAAJ,EAAjD;AACA,OAAIw6B,KAAK,IAAIx6B,OAAJ,EAAT;AAAA,OAAwBy6B,KAAK,IAAIz6B,OAAJ,EAA7B;;AAEA;;AAEA,OAAK5T,KAAL,EAAa;;AAEZ,QAAIutC,UAAUvtC,MAAMqB,KAApB;;AAEA,QAAK4sC,OAAO/tC,MAAP,KAAkB,CAAvB,EAA2B;;AAE1B,UAAK41C,QAAL,CAAe,CAAf,EAAkBvI,QAAQrtC,MAA1B;AAEA;;AAED,SAAM,IAAIssB,IAAI,CAAR,EAAW2gB,KAAKc,OAAO/tC,MAA7B,EAAqCssB,IAAI2gB,EAAzC,EAA6C,EAAG3gB,CAAhD,EAAoD;;AAEnD,SAAI0hB,QAAQD,OAAQzhB,CAAR,CAAZ;;AAEA,SAAI+C,QAAQ2e,MAAM3e,KAAlB;AACA,SAAIzX,QAAQo2B,MAAMp2B,KAAlB;;AAEA,UAAM,IAAIvW,IAAIguB,KAAR,EAAe5F,KAAK4F,QAAQzX,KAAlC,EAAyCvW,IAAIooB,EAA7C,EAAiDpoB,KAAK,CAAtD,EAA0D;;AAEzDgtC,WAAKhB,QAAShsC,IAAI,CAAb,IAAmB,CAAxB;AACAitC,WAAKjB,QAAShsC,IAAI,CAAb,IAAmB,CAAxB;AACAktC,WAAKlB,QAAShsC,IAAI,CAAb,IAAmB,CAAxB;;AAEAm1C,SAAGzlC,SAAH,CAAcu8B,SAAd,EAAyBe,EAAzB;AACAoI,SAAG1lC,SAAH,CAAcu8B,SAAd,EAAyBgB,EAAzB;AACAoI,SAAG3lC,SAAH,CAAcu8B,SAAd,EAAyBiB,EAAzB;;AAEAL,SAAGt/B,UAAH,CAAe8nC,EAAf,EAAmBD,EAAnB;AACAtI,SAAGv/B,UAAH,CAAe4nC,EAAf,EAAmBC,EAAnB;AACAvI,SAAGvsB,KAAH,CAAUwsB,EAAV;;AAEAZ,cAASc,EAAT,KAAiBH,GAAGhvC,CAApB;AACAquC,cAASc,KAAK,CAAd,KAAqBH,GAAGpiC,CAAxB;AACAyhC,cAASc,KAAK,CAAd,KAAqBH,GAAG16B,CAAxB;;AAEA+5B,cAASe,EAAT,KAAiBJ,GAAGhvC,CAApB;AACAquC,cAASe,KAAK,CAAd,KAAqBJ,GAAGpiC,CAAxB;AACAyhC,cAASe,KAAK,CAAd,KAAqBJ,GAAG16B,CAAxB;;AAEA+5B,cAASgB,EAAT,KAAiBL,GAAGhvC,CAApB;AACAquC,cAASgB,KAAK,CAAd,KAAqBL,GAAGpiC,CAAxB;AACAyhC,cAASgB,KAAK,CAAd,KAAqBL,GAAG16B,CAAxB;AAEA;AAED;AAED,IA/CD,MA+CO;;AAEN;;AAEA,SAAM,IAAInS,IAAI,CAAR,EAAWooB,KAAK6jB,UAAUttC,MAAhC,EAAwCqB,IAAIooB,EAA5C,EAAgDpoB,KAAK,CAArD,EAAyD;;AAExDm1C,QAAGzlC,SAAH,CAAcu8B,SAAd,EAAyBjsC,CAAzB;AACAo1C,QAAG1lC,SAAH,CAAcu8B,SAAd,EAAyBjsC,IAAI,CAA7B;AACAq1C,QAAG3lC,SAAH,CAAcu8B,SAAd,EAAyBjsC,IAAI,CAA7B;;AAEA6sC,QAAGt/B,UAAH,CAAe8nC,EAAf,EAAmBD,EAAnB;AACAtI,QAAGv/B,UAAH,CAAe4nC,EAAf,EAAmBC,EAAnB;AACAvI,QAAGvsB,KAAH,CAAUwsB,EAAV;;AAEAZ,aAASlsC,CAAT,IAAe6sC,GAAGhvC,CAAlB;AACAquC,aAASlsC,IAAI,CAAb,IAAmB6sC,GAAGpiC,CAAtB;AACAyhC,aAASlsC,IAAI,CAAb,IAAmB6sC,GAAG16B,CAAtB;;AAEA+5B,aAASlsC,IAAI,CAAb,IAAmB6sC,GAAGhvC,CAAtB;AACAquC,aAASlsC,IAAI,CAAb,IAAmB6sC,GAAGpiC,CAAtB;AACAyhC,aAASlsC,IAAI,CAAb,IAAmB6sC,GAAG16B,CAAtB;;AAEA+5B,aAASlsC,IAAI,CAAb,IAAmB6sC,GAAGhvC,CAAtB;AACAquC,aAASlsC,IAAI,CAAb,IAAmB6sC,GAAGpiC,CAAtB;AACAyhC,aAASlsC,IAAI,CAAb,IAAmB6sC,GAAG16B,CAAtB;AAEA;AAED;;AAED,QAAKmjC,gBAAL;;AAEA5rB,cAAWzI,MAAX,CAAkByzB,WAAlB,GAAgC,IAAhC;AAEA;AAED,EA3uBoF;;AA6uBrF/c,QAAO,UAAWrO,QAAX,EAAqB3Z,MAArB,EAA8B;;AAEpC,MAAK,EAAI2Z,YAAYA,SAASG,gBAAzB,CAAL,EAAmD;;AAElD3c,WAAQyD,KAAR,CAAe,iFAAf,EAAkG+Y,QAAlG;AACA;AAEA;;AAED,MAAK3Z,WAAWtS,SAAhB,EAA4B;;AAE3BsS,YAAS,CAAT;;AAEA7C,WAAQC,IAAR,CACC,wFACE,qEAFH;AAKA;;AAED,MAAI2c,aAAa,KAAKA,UAAtB;;AAEA,OAAM,IAAIqf,GAAV,IAAiBrf,UAAjB,EAA8B;;AAE7B,OAAKJ,SAASI,UAAT,CAAqBqf,GAArB,MAA+B1rC,SAApC,EAAgD;;AAEhD,OAAIk4C,aAAa7rB,WAAYqf,GAAZ,CAAjB;AACA,OAAIyM,kBAAkBD,WAAWz1C,KAAjC;;AAEA,OAAI21C,aAAansB,SAASI,UAAT,CAAqBqf,GAArB,CAAjB;AACA,OAAI2M,kBAAkBD,WAAW31C,KAAjC;;AAEA,OAAI61C,gBAAgBF,WAAWlE,QAA/B;;AAEA,QAAM,IAAIvxC,IAAI,CAAR,EAAWirB,IAAI0qB,gBAAgBhmC,MAArC,EAA6C3P,IAAI01C,gBAAgB/2C,MAAjE,EAAyEqB,KAAMirB,GAA/E,EAAsF;;AAErFuqB,oBAAiBvqB,CAAjB,IAAuByqB,gBAAiB11C,CAAjB,CAAvB;AAEA;AAED;;AAED,SAAO,IAAP;AAEA,EAzxBoF;;AA2xBrFs1C,mBAAkB,YAAY;;AAE7B,MAAIx7B,SAAS,IAAIzH,OAAJ,EAAb;;AAEA,SAAO,SAASijC,gBAAT,GAA4B;;AAElC,OAAIpJ,UAAU,KAAKxiB,UAAL,CAAgBzI,MAA9B;;AAEA,QAAM,IAAIjhB,IAAI,CAAR,EAAWooB,KAAK8jB,QAAQ31B,KAA9B,EAAqCvW,IAAIooB,EAAzC,EAA6CpoB,GAA7C,EAAoD;;AAEnD8Z,WAAOjc,CAAP,GAAWquC,QAAQn8B,IAAR,CAAc/P,CAAd,CAAX;AACA8Z,WAAOrP,CAAP,GAAWyhC,QAAQl8B,IAAR,CAAchQ,CAAd,CAAX;AACA8Z,WAAO3H,CAAP,GAAW+5B,QAAQ11B,IAAR,CAAcxW,CAAd,CAAX;;AAEA8Z,WAAOlL,SAAP;;AAEAs9B,YAAQx1B,MAAR,CAAgB1W,CAAhB,EAAmB8Z,OAAOjc,CAA1B,EAA6Bic,OAAOrP,CAApC,EAAuCqP,OAAO3H,CAA9C;AAEA;AAED,GAhBD;AAkBA,EAtBiB,EA3xBmE;;AAmzBrFyjC,eAAc,YAAY;;AAEzB,MAAK,KAAKn3C,KAAL,KAAe,IAApB,EAA2B;;AAE1BqO,WAAQC,IAAR,CAAc,uEAAd;AACA,UAAO,IAAP;AAEA;;AAED,MAAI8oC,YAAY,IAAI9B,cAAJ,EAAhB;;AAEA,MAAI/H,UAAU,KAAKvtC,KAAL,CAAWqB,KAAzB;AACA,MAAI4pB,aAAa,KAAKA,UAAtB;;AAEA,OAAM,IAAItG,IAAV,IAAkBsG,UAAlB,EAA+B;;AAE9B,OAAI5Z,YAAY4Z,WAAYtG,IAAZ,CAAhB;;AAEA,OAAItjB,QAAQgQ,UAAUhQ,KAAtB;AACA,OAAIyxC,WAAWzhC,UAAUyhC,QAAzB;;AAEA,OAAIuE,SAAS,IAAIh2C,MAAM2M,WAAV,CAAuBu/B,QAAQrtC,MAAR,GAAiB4yC,QAAxC,CAAb;;AAEA,OAAI9yC,QAAQ,CAAZ;AAAA,OAAeqzC,SAAS,CAAxB;;AAEA,QAAM,IAAI9xC,IAAI,CAAR,EAAWC,IAAI+rC,QAAQrtC,MAA7B,EAAqCqB,IAAIC,CAAzC,EAA4CD,GAA5C,EAAmD;;AAElDvB,YAAQutC,QAAShsC,CAAT,IAAeuxC,QAAvB;;AAEA,SAAM,IAAItmB,IAAI,CAAd,EAAiBA,IAAIsmB,QAArB,EAA+BtmB,GAA/B,EAAsC;;AAErC6qB,YAAQhE,QAAR,IAAsBhyC,MAAOrB,OAAP,CAAtB;AAEA;AAED;;AAEDo3C,aAAUzB,YAAV,CAAwBhxB,IAAxB,EAA8B,IAAIkuB,eAAJ,CAAqBwE,MAArB,EAA6BvE,QAA7B,CAA9B;AAEA;;AAED,MAAI7E,SAAS,KAAKA,MAAlB;;AAEA,OAAM,IAAI1sC,IAAI,CAAR,EAAWC,IAAIysC,OAAO/tC,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAI2sC,QAAQD,OAAQ1sC,CAAR,CAAZ;AACA61C,aAAUtB,QAAV,CAAoB5H,MAAM3e,KAA1B,EAAiC2e,MAAMp2B,KAAvC,EAA8Co2B,MAAMtC,aAApD;AAEA;;AAED,SAAOwL,SAAP;AAEA,EAv2BoF;;AAy2BrF1xB,SAAQ,YAAY;;AAEnB,MAAIiD,OAAO;AACVhC,aAAU;AACTtB,aAAS,GADA;AAET5kB,UAAM,gBAFG;AAGTmmB,eAAW;AAHF;AADA,GAAX;;AAQA;;AAEA+B,OAAKzd,IAAL,GAAY,KAAKA,IAAjB;AACAyd,OAAKloB,IAAL,GAAY,KAAKA,IAAjB;AACA,MAAK,KAAKkkB,IAAL,KAAc,EAAnB,EAAwBgE,KAAKhE,IAAL,GAAY,KAAKA,IAAjB;AACxB,MAAKplB,OAAO+3C,IAAP,CAAa,KAAKlQ,QAAlB,EAA6BlnC,MAA7B,GAAsC,CAA3C,EAA+CyoB,KAAKye,QAAL,GAAgB,KAAKA,QAArB;;AAE/C,MAAK,KAAK2C,UAAL,KAAoBnrC,SAAzB,EAAqC;;AAEpC,OAAImrC,aAAa,KAAKA,UAAtB;;AAEA,QAAM,IAAIO,GAAV,IAAiBP,UAAjB,EAA8B;;AAE7B,QAAKA,WAAYO,GAAZ,MAAsB1rC,SAA3B,EAAuC+pB,KAAM2hB,GAAN,IAAcP,WAAYO,GAAZ,CAAd;AAEvC;;AAED,UAAO3hB,IAAP;AAEA;;AAEDA,OAAKA,IAAL,GAAY,EAAEsC,YAAY,EAAd,EAAZ;;AAEA,MAAIjrB,QAAQ,KAAKA,KAAjB;;AAEA,MAAKA,UAAU,IAAf,EAAsB;;AAErB,OAAIqB,QAAQq4B,MAAMp6B,SAAN,CAAgBgC,KAAhB,CAAsBhB,IAAtB,CAA4BN,MAAMqB,KAAlC,CAAZ;;AAEAsnB,QAAKA,IAAL,CAAU3oB,KAAV,GAAkB;AACjBS,UAAMT,MAAMqB,KAAN,CAAY2M,WAAZ,CAAwB2W,IADb;AAEjBtjB,WAAOA;AAFU,IAAlB;AAKA;;AAED,MAAI4pB,aAAa,KAAKA,UAAtB;;AAEA,OAAM,IAAIqf,GAAV,IAAiBrf,UAAjB,EAA8B;;AAE7B,OAAI5Z,YAAY4Z,WAAYqf,GAAZ,CAAhB;;AAEA,OAAIjpC,QAAQq4B,MAAMp6B,SAAN,CAAgBgC,KAAhB,CAAsBhB,IAAtB,CAA4B+Q,UAAUhQ,KAAtC,CAAZ;;AAEAsnB,QAAKA,IAAL,CAAUsC,UAAV,CAAsBqf,GAAtB,IAA8B;AAC7BwI,cAAUzhC,UAAUyhC,QADS;AAE7BryC,UAAM4Q,UAAUhQ,KAAV,CAAgB2M,WAAhB,CAA4B2W,IAFL;AAG7BtjB,WAAOA,KAHsB;AAI7B0xC,gBAAY1hC,UAAU0hC;AAJO,IAA9B;AAOA;;AAED,MAAI9E,SAAS,KAAKA,MAAlB;;AAEA,MAAKA,OAAO/tC,MAAP,GAAgB,CAArB,EAAyB;;AAExByoB,QAAKA,IAAL,CAAUslB,MAAV,GAAmBvE,KAAKc,KAAL,CAAYd,KAAKC,SAAL,CAAgBsE,MAAhB,CAAZ,CAAnB;AAEA;;AAED,MAAIxc,iBAAiB,KAAKA,cAA1B;;AAEA,MAAKA,mBAAmB,IAAxB,EAA+B;;AAE9B9I,QAAKA,IAAL,CAAU8I,cAAV,GAA2B;AAC1BhgB,YAAQggB,eAAehgB,MAAf,CAAsBN,OAAtB,EADkB;AAE1B4R,YAAQ0O,eAAe1O;AAFG,IAA3B;AAKA;;AAED,SAAO4F,IAAP;AAEA,EA77BoF;;AA+7BrF5a,QAAO,YAAY;;AAElB;;;;;;;;;;;;;;;AAwBA,SAAO,IAAIunC,cAAJ,GAAqBrnC,IAArB,CAA2B,IAA3B,CAAP;AAEA,EA39BoF;;AA69BrFA,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB,MAAIwkB,IAAJ,EAAUpjB,CAAV,EAAaC,CAAb;;AAEA;;AAEA,OAAKxB,KAAL,GAAa,IAAb;AACA,OAAKirB,UAAL,GAAkB,EAAlB;AACA,OAAKsqB,eAAL,GAAuB,EAAvB;AACA,OAAKtH,MAAL,GAAc,EAAd;AACA,OAAKxB,WAAL,GAAmB,IAAnB;AACA,OAAKhb,cAAL,GAAsB,IAAtB;;AAEA;;AAEA,OAAK9M,IAAL,GAAYxkB,OAAOwkB,IAAnB;;AAEA;;AAEA,MAAI3kB,QAAQG,OAAOH,KAAnB;;AAEA,MAAKA,UAAU,IAAf,EAAsB;;AAErB,QAAK01C,QAAL,CAAe11C,MAAM+N,KAAN,EAAf;AAEA;;AAED;;AAEA,MAAIkd,aAAa9qB,OAAO8qB,UAAxB;;AAEA,OAAMtG,IAAN,IAAcsG,UAAd,EAA2B;;AAE1B,OAAI5Z,YAAY4Z,WAAYtG,IAAZ,CAAhB;AACA,QAAKgxB,YAAL,CAAmBhxB,IAAnB,EAAyBtT,UAAUtD,KAAV,EAAzB;AAEA;;AAED;;AAEA,MAAIwnC,kBAAkBp1C,OAAOo1C,eAA7B;;AAEA,OAAM5wB,IAAN,IAAc4wB,eAAd,EAAgC;;AAE/B,OAAIl0C,QAAQ,EAAZ;AACA,OAAIk2C,iBAAiBhC,gBAAiB5wB,IAAjB,CAArB,CAH+B,CAGe;;AAE9C,QAAMpjB,IAAI,CAAJ,EAAOC,IAAI+1C,eAAer3C,MAAhC,EAAwCqB,IAAIC,CAA5C,EAA+CD,GAA/C,EAAsD;;AAErDF,UAAMP,IAAN,CAAYy2C,eAAgBh2C,CAAhB,EAAoBwM,KAApB,EAAZ;AAEA;;AAED,QAAKwnC,eAAL,CAAsB5wB,IAAtB,IAA+BtjB,KAA/B;AAEA;;AAED;;AAEA,MAAI4sC,SAAS9tC,OAAO8tC,MAApB;;AAEA,OAAM1sC,IAAI,CAAJ,EAAOC,IAAIysC,OAAO/tC,MAAxB,EAAgCqB,IAAIC,CAApC,EAAuCD,GAAvC,EAA8C;;AAE7C,OAAI2sC,QAAQD,OAAQ1sC,CAAR,CAAZ;AACA,QAAKu0C,QAAL,CAAe5H,MAAM3e,KAArB,EAA4B2e,MAAMp2B,KAAlC,EAAyCo2B,MAAMtC,aAA/C;AAEA;;AAED;;AAEA,MAAIa,cAActsC,OAAOssC,WAAzB;;AAEA,MAAKA,gBAAgB,IAArB,EAA4B;;AAE3B,QAAKA,WAAL,GAAmBA,YAAY1+B,KAAZ,EAAnB;AAEA;;AAED;;AAEA,MAAI0jB,iBAAiBtxB,OAAOsxB,cAA5B;;AAEA,MAAKA,mBAAmB,IAAxB,EAA+B;;AAE9B,QAAKA,cAAL,GAAsBA,eAAe1jB,KAAf,EAAtB;AAEA;;AAED;;AAEA,OAAKynC,SAAL,CAAejmB,KAAf,GAAuBpvB,OAAOq1C,SAAP,CAAiBjmB,KAAxC;AACA,OAAKimB,SAAL,CAAe19B,KAAf,GAAuB3X,OAAOq1C,SAAP,CAAiB19B,KAAxC;;AAEA;;AAEA,OAAKsvB,QAAL,GAAgBjnC,OAAOinC,QAAvB;;AAEA,SAAO,IAAP;AAEA,EAhkCoF;;AAkkCrFpgB,UAAS,YAAY;;AAEpB,OAAK7lB,aAAL,CAAoB,EAAEV,MAAM,SAAR,EAApB;AAEA;;AAtkCoF,CAA3D,CAA3B;;AA0kCA;;;;;AAKA;;AAEA,SAAS+2C,WAAT,CAAsBrxB,KAAtB,EAA6BC,MAA7B,EAAqC+a,KAArC,EAA4CsW,aAA5C,EAA2DC,cAA3D,EAA2EC,aAA3E,EAA2F;;AAE1F3L,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,aAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB5jB,SAAOA,KADU;AAEjBC,UAAQA,MAFS;AAGjB+a,SAAOA,KAHU;AAIjBsW,iBAAeA,aAJE;AAKjBC,kBAAgBA,cALC;AAMjBC,iBAAeA;AANE,EAAlB;;AASA,MAAKrK,kBAAL,CAAyB,IAAIsK,iBAAJ,CAAuBzxB,KAAvB,EAA8BC,MAA9B,EAAsC+a,KAAtC,EAA6CsW,aAA7C,EAA4DC,cAA5D,EAA4EC,aAA5E,CAAzB;AACA,MAAKpH,aAAL;AAEA;;AAEDiH,YAAYl4C,SAAZ,GAAwBC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAAxB;AACAk4C,YAAYl4C,SAAZ,CAAsB0O,WAAtB,GAAoCwpC,WAApC;;AAEA;;AAEA,SAASI,iBAAT,CAA4BzxB,KAA5B,EAAmCC,MAAnC,EAA2C+a,KAA3C,EAAkDsW,aAAlD,EAAiEC,cAAjE,EAAiFC,aAAjF,EAAiG;;AAEhGrC,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,mBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB5jB,SAAOA,KADU;AAEjBC,UAAQA,MAFS;AAGjB+a,SAAOA,KAHU;AAIjBsW,iBAAeA,aAJE;AAKjBC,kBAAgBA,cALC;AAMjBC,iBAAeA;AANE,EAAlB;;AASA,KAAIjtB,QAAQ,IAAZ;;AAEAvE,SAAQA,SAAS,CAAjB;AACAC,UAASA,UAAU,CAAnB;AACA+a,SAAQA,SAAS,CAAjB;;AAEA;;AAEAsW,iBAAgB54C,KAAKK,KAAL,CAAYu4C,aAAZ,KAA+B,CAA/C;AACAC,kBAAiB74C,KAAKK,KAAL,CAAYw4C,cAAZ,KAAgC,CAAjD;AACAC,iBAAgB94C,KAAKK,KAAL,CAAYy4C,aAAZ,KAA+B,CAA/C;;AAEA;;AAEA,KAAIpK,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;;AAEA;;AAEA,KAAImK,mBAAmB,CAAvB;AACA,KAAIC,aAAa,CAAjB;;AAEA;;AAEAC,YAAY,GAAZ,EAAiB,GAAjB,EAAsB,GAAtB,EAA2B,CAAE,CAA7B,EAAgC,CAAE,CAAlC,EAAqC5W,KAArC,EAA4C/a,MAA5C,EAAoDD,KAApD,EAA2DwxB,aAA3D,EAA0ED,cAA1E,EAA0F,CAA1F,EAzCgG,CAyCD;AAC/FK,YAAY,GAAZ,EAAiB,GAAjB,EAAsB,GAAtB,EAA2B,CAA3B,EAA8B,CAAE,CAAhC,EAAmC5W,KAAnC,EAA0C/a,MAA1C,EAAkD,CAAED,KAApD,EAA2DwxB,aAA3D,EAA0ED,cAA1E,EAA0F,CAA1F,EA1CgG,CA0CD;AAC/FK,YAAY,GAAZ,EAAiB,GAAjB,EAAsB,GAAtB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC5xB,KAAjC,EAAwCgb,KAAxC,EAA+C/a,MAA/C,EAAuDqxB,aAAvD,EAAsEE,aAAtE,EAAqF,CAArF,EA3CgG,CA2CN;AAC1FI,YAAY,GAAZ,EAAiB,GAAjB,EAAsB,GAAtB,EAA2B,CAA3B,EAA8B,CAAE,CAAhC,EAAmC5xB,KAAnC,EAA0Cgb,KAA1C,EAAiD,CAAE/a,MAAnD,EAA2DqxB,aAA3D,EAA0EE,aAA1E,EAAyF,CAAzF,EA5CgG,CA4CF;AAC9FI,YAAY,GAAZ,EAAiB,GAAjB,EAAsB,GAAtB,EAA2B,CAA3B,EAA8B,CAAE,CAAhC,EAAmC5xB,KAAnC,EAA0CC,MAA1C,EAAkD+a,KAAlD,EAAyDsW,aAAzD,EAAwEC,cAAxE,EAAwF,CAAxF,EA7CgG,CA6CH;AAC7FK,YAAY,GAAZ,EAAiB,GAAjB,EAAsB,GAAtB,EAA2B,CAAE,CAA7B,EAAgC,CAAE,CAAlC,EAAqC5xB,KAArC,EAA4CC,MAA5C,EAAoD,CAAE+a,KAAtD,EAA6DsW,aAA7D,EAA4EC,cAA5E,EAA4F,CAA5F,EA9CgG,CA8CC;;AAEjG;;AAEA,MAAKhC,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;;AAEA,UAASqK,UAAT,CAAqB1e,CAArB,EAAwBnrB,CAAxB,EAA2BE,CAA3B,EAA8B4pC,IAA9B,EAAoCC,IAApC,EAA0C9xB,KAA1C,EAAiDC,MAAjD,EAAyD+a,KAAzD,EAAgE+W,KAAhE,EAAuEC,KAAvE,EAA8EvM,aAA9E,EAA8F;;AAE7F,MAAIwM,eAAejyB,QAAQ+xB,KAA3B;AACA,MAAIG,gBAAgBjyB,SAAS+xB,KAA7B;;AAEA,MAAIG,YAAYnyB,QAAQ,CAAxB;AACA,MAAIoyB,aAAanyB,SAAS,CAA1B;AACA,MAAIoyB,YAAYrX,QAAQ,CAAxB;;AAEA,MAAIsX,SAASP,QAAQ,CAArB;AACA,MAAIQ,SAASP,QAAQ,CAArB;;AAEA,MAAIQ,gBAAgB,CAApB;AACA,MAAIC,aAAa,CAAjB;;AAEA,MAAIz3B,EAAJ,EAAQC,EAAR;;AAEA,MAAI/F,SAAS,IAAIzH,OAAJ,EAAb;;AAEA;;AAEA,OAAMwN,KAAK,CAAX,EAAcA,KAAKs3B,MAAnB,EAA2Bt3B,IAA3B,EAAmC;;AAElC,OAAIpV,IAAIoV,KAAKi3B,aAAL,GAAqBE,UAA7B;;AAEA,QAAMp3B,KAAK,CAAX,EAAcA,KAAKs3B,MAAnB,EAA2Bt3B,IAA3B,EAAmC;;AAElC,QAAI/hB,IAAI+hB,KAAKi3B,YAAL,GAAoBE,SAA5B;;AAEA;;AAEAj9B,WAAQge,CAAR,IAAcj6B,IAAI44C,IAAlB;AACA38B,WAAQnN,CAAR,IAAclC,IAAIisC,IAAlB;AACA58B,WAAQjN,CAAR,IAAcoqC,SAAd;;AAEA;;AAEAztB,aAASjqB,IAAT,CAAeua,OAAOjc,CAAtB,EAAyBic,OAAOrP,CAAhC,EAAmCqP,OAAO3H,CAA1C;;AAEA;;AAEA2H,WAAQge,CAAR,IAAc,CAAd;AACAhe,WAAQnN,CAAR,IAAc,CAAd;AACAmN,WAAQjN,CAAR,IAAc+yB,QAAQ,CAAR,GAAY,CAAZ,GAAgB,CAAE,CAAhC;;AAEA;;AAEAsM,YAAQ3sC,IAAR,CAAcua,OAAOjc,CAArB,EAAwBic,OAAOrP,CAA/B,EAAkCqP,OAAO3H,CAAzC;;AAEA;;AAEAg6B,QAAI5sC,IAAJ,CAAUqgB,KAAK+2B,KAAf;AACAxK,QAAI5sC,IAAJ,CAAU,IAAMsgB,KAAK+2B,KAArB;;AAEA;;AAEAQ,qBAAiB,CAAjB;AAEA;AAED;;AAED;;AAEA;AACA;AACA;;AAEA,OAAMv3B,KAAK,CAAX,EAAcA,KAAK+2B,KAAnB,EAA0B/2B,IAA1B,EAAkC;;AAEjC,QAAMD,KAAK,CAAX,EAAcA,KAAK+2B,KAAnB,EAA0B/2B,IAA1B,EAAkC;;AAEjC,QAAIzS,IAAImpC,mBAAmB12B,EAAnB,GAAwBs3B,SAASr3B,EAAzC;AACA,QAAIzS,IAAIkpC,mBAAmB12B,EAAnB,GAAwBs3B,UAAWr3B,KAAK,CAAhB,CAAhC;AACA,QAAI1P,IAAImmC,oBAAqB12B,KAAK,CAA1B,IAAgCs3B,UAAWr3B,KAAK,CAAhB,CAAxC;AACA,QAAIjN,IAAI0jC,oBAAqB12B,KAAK,CAA1B,IAAgCs3B,SAASr3B,EAAjD;;AAEA;;AAEAmsB,YAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBwF,CAApB;AACAo5B,YAAQzsC,IAAR,CAAc6N,CAAd,EAAiB+C,CAAjB,EAAoByC,CAApB;;AAEA;;AAEAykC,kBAAc,CAAd;AAEA;AAED;;AAED;;AAEAluB,QAAMorB,QAAN,CAAgBgC,UAAhB,EAA4Bc,UAA5B,EAAwChN,aAAxC;;AAEA;;AAEAkM,gBAAcc,UAAd;;AAEA;;AAEAf,sBAAoBc,aAApB;AAEA;AAED;;AAEDf,kBAAkBt4C,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAA9B;AACAs4C,kBAAkBt4C,SAAlB,CAA4B0O,WAA5B,GAA0C4pC,iBAA1C;;AAEA;;;;;AAKA;;AAEA,SAASiB,aAAT,CAAwB1yB,KAAxB,EAA+BC,MAA/B,EAAuCqxB,aAAvC,EAAsDC,cAAtD,EAAuE;;AAEtE1L,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,eAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB5jB,SAAOA,KADU;AAEjBC,UAAQA,MAFS;AAGjBqxB,iBAAeA,aAHE;AAIjBC,kBAAgBA;AAJC,EAAlB;;AAOA,MAAKpK,kBAAL,CAAyB,IAAIwL,mBAAJ,CAAyB3yB,KAAzB,EAAgCC,MAAhC,EAAwCqxB,aAAxC,EAAuDC,cAAvD,CAAzB;AACA,MAAKnH,aAAL;AAEA;;AAEDsI,cAAcv5C,SAAd,GAA0BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA1B;AACAu5C,cAAcv5C,SAAd,CAAwB0O,WAAxB,GAAsC6qC,aAAtC;;AAEA;;AAEA,SAASC,mBAAT,CAA8B3yB,KAA9B,EAAqCC,MAArC,EAA6CqxB,aAA7C,EAA4DC,cAA5D,EAA6E;;AAE5EpC,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,qBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB5jB,SAAOA,KADU;AAEjBC,UAAQA,MAFS;AAGjBqxB,iBAAeA,aAHE;AAIjBC,kBAAgBA;AAJC,EAAlB;;AAOAvxB,SAAQA,SAAS,CAAjB;AACAC,UAASA,UAAU,CAAnB;;AAEA,KAAI2yB,aAAa5yB,QAAQ,CAAzB;AACA,KAAI6yB,cAAc5yB,SAAS,CAA3B;;AAEA,KAAI8xB,QAAQr5C,KAAKK,KAAL,CAAYu4C,aAAZ,KAA+B,CAA3C;AACA,KAAIU,QAAQt5C,KAAKK,KAAL,CAAYw4C,cAAZ,KAAgC,CAA5C;;AAEA,KAAIe,SAASP,QAAQ,CAArB;AACA,KAAIQ,SAASP,QAAQ,CAArB;;AAEA,KAAIc,gBAAgB9yB,QAAQ+xB,KAA5B;AACA,KAAIgB,iBAAiB9yB,SAAS+xB,KAA9B;;AAEA,KAAIh3B,EAAJ,EAAQC,EAAR;;AAEA;;AAEA,KAAImsB,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;;AAEA;;AAEA,MAAMtsB,KAAK,CAAX,EAAcA,KAAKs3B,MAAnB,EAA2Bt3B,IAA3B,EAAmC;;AAElC,MAAIpV,IAAIoV,KAAK83B,cAAL,GAAsBF,WAA9B;;AAEA,OAAM73B,KAAK,CAAX,EAAcA,KAAKs3B,MAAnB,EAA2Bt3B,IAA3B,EAAmC;;AAElC,OAAI/hB,IAAI+hB,KAAK83B,aAAL,GAAqBF,UAA7B;;AAEAhuB,YAASjqB,IAAT,CAAe1B,CAAf,EAAkB,CAAE4M,CAApB,EAAuB,CAAvB;;AAEAyhC,WAAQ3sC,IAAR,CAAc,CAAd,EAAiB,CAAjB,EAAoB,CAApB;;AAEA4sC,OAAI5sC,IAAJ,CAAUqgB,KAAK+2B,KAAf;AACAxK,OAAI5sC,IAAJ,CAAU,IAAMsgB,KAAK+2B,KAArB;AAEA;AAED;;AAED;;AAEA,MAAM/2B,KAAK,CAAX,EAAcA,KAAK+2B,KAAnB,EAA0B/2B,IAA1B,EAAkC;;AAEjC,OAAMD,KAAK,CAAX,EAAcA,KAAK+2B,KAAnB,EAA0B/2B,IAA1B,EAAkC;;AAEjC,OAAIzS,IAAIyS,KAAKs3B,SAASr3B,EAAtB;AACA,OAAIzS,IAAIwS,KAAKs3B,UAAWr3B,KAAK,CAAhB,CAAb;AACA,OAAI1P,IAAMyP,KAAK,CAAP,GAAas3B,UAAWr3B,KAAK,CAAhB,CAArB;AACA,OAAIjN,IAAMgN,KAAK,CAAP,GAAas3B,SAASr3B,EAA9B;;AAEA;;AAEAmsB,WAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBwF,CAApB;AACAo5B,WAAQzsC,IAAR,CAAc6N,CAAd,EAAiB+C,CAAjB,EAAoByC,CAApB;AAEA;AAED;;AAED;;AAEA,MAAKuhC,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;AAEA;;AAEDoL,oBAAoBx5C,SAApB,GAAgCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAAhC;AACAw5C,oBAAoBx5C,SAApB,CAA8B0O,WAA9B,GAA4C8qC,mBAA5C;;AAEA;;;;;AAKA,IAAIK,aAAa,CAAjB;;AAEA,SAASC,QAAT,GAAoB;;AAEnB75C,QAAOC,cAAP,CAAuB,IAAvB,EAA6B,IAA7B,EAAmC,EAAER,OAAOm6C,YAAT,EAAnC;;AAEA,MAAKjuC,IAAL,GAAYX,MAAMI,YAAN,EAAZ;;AAEA,MAAKga,IAAL,GAAY,EAAZ;AACA,MAAKlkB,IAAL,GAAY,UAAZ;;AAEA,MAAK49B,GAAL,GAAW,IAAX;AACA,MAAKK,MAAL,GAAc,IAAd;;AAEA,MAAK2a,QAAL,GAAgBr2C,cAAhB;AACA,MAAKs2C,IAAL,GAAY/2C,SAAZ;AACA,MAAKg3C,WAAL,GAAmB,KAAnB;AACA,MAAKzN,YAAL,GAAoBlpC,QAApB,CAfmB,CAeW;;AAE9B,MAAKq5B,OAAL,GAAe,CAAf;AACA,MAAKud,WAAL,GAAmB,KAAnB;;AAEA,MAAKC,QAAL,GAAgB31C,cAAhB;AACA,MAAK41C,QAAL,GAAgB31C,sBAAhB;AACA,MAAK41C,aAAL,GAAqBt2C,WAArB;AACA,MAAKu2C,aAAL,GAAqB,IAArB;AACA,MAAKC,aAAL,GAAqB,IAArB;AACA,MAAKC,kBAAL,GAA0B,IAA1B;;AAEA,MAAKC,SAAL,GAAiBv1C,cAAjB;AACA,MAAKw1C,SAAL,GAAiB,IAAjB;AACA,MAAKC,UAAL,GAAkB,IAAlB;;AAEA,MAAKC,cAAL,GAAsB,IAAtB;AACA,MAAKC,gBAAL,GAAwB,KAAxB;AACA,MAAKC,WAAL,GAAmB,KAAnB;;AAEA,MAAKC,UAAL,GAAkB,IAAlB;;AAEA,MAAKC,UAAL,GAAkB,IAAlB;;AAEA,MAAK1J,SAAL,GAAiB,IAAjB,CAvCmB,CAuCI;;AAEvB,MAAK2J,aAAL,GAAqB,KAArB;AACA,MAAKC,mBAAL,GAA2B,CAA3B;AACA,MAAKC,kBAAL,GAA0B,CAA1B;;AAEA,MAAKC,SAAL,GAAiB,KAAjB;;AAEA,MAAKC,SAAL,GAAiB,CAAjB;AACA,MAAKC,kBAAL,GAA0B,KAA1B;;AAEA,MAAKC,QAAL,GAAgB,CAAhB,CAlDmB,CAkDA;;AAEnB,MAAK9T,OAAL,GAAe,IAAf;;AAEA,MAAKK,QAAL,GAAgB,EAAhB;;AAEA,MAAK6O,WAAL,GAAmB,IAAnB;AAEA;;AAEDmD,SAAS95C,SAAT,GAAqBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAehlB,gBAAgBjB,SAA/B,CAAf,EAA2D;;AAE/E0O,cAAaorC,QAFkE;;AAI/E0B,aAAY,IAJmE;;AAM/EC,kBAAiB,YAAY,CAAE,CANgD;;AAQ/EC,YAAW,UAAW3Q,MAAX,EAAoB;;AAE9B,MAAKA,WAAWzrC,SAAhB,EAA4B;;AAE5B,OAAM,IAAI0rC,GAAV,IAAiBD,MAAjB,EAA0B;;AAEzB,OAAI4Q,WAAW5Q,OAAQC,GAAR,CAAf;;AAEA,OAAK2Q,aAAar8C,SAAlB,EAA8B;;AAE7ByP,YAAQC,IAAR,CAAc,sBAAsBg8B,GAAtB,GAA4B,2BAA1C;AACA;AAEA;;AAED;AACA,OAAKA,QAAQ,SAAb,EAAyB;;AAExBj8B,YAAQC,IAAR,CAAc,WAAW,KAAK7N,IAAhB,GAAuB,oEAArC;AACA,SAAK84C,WAAL,GAAqB0B,aAAav4C,WAAf,GAA+B,IAA/B,GAAsC,KAAzD;AACA;AAEA;;AAED,OAAIw4C,eAAe,KAAM5Q,GAAN,CAAnB;;AAEA,OAAK4Q,iBAAiBt8C,SAAtB,EAAkC;;AAEjCyP,YAAQC,IAAR,CAAc,WAAW,KAAK7N,IAAhB,GAAuB,KAAvB,GAA+B6pC,GAA/B,GAAqC,uCAAnD;AACA;AAEA;;AAED,OAAK4Q,gBAAgBA,aAAazhB,OAAlC,EAA4C;;AAE3CyhB,iBAAa5tC,GAAb,CAAkB2tC,QAAlB;AAEA,IAJD,MAIO,IAAOC,gBAAgBA,aAAaz6B,SAA/B,IAAgDw6B,YAAYA,SAASx6B,SAA1E,EAAwF;;AAE9Fy6B,iBAAajtC,IAAb,CAAmBgtC,QAAnB;AAEA,IAJM,MAIA,IAAK3Q,QAAQ,UAAb,EAA0B;;AAEhC;AACA,SAAMA,GAAN,IAAc5rC,OAAQu8C,QAAR,CAAd;AAEA,IALM,MAKA;;AAEN,SAAM3Q,GAAN,IAAc2Q,QAAd;AAEA;AAED;AAED,EA9D8E;;AAgE/Ev1B,SAAQ,UAAWC,IAAX,EAAkB;;AAEzB,MAAIw1B,SAAWx1B,SAAS/mB,SAAT,IAAsB,OAAO+mB,IAAP,KAAgB,QAArD;;AAEA,MAAKw1B,MAAL,EAAc;;AAEbx1B,UAAO;AACNE,cAAU,EADJ;AAENiB,YAAQ;AAFF,IAAP;AAKA;;AAED,MAAI6B,OAAO;AACVhC,aAAU;AACTtB,aAAS,GADA;AAET5kB,UAAM,UAFG;AAGTmmB,eAAW;AAHF;AADA,GAAX;;AAQA;AACA+B,OAAKzd,IAAL,GAAY,KAAKA,IAAjB;AACAyd,OAAKloB,IAAL,GAAY,KAAKA,IAAjB;;AAEA,MAAK,KAAKkkB,IAAL,KAAc,EAAnB,EAAwBgE,KAAKhE,IAAL,GAAY,KAAKA,IAAjB;;AAExB,MAAK,KAAK8V,KAAL,IAAc,KAAKA,KAAL,CAAWhB,OAA9B,EAAwC9Q,KAAK8R,KAAL,GAAa,KAAKA,KAAL,CAAWU,MAAX,EAAb;;AAExC,MAAK,KAAK0F,SAAL,KAAmBjiC,SAAxB,EAAoC+pB,KAAKkY,SAAL,GAAiB,KAAKA,SAAtB;AACpC,MAAK,KAAKC,SAAL,KAAmBliC,SAAxB,EAAoC+pB,KAAKmY,SAAL,GAAiB,KAAKA,SAAtB;;AAEpC,MAAK,KAAKN,QAAL,IAAiB,KAAKA,QAAL,CAAc/G,OAApC,EAA8C9Q,KAAK6X,QAAL,GAAgB,KAAKA,QAAL,CAAcrF,MAAd,EAAhB;AAC9C,MAAK,KAAKigB,iBAAL,KAA2B,CAAhC,EAAoCzyB,KAAKyyB,iBAAL,GAAyB,KAAKA,iBAA9B;;AAEpC,MAAK,KAAK1a,QAAL,IAAiB,KAAKA,QAAL,CAAcjH,OAApC,EAA8C9Q,KAAK+X,QAAL,GAAgB,KAAKA,QAAL,CAAcvF,MAAd,EAAhB;AAC9C,MAAK,KAAKwF,SAAL,KAAmB/hC,SAAxB,EAAoC+pB,KAAKgY,SAAL,GAAiB,KAAKA,SAAtB;AACpC,MAAK,KAAKmB,SAAL,KAAmBljC,SAAxB,EAAoC+pB,KAAKmZ,SAAL,GAAiB,KAAKA,SAAtB;AACpC,MAAK,KAAKC,kBAAL,KAA4BnjC,SAAjC,EAA6C+pB,KAAKoZ,kBAAL,GAA0B,KAAKA,kBAA/B;;AAE7C,MAAK,KAAK7F,GAAL,IAAY,KAAKA,GAAL,CAAS1W,SAA1B,EAAsCmD,KAAKuT,GAAL,GAAW,KAAKA,GAAL,CAASxW,MAAT,CAAiBC,IAAjB,EAAwBza,IAAnC;AACtC,MAAK,KAAKkxB,QAAL,IAAiB,KAAKA,QAAL,CAAc5W,SAApC,EAAgDmD,KAAKyT,QAAL,GAAgB,KAAKA,QAAL,CAAc1W,MAAd,CAAsBC,IAAtB,EAA6Bza,IAA7C;AAChD,MAAK,KAAK+xB,QAAL,IAAiB,KAAKA,QAAL,CAAczX,SAApC,EAAgDmD,KAAKsU,QAAL,GAAgB,KAAKA,QAAL,CAAcvX,MAAd,CAAsBC,IAAtB,EAA6Bza,IAA7C;;AAEhD,MAAK,KAAK4xB,KAAL,IAAc,KAAKA,KAAL,CAAWtX,SAA9B,EAA0C;;AAEzCmD,QAAKmU,KAAL,GAAa,KAAKA,KAAL,CAAWpX,MAAX,CAAmBC,IAAnB,EAA0Bza,IAAvC;AACAyd,QAAKoU,cAAL,GAAsB,KAAKA,cAA3B;AAEA;;AAED,MAAK,KAAKO,OAAL,IAAgB,KAAKA,OAAL,CAAa9X,SAAlC,EAA8C;;AAE7CmD,QAAK2U,OAAL,GAAe,KAAKA,OAAL,CAAa5X,MAAb,CAAqBC,IAArB,EAA4Bza,IAA3C;AACAyd,QAAK4U,SAAL,GAAiB,KAAKA,SAAtB;AAEA;;AAED,MAAK,KAAKE,SAAL,IAAkB,KAAKA,SAAL,CAAejY,SAAtC,EAAkD;;AAEjDmD,QAAK8U,SAAL,GAAiB,KAAKA,SAAL,CAAe/X,MAAf,CAAuBC,IAAvB,EAA8Bza,IAA/C;AACAyd,QAAK+U,WAAL,GAAmB,KAAKA,WAAL,CAAiBvsB,OAAjB,EAAnB;AAEA;;AAED,MAAK,KAAKysB,eAAL,IAAwB,KAAKA,eAAL,CAAqBpY,SAAlD,EAA8D;;AAE7DmD,QAAKiV,eAAL,GAAuB,KAAKA,eAAL,CAAqBlY,MAArB,CAA6BC,IAA7B,EAAoCza,IAA3D;AACAyd,QAAKkV,iBAAL,GAAyB,KAAKA,iBAA9B;AACAlV,QAAKmV,gBAAL,GAAwB,KAAKA,gBAA7B;AAEA;;AAED,MAAK,KAAKE,YAAL,IAAqB,KAAKA,YAAL,CAAkBxY,SAA5C,EAAwDmD,KAAKqV,YAAL,GAAoB,KAAKA,YAAL,CAAkBtY,MAAlB,CAA0BC,IAA1B,EAAiCza,IAArD;AACxD,MAAK,KAAKgzB,YAAL,IAAqB,KAAKA,YAAL,CAAkB1Y,SAA5C,EAAwDmD,KAAKuV,YAAL,GAAoB,KAAKA,YAAL,CAAkBxY,MAAlB,CAA0BC,IAA1B,EAAiCza,IAArD;;AAExD,MAAK,KAAKkyB,WAAL,IAAoB,KAAKA,WAAL,CAAiB5X,SAA1C,EAAsDmD,KAAKyU,WAAL,GAAmB,KAAKA,WAAL,CAAiB1X,MAAjB,CAAyBC,IAAzB,EAAgCza,IAAnD;AACtD,MAAK,KAAKoxB,WAAL,IAAoB,KAAKA,WAAL,CAAiB9W,SAA1C,EAAsDmD,KAAK2T,WAAL,GAAmB,KAAKA,WAAL,CAAiB5W,MAAjB,CAAyBC,IAAzB,EAAgCza,IAAnD;;AAEtD,MAAK,KAAKsxB,MAAL,IAAe,KAAKA,MAAL,CAAYhX,SAAhC,EAA4C;;AAE3CmD,QAAK6T,MAAL,GAAc,KAAKA,MAAL,CAAY9W,MAAZ,CAAoBC,IAApB,EAA2Bza,IAAzC;AACAyd,QAAK+T,YAAL,GAAoB,KAAKA,YAAzB,CAH2C,CAGJ;AAEvC;;AAED,MAAK,KAAK0B,WAAL,IAAoB,KAAKA,WAAL,CAAiB5Y,SAA1C,EAAsD;;AAErDmD,QAAKyV,WAAL,GAAmB,KAAKA,WAAL,CAAiB1Y,MAAjB,CAAyBC,IAAzB,EAAgCza,IAAnD;AAEA;;AAED,MAAK,KAAK4e,IAAL,KAAclrB,SAAnB,EAA+B+pB,KAAKmB,IAAL,GAAY,KAAKA,IAAjB;AAC/B,MAAK,KAAKuxB,eAAL,KAAyBz8C,SAA9B,EAA0C+pB,KAAK0yB,eAAL,GAAuB,KAAKA,eAA5B;;AAE1C,MAAK,KAAKhC,QAAL,KAAkBr2C,cAAvB,EAAwC2lB,KAAK0wB,QAAL,GAAgB,KAAKA,QAArB;AACxC,MAAK,KAAKE,WAAL,KAAqB,IAA1B,EAAiC5wB,KAAK4wB,WAAL,GAAmB,KAAKA,WAAxB;AACjC,MAAK,KAAKD,IAAL,KAAc/2C,SAAnB,EAA+BomB,KAAK2wB,IAAL,GAAY,KAAKA,IAAjB;AAC/B,MAAK,KAAKxN,YAAL,KAAsBlpC,QAA3B,EAAsC+lB,KAAKmjB,YAAL,GAAoB,KAAKA,YAAzB;;AAEtC,MAAK,KAAK7P,OAAL,GAAe,CAApB,EAAwBtT,KAAKsT,OAAL,GAAe,KAAKA,OAApB;AACxB,MAAK,KAAKud,WAAL,KAAqB,IAA1B,EAAiC7wB,KAAK6wB,WAAL,GAAmB,KAAKA,WAAxB;;AAEjC7wB,OAAKoxB,SAAL,GAAiB,KAAKA,SAAtB;AACApxB,OAAKqxB,SAAL,GAAiB,KAAKA,SAAtB;AACArxB,OAAKsxB,UAAL,GAAkB,KAAKA,UAAvB;;AAEA;AACA,MAAK,KAAKt2B,QAAL,KAAkB,CAAvB,EAA2BgF,KAAKhF,QAAL,GAAgB,KAAKA,QAArB;;AAE3B,MAAK,KAAK23B,SAAL,KAAmB,CAAxB,EAA4B3yB,KAAK2yB,SAAL,GAAiB,KAAKA,SAAtB;AAC5B,MAAK,KAAKra,QAAL,KAAkBriC,SAAvB,EAAmC+pB,KAAKsY,QAAL,GAAgB,KAAKA,QAArB;AACnC,MAAK,KAAKsa,OAAL,KAAiB38C,SAAtB,EAAkC+pB,KAAK4yB,OAAL,GAAe,KAAKA,OAApB;AAClC,MAAK,KAAKxiC,KAAL,KAAena,SAApB,EAAgC+pB,KAAK5P,KAAL,GAAa,KAAKA,KAAlB;;AAEhC,MAAK,KAAK2hC,SAAL,KAAmB,IAAxB,EAA+B/xB,KAAK+xB,SAAL,GAAiB,IAAjB;;AAE/B,MAAK,KAAKC,SAAL,GAAiB,CAAtB,EAA0BhyB,KAAKgyB,SAAL,GAAiB,KAAKA,SAAtB;AAC1B,MAAK,KAAKC,kBAAL,KAA4B,IAAjC,EAAwCjyB,KAAKiyB,kBAAL,GAA0B,KAAKA,kBAA/B;;AAExC,MAAK,KAAKY,SAAL,KAAmB,IAAxB,EAA+B7yB,KAAK6yB,SAAL,GAAiB,KAAKA,SAAtB;AAC/B,MAAK,KAAKC,kBAAL,GAA0B,CAA/B,EAAmC9yB,KAAK8yB,kBAAL,GAA0B,KAAKA,kBAA/B;AACnC,MAAK,KAAKC,gBAAL,KAA0B,OAA/B,EAAyC/yB,KAAK+yB,gBAAL,GAAwB,KAAKA,gBAA7B;AACzC,MAAK,KAAKC,iBAAL,KAA2B,OAAhC,EAA0ChzB,KAAKgzB,iBAAL,GAAyB,KAAKA,iBAA9B;;AAE1C,MAAK,KAAKvP,YAAL,KAAsB,IAA3B,EAAkCzjB,KAAKyjB,YAAL,GAAoB,IAApB;AAClC,MAAK,KAAKwP,QAAL,KAAkB,IAAvB,EAA8BjzB,KAAKizB,QAAL,GAAgB,IAAhB;;AAE9B,MAAK,KAAK7U,OAAL,KAAiB,KAAtB,EAA8Bpe,KAAKoe,OAAL,GAAe,KAAf;AAC9B,MAAK2C,KAAKC,SAAL,CAAgB,KAAKvC,QAArB,MAAoC,IAAzC,EAAgDze,KAAKye,QAAL,GAAgB,KAAKA,QAArB;;AAEhD;;AAEA,WAAS+C,gBAAT,CAA2BC,KAA3B,EAAmC;;AAElC,OAAIC,SAAS,EAAb;;AAEA,QAAM,IAAIC,GAAV,IAAiBF,KAAjB,EAAyB;;AAExB,QAAIzhB,OAAOyhB,MAAOE,GAAP,CAAX;AACA,WAAO3hB,KAAKhC,QAAZ;AACA0jB,WAAOvpC,IAAP,CAAa6nB,IAAb;AAEA;;AAED,UAAO0hB,MAAP;AAEA;;AAED,MAAK8Q,MAAL,EAAc;;AAEb,OAAIt1B,WAAWskB,iBAAkBxkB,KAAKE,QAAvB,CAAf;AACA,OAAIiB,SAASqjB,iBAAkBxkB,KAAKmB,MAAvB,CAAb;;AAEA,OAAKjB,SAAS3lB,MAAT,GAAkB,CAAvB,EAA2ByoB,KAAK9C,QAAL,GAAgBA,QAAhB;AAC3B,OAAKiB,OAAO5mB,MAAP,GAAgB,CAArB,EAAyByoB,KAAK7B,MAAL,GAAcA,MAAd;AAEzB;;AAED,SAAO6B,IAAP;AAEA,EAjO8E;;AAmO/E5a,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EAvO8E;;AAyO/EA,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB,OAAKwkB,IAAL,GAAYxkB,OAAOwkB,IAAnB;;AAEA,OAAK0Z,GAAL,GAAWl+B,OAAOk+B,GAAlB;AACA,OAAKK,MAAL,GAAcv+B,OAAOu+B,MAArB;;AAEA,OAAK2a,QAAL,GAAgBl5C,OAAOk5C,QAAvB;AACA,OAAKC,IAAL,GAAYn5C,OAAOm5C,IAAnB;AACA,OAAKC,WAAL,GAAmBp5C,OAAOo5C,WAA1B;AACA,OAAKzN,YAAL,GAAoB3rC,OAAO2rC,YAA3B;;AAEA,OAAK7P,OAAL,GAAe97B,OAAO87B,OAAtB;AACA,OAAKud,WAAL,GAAmBr5C,OAAOq5C,WAA1B;;AAEA,OAAKC,QAAL,GAAgBt5C,OAAOs5C,QAAvB;AACA,OAAKC,QAAL,GAAgBv5C,OAAOu5C,QAAvB;AACA,OAAKC,aAAL,GAAqBx5C,OAAOw5C,aAA5B;AACA,OAAKC,aAAL,GAAqBz5C,OAAOy5C,aAA5B;AACA,OAAKC,aAAL,GAAqB15C,OAAO05C,aAA5B;AACA,OAAKC,kBAAL,GAA0B35C,OAAO25C,kBAAjC;;AAEA,OAAKC,SAAL,GAAiB55C,OAAO45C,SAAxB;AACA,OAAKC,SAAL,GAAiB75C,OAAO65C,SAAxB;AACA,OAAKC,UAAL,GAAkB95C,OAAO85C,UAAzB;;AAEA,OAAKK,UAAL,GAAkBn6C,OAAOm6C,UAAzB;;AAEA,OAAK1J,SAAL,GAAiBzwC,OAAOywC,SAAxB;;AAEA,OAAK2J,aAAL,GAAqBp6C,OAAOo6C,aAA5B;AACA,OAAKC,mBAAL,GAA2Br6C,OAAOq6C,mBAAlC;AACA,OAAKC,kBAAL,GAA0Bt6C,OAAOs6C,kBAAjC;;AAEA,OAAKC,SAAL,GAAiBv6C,OAAOu6C,SAAxB;;AAEA,OAAKC,SAAL,GAAiBx6C,OAAOw6C,SAAxB;AACA,OAAKC,kBAAL,GAA0Bz6C,OAAOy6C,kBAAjC;;AAEA,OAAKC,QAAL,GAAgB16C,OAAO06C,QAAvB;;AAEA,OAAK9T,OAAL,GAAe5mC,OAAO4mC,OAAtB;AACA,OAAKK,QAAL,GAAgBsC,KAAKc,KAAL,CAAYd,KAAKC,SAAL,CAAgBxpC,OAAOinC,QAAvB,CAAZ,CAAhB;;AAEA,OAAKgT,WAAL,GAAmBj6C,OAAOi6C,WAA1B;AACA,OAAKD,gBAAL,GAAwBh6C,OAAOg6C,gBAA/B;;AAEA,MAAI0B,YAAY17C,OAAO+5C,cAAvB;AAAA,MACC4B,YAAY,IADb;;AAGA,MAAKD,cAAc,IAAnB,EAA0B;;AAEzB,OAAIrwC,IAAIqwC,UAAU37C,MAAlB;AACA47C,eAAY,IAAIpiB,KAAJ,CAAWluB,CAAX,CAAZ;;AAEA,QAAM,IAAIjK,IAAI,CAAd,EAAiBA,MAAMiK,CAAvB,EAA0B,EAAGjK,CAA7B,EACCu6C,UAAWv6C,CAAX,IAAiBs6C,UAAWt6C,CAAX,EAAewM,KAAf,EAAjB;AAED;;AAED,OAAKmsC,cAAL,GAAsB4B,SAAtB;;AAEA,OAAKzB,UAAL,GAAkBl6C,OAAOk6C,UAAzB;;AAEA,SAAO,IAAP;AAEA,EA3S8E;;AA6S/ErzB,UAAS,YAAY;;AAEpB,OAAK7lB,aAAL,CAAoB,EAAEV,MAAM,SAAR,EAApB;AAEA;;AAjT8E,CAA3D,CAArB;;AAqTA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,SAASs7C,iBAAT,CAA4BhS,UAA5B,EAAyC;;AAExCqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,mBAAZ;;AAEA,MAAKg6B,KAAL,GAAa,IAAIZ,KAAJ,CAAW,QAAX,CAAb,CANwC,CAMJ;;AAEpC,MAAKqC,GAAL,GAAW,IAAX;;AAEA,MAAKe,QAAL,GAAgB,IAAhB;AACA,MAAKC,iBAAL,GAAyB,GAAzB;;AAEA,MAAKJ,KAAL,GAAa,IAAb;AACA,MAAKC,cAAL,GAAsB,GAAtB;;AAEA,MAAKT,WAAL,GAAmB,IAAnB;;AAEA,MAAKF,QAAL,GAAgB,IAAhB;;AAEA,MAAKI,MAAL,GAAc,IAAd;AACA,MAAKwf,OAAL,GAAen3C,iBAAf;AACA,MAAK63B,YAAL,GAAoB,CAApB;AACA,MAAKC,eAAL,GAAuB,IAAvB;;AAEA,MAAK6e,SAAL,GAAiB,KAAjB;AACA,MAAKC,kBAAL,GAA0B,CAA1B;AACA,MAAKC,gBAAL,GAAwB,OAAxB;AACA,MAAKC,iBAAL,GAAyB,OAAzB;;AAEA,MAAKC,QAAL,GAAgB,KAAhB;AACA,MAAKxP,YAAL,GAAoB,KAApB;;AAEA,MAAK1N,MAAL,GAAc,KAAd;;AAEA,MAAKsc,SAAL,CAAgBjR,UAAhB;AAEA;;AAEDgS,kBAAkBz8C,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAA9B;AACAy8C,kBAAkBz8C,SAAlB,CAA4B0O,WAA5B,GAA0C+tC,iBAA1C;;AAEAA,kBAAkBz8C,SAAlB,CAA4B28C,mBAA5B,GAAkD,IAAlD;;AAEAF,kBAAkBz8C,SAAlB,CAA4B2O,IAA5B,GAAmC,UAAW9N,MAAX,EAAoB;;AAEtDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKs6B,KAAL,CAAWxsB,IAAX,CAAiB9N,OAAOs6B,KAAxB;;AAEA,MAAKyB,GAAL,GAAW/7B,OAAO+7B,GAAlB;;AAEA,MAAKe,QAAL,GAAgB98B,OAAO88B,QAAvB;AACA,MAAKC,iBAAL,GAAyB/8B,OAAO+8B,iBAAhC;;AAEA,MAAKJ,KAAL,GAAa38B,OAAO28B,KAApB;AACA,MAAKC,cAAL,GAAsB58B,OAAO48B,cAA7B;;AAEA,MAAKT,WAAL,GAAmBn8B,OAAOm8B,WAA1B;;AAEA,MAAKF,QAAL,GAAgBj8B,OAAOi8B,QAAvB;;AAEA,MAAKI,MAAL,GAAcr8B,OAAOq8B,MAArB;AACA,MAAKwf,OAAL,GAAe77C,OAAO67C,OAAtB;AACA,MAAKtf,YAAL,GAAoBv8B,OAAOu8B,YAA3B;AACA,MAAKC,eAAL,GAAuBx8B,OAAOw8B,eAA9B;;AAEA,MAAK6e,SAAL,GAAiBr7C,OAAOq7C,SAAxB;AACA,MAAKC,kBAAL,GAA0Bt7C,OAAOs7C,kBAAjC;AACA,MAAKC,gBAAL,GAAwBv7C,OAAOu7C,gBAA/B;AACA,MAAKC,iBAAL,GAAyBx7C,OAAOw7C,iBAAhC;;AAEA,MAAKC,QAAL,GAAgBz7C,OAAOy7C,QAAvB;AACA,MAAKxP,YAAL,GAAoBjsC,OAAOisC,YAA3B;;AAEA,QAAO,IAAP;AAEA,CAjCD;;AAmCA;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAS8P,cAAT,CAAyBnS,UAAzB,EAAsC;;AAErCqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,gBAAZ;;AAEA,MAAK07C,OAAL,GAAe,EAAf;AACA,MAAKhjB,QAAL,GAAgB,EAAhB;;AAEA,MAAKkH,YAAL,GAAoB,+FAApB;AACA,MAAKC,cAAL,GAAsB,gEAAtB;;AAEA,MAAKgb,SAAL,GAAiB,CAAjB;;AAEA,MAAKE,SAAL,GAAiB,KAAjB;AACA,MAAKC,kBAAL,GAA0B,CAA1B;;AAEA,MAAKpd,GAAL,GAAW,KAAX,CAjBqC,CAiBnB;AAClB,MAAKK,MAAL,GAAc,KAAd,CAlBqC,CAkBhB;AACrB,MAAK0d,QAAL,GAAgB,KAAhB,CAnBqC,CAmBd;;AAEvB,MAAKR,QAAL,GAAgB,KAAhB,CArBqC,CAqBd;AACvB,MAAKxP,YAAL,GAAoB,KAApB,CAtBqC,CAsBV;AAC3B,MAAKC,YAAL,GAAoB,KAApB,CAvBqC,CAuBV;;AAE3B,MAAKgQ,UAAL,GAAkB;AACjBC,eAAa,KADI,EACG;AACpBC,aAAW,KAFM,EAEC;AAClBC,eAAa,KAHI,EAGG;AACpBC,oBAAkB,KAJD,CAIO;AAJP,EAAlB;;AAOA;AACA;AACA,MAAKC,sBAAL,GAA8B;AAC7B,WAAS,CAAE,CAAF,EAAK,CAAL,EAAQ,CAAR,CADoB;AAE7B,QAAM,CAAE,CAAF,EAAK,CAAL,CAFuB;AAG7B,SAAO,CAAE,CAAF,EAAK,CAAL;AAHsB,EAA9B;;AAMA,MAAKC,mBAAL,GAA2B/9C,SAA3B;AACA,MAAKg+C,kBAAL,GAA0B,KAA1B;;AAEA,KAAK7S,eAAenrC,SAApB,EAAgC;;AAE/B,MAAKmrC,WAAW9e,UAAX,KAA0BrsB,SAA/B,EAA2C;;AAE1CyP,WAAQyD,KAAR,CAAe,yFAAf;AAEA;;AAED,OAAKkpC,SAAL,CAAgBjR,UAAhB;AAEA;AAED;;AAEDmS,eAAe58C,SAAf,GAA2BC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAA3B;AACA48C,eAAe58C,SAAf,CAAyB0O,WAAzB,GAAuCkuC,cAAvC;;AAEAA,eAAe58C,SAAf,CAAyBu9C,gBAAzB,GAA4C,IAA5C;;AAEAX,eAAe58C,SAAf,CAAyB2O,IAAzB,GAAgC,UAAW9N,MAAX,EAAoB;;AAEnDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKmgC,cAAL,GAAsBngC,OAAOmgC,cAA7B;AACA,MAAKD,YAAL,GAAoBlgC,OAAOkgC,YAA3B;;AAEA,MAAKlH,QAAL,GAAgBF,cAAclrB,KAAd,CAAqB5N,OAAOg5B,QAA5B,CAAhB;;AAEA,MAAKgjB,OAAL,GAAe58C,OAAOK,MAAP,CAAe,EAAf,EAAmBO,OAAOg8C,OAA1B,CAAf;;AAEA,MAAKX,SAAL,GAAiBr7C,OAAOq7C,SAAxB;AACA,MAAKC,kBAAL,GAA0Bt7C,OAAOs7C,kBAAjC;;AAEA,MAAK/c,MAAL,GAAcv+B,OAAOu+B,MAArB;AACA,MAAK0d,QAAL,GAAgBj8C,OAAOi8C,QAAvB;;AAEA,MAAKR,QAAL,GAAgBz7C,OAAOy7C,QAAvB;;AAEA,MAAKxP,YAAL,GAAoBjsC,OAAOisC,YAA3B;AACA,MAAKC,YAAL,GAAoBlsC,OAAOksC,YAA3B;;AAEA,MAAKgQ,UAAL,GAAkBl8C,OAAOk8C,UAAzB;;AAEA,QAAO,IAAP;AAEA,CA1BD;;AA4BAH,eAAe58C,SAAf,CAAyBomB,MAAzB,GAAkC,UAAWC,IAAX,EAAkB;;AAEnD,KAAIgD,OAAOywB,SAAS95C,SAAT,CAAmBomB,MAAnB,CAA0BplB,IAA1B,CAAgC,IAAhC,EAAsCqlB,IAAtC,CAAX;;AAEAgD,MAAKwQ,QAAL,GAAgB,KAAKA,QAArB;AACAxQ,MAAK0X,YAAL,GAAoB,KAAKA,YAAzB;AACA1X,MAAK2X,cAAL,GAAsB,KAAKA,cAA3B;;AAEA,QAAO3X,IAAP;AAEA,CAVD;;AAYA;;;;AAIA,SAASm0B,GAAT,CAAcC,MAAd,EAAsB3tB,SAAtB,EAAkC;;AAEjC,MAAK2tB,MAAL,GAAgBA,WAAWn+C,SAAb,GAA2Bm+C,MAA3B,GAAoC,IAAInpC,OAAJ,EAAlD;AACA,MAAKwb,SAAL,GAAmBA,cAAcxwB,SAAhB,GAA8BwwB,SAA9B,GAA0C,IAAIxb,OAAJ,EAA3D;AAEA;;AAEDrU,OAAOK,MAAP,CAAek9C,IAAIx9C,SAAnB,EAA8B;;AAE7BgO,MAAK,UAAWyvC,MAAX,EAAmB3tB,SAAnB,EAA+B;;AAEnC,OAAK2tB,MAAL,CAAY9uC,IAAZ,CAAkB8uC,MAAlB;AACA,OAAK3tB,SAAL,CAAenhB,IAAf,CAAqBmhB,SAArB;;AAEA,SAAO,IAAP;AAEA,EAT4B;;AAW7BrhB,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EAf4B;;AAiB7BA,OAAM,UAAW+uC,GAAX,EAAiB;;AAEtB,OAAKD,MAAL,CAAY9uC,IAAZ,CAAkB+uC,IAAID,MAAtB;AACA,OAAK3tB,SAAL,CAAenhB,IAAf,CAAqB+uC,IAAI5tB,SAAzB;;AAEA,SAAO,IAAP;AAEA,EAxB4B;;AA0B7B6tB,KAAI,UAAWhxC,CAAX,EAAcpM,MAAd,EAAuB;;AAE1B,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,yCAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO/T,OAAOoO,IAAP,CAAa,KAAKmhB,SAAlB,EAA8BngB,cAA9B,CAA8ChD,CAA9C,EAAkDkC,GAAlD,CAAuD,KAAK4uC,MAA5D,CAAP;AAEA,EArC4B;;AAuC7BxnC,SAAQ,UAAWrH,CAAX,EAAe;;AAEtB,OAAKkhB,SAAL,CAAenhB,IAAf,CAAqBC,CAArB,EAAyBW,GAAzB,CAA8B,KAAKkuC,MAAnC,EAA4C5sC,SAA5C;;AAEA,SAAO,IAAP;AAEA,EA7C4B;;AA+C7B+sC,SAAQ,YAAY;;AAEnB,MAAIpsC,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASspC,MAAT,CAAiBjxC,CAAjB,EAAqB;;AAE3B,QAAK8wC,MAAL,CAAY9uC,IAAZ,CAAkB,KAAKgvC,EAAL,CAAShxC,CAAT,EAAY6E,EAAZ,CAAlB;;AAEA,UAAO,IAAP;AAEA,GAND;AAQA,EAZO,EA/CqB;;AA6D7BqsC,sBAAqB,UAAW5yB,KAAX,EAAkB1qB,MAAlB,EAA2B;;AAE/C,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,0DAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED/T,SAAOiP,UAAP,CAAmByb,KAAnB,EAA0B,KAAKwyB,MAA/B;;AAEA,MAAIK,oBAAoBv9C,OAAOiQ,GAAP,CAAY,KAAKsf,SAAjB,CAAxB;;AAEA,MAAKguB,oBAAoB,CAAzB,EAA6B;;AAE5B,UAAOv9C,OAAOoO,IAAP,CAAa,KAAK8uC,MAAlB,CAAP;AAEA;;AAED,SAAOl9C,OAAOoO,IAAP,CAAa,KAAKmhB,SAAlB,EAA8BngB,cAA9B,CAA8CmuC,iBAA9C,EAAkEjvC,GAAlE,CAAuE,KAAK4uC,MAA5E,CAAP;AAEA,EAlF4B;;AAoF7BlwB,kBAAiB,UAAWtC,KAAX,EAAmB;;AAEnC,SAAO1rB,KAAKmR,IAAL,CAAW,KAAKqtC,iBAAL,CAAwB9yB,KAAxB,CAAX,CAAP;AAEA,EAxF4B;;AA0F7B8yB,oBAAmB,YAAY;;AAE9B,MAAIvsC,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASypC,iBAAT,CAA4B9yB,KAA5B,EAAoC;;AAE1C,OAAI6yB,oBAAoBtsC,GAAGhC,UAAH,CAAeyb,KAAf,EAAsB,KAAKwyB,MAA3B,EAAoCjtC,GAApC,CAAyC,KAAKsf,SAA9C,CAAxB;;AAEA;;AAEA,OAAKguB,oBAAoB,CAAzB,EAA6B;;AAE5B,WAAO,KAAKL,MAAL,CAAYxsC,iBAAZ,CAA+Bga,KAA/B,CAAP;AAEA;;AAEDzZ,MAAG7C,IAAH,CAAS,KAAKmhB,SAAd,EAA0BngB,cAA1B,CAA0CmuC,iBAA1C,EAA8DjvC,GAA9D,CAAmE,KAAK4uC,MAAxE;;AAEA,UAAOjsC,GAAGP,iBAAH,CAAsBga,KAAtB,CAAP;AAEA,GAhBD;AAkBA,EAtBkB,EA1FU;;AAkH7B+yB,sBAAqB,YAAY;;AAEhC,MAAIC,YAAY,IAAI3pC,OAAJ,EAAhB;AACA,MAAI4pC,SAAS,IAAI5pC,OAAJ,EAAb;AACA,MAAIm9B,OAAO,IAAIn9B,OAAJ,EAAX;;AAEA,SAAO,SAAS0pC,mBAAT,CAA8BvxB,EAA9B,EAAkCjb,EAAlC,EAAsC2sC,kBAAtC,EAA0DC,sBAA1D,EAAmF;;AAEzF;AACA;AACA;AACA;AACA;AACA;;AAEAH,aAAUtvC,IAAV,CAAgB8d,EAAhB,EAAqB5d,GAArB,CAA0B2C,EAA1B,EAA+B7B,cAA/B,CAA+C,GAA/C;AACAuuC,UAAOvvC,IAAP,CAAa6C,EAAb,EAAkBjC,GAAlB,CAAuBkd,EAAvB,EAA4B5b,SAA5B;AACA4gC,QAAK9iC,IAAL,CAAW,KAAK8uC,MAAhB,EAAyBluC,GAAzB,CAA8B0uC,SAA9B;;AAEA,OAAII,YAAY5xB,GAAGzb,UAAH,CAAeQ,EAAf,IAAsB,GAAtC;AACA,OAAI8sC,MAAM,CAAE,KAAKxuB,SAAL,CAAetf,GAAf,CAAoB0tC,MAApB,CAAZ;AACA,OAAIK,KAAK9M,KAAKjhC,GAAL,CAAU,KAAKsf,SAAf,CAAT;AACA,OAAIvjB,KAAK,CAAEklC,KAAKjhC,GAAL,CAAU0tC,MAAV,CAAX;AACA,OAAI9rC,IAAIq/B,KAAKhhC,QAAL,EAAR;AACA,OAAI6I,MAAM/Z,KAAKqR,GAAL,CAAU,IAAI0tC,MAAMA,GAApB,CAAV;AACA,OAAIE,EAAJ,EAAQ3/B,EAAR,EAAY4/B,OAAZ,EAAqBC,MAArB;;AAEA,OAAKplC,MAAM,CAAX,EAAe;;AAEd;;AAEAklC,SAAKF,MAAM/xC,EAAN,GAAWgyC,EAAhB;AACA1/B,SAAKy/B,MAAMC,EAAN,GAAWhyC,EAAhB;AACAmyC,aAASL,YAAY/kC,GAArB;;AAEA,QAAKklC,MAAM,CAAX,EAAe;;AAEd,SAAK3/B,MAAM,CAAE6/B,MAAb,EAAsB;;AAErB,UAAK7/B,MAAM6/B,MAAX,EAAoB;;AAEnB;AACA;;AAEA,WAAIC,SAAS,IAAIrlC,GAAjB;AACAklC,aAAMG,MAAN;AACA9/B,aAAM8/B,MAAN;AACAF,iBAAUD,MAAOA,KAAKF,MAAMz/B,EAAX,GAAgB,IAAI0/B,EAA3B,IAAkC1/B,MAAOy/B,MAAME,EAAN,GAAW3/B,EAAX,GAAgB,IAAItS,EAA3B,CAAlC,GAAoE6F,CAA9E;AAEA,OAVD,MAUO;;AAEN;;AAEAyM,YAAKw/B,SAAL;AACAG,YAAKj/C,KAAKyM,GAAL,CAAU,CAAV,EAAa,EAAIsyC,MAAMz/B,EAAN,GAAW0/B,EAAf,CAAb,CAAL;AACAE,iBAAU,CAAED,EAAF,GAAOA,EAAP,GAAY3/B,MAAOA,KAAK,IAAItS,EAAhB,CAAZ,GAAmC6F,CAA7C;AAEA;AAED,MAtBD,MAsBO;;AAEN;;AAEAyM,WAAK,CAAEw/B,SAAP;AACAG,WAAKj/C,KAAKyM,GAAL,CAAU,CAAV,EAAa,EAAIsyC,MAAMz/B,EAAN,GAAW0/B,EAAf,CAAb,CAAL;AACAE,gBAAU,CAAED,EAAF,GAAOA,EAAP,GAAY3/B,MAAOA,KAAK,IAAItS,EAAhB,CAAZ,GAAmC6F,CAA7C;AAEA;AAED,KAlCD,MAkCO;;AAEN,SAAKyM,MAAM,CAAE6/B,MAAb,EAAsB;;AAErB;;AAEAF,WAAKj/C,KAAKyM,GAAL,CAAU,CAAV,EAAa,EAAI,CAAEsyC,GAAF,GAAQD,SAAR,GAAoBE,EAAxB,CAAb,CAAL;AACA1/B,WAAO2/B,KAAK,CAAP,GAAa,CAAEH,SAAf,GAA2B9+C,KAAKwM,GAAL,CAAUxM,KAAKyM,GAAL,CAAU,CAAEqyC,SAAZ,EAAuB,CAAE9xC,EAAzB,CAAV,EAAyC8xC,SAAzC,CAAhC;AACAI,gBAAU,CAAED,EAAF,GAAOA,EAAP,GAAY3/B,MAAOA,KAAK,IAAItS,EAAhB,CAAZ,GAAmC6F,CAA7C;AAEA,MARD,MAQO,IAAKyM,MAAM6/B,MAAX,EAAoB;;AAE1B;;AAEAF,WAAK,CAAL;AACA3/B,WAAKtf,KAAKwM,GAAL,CAAUxM,KAAKyM,GAAL,CAAU,CAAEqyC,SAAZ,EAAuB,CAAE9xC,EAAzB,CAAV,EAAyC8xC,SAAzC,CAAL;AACAI,gBAAU5/B,MAAOA,KAAK,IAAItS,EAAhB,IAAuB6F,CAAjC;AAEA,MARM,MAQA;;AAEN;;AAEAosC,WAAKj/C,KAAKyM,GAAL,CAAU,CAAV,EAAa,EAAIsyC,MAAMD,SAAN,GAAkBE,EAAtB,CAAb,CAAL;AACA1/B,WAAO2/B,KAAK,CAAP,GAAaH,SAAb,GAAyB9+C,KAAKwM,GAAL,CAAUxM,KAAKyM,GAAL,CAAU,CAAEqyC,SAAZ,EAAuB,CAAE9xC,EAAzB,CAAV,EAAyC8xC,SAAzC,CAA9B;AACAI,gBAAU,CAAED,EAAF,GAAOA,EAAP,GAAY3/B,MAAOA,KAAK,IAAItS,EAAhB,CAAZ,GAAmC6F,CAA7C;AAEA;AAED;AAED,IAxED,MAwEO;;AAEN;;AAEAyM,SAAOy/B,MAAM,CAAR,GAAc,CAAED,SAAhB,GAA4BA,SAAjC;AACAG,SAAKj/C,KAAKyM,GAAL,CAAU,CAAV,EAAa,EAAIsyC,MAAMz/B,EAAN,GAAW0/B,EAAf,CAAb,CAAL;AACAE,cAAU,CAAED,EAAF,GAAOA,EAAP,GAAY3/B,MAAOA,KAAK,IAAItS,EAAhB,CAAZ,GAAmC6F,CAA7C;AAEA;;AAED,OAAK+rC,kBAAL,EAA0B;;AAEzBA,uBAAmBxvC,IAAnB,CAAyB,KAAKmhB,SAA9B,EAA0CngB,cAA1C,CAA0D6uC,EAA1D,EAA+D3vC,GAA/D,CAAoE,KAAK4uC,MAAzE;AAEA;;AAED,OAAKW,sBAAL,EAA8B;;AAE7BA,2BAAuBzvC,IAAvB,CAA6BuvC,MAA7B,EAAsCvuC,cAAtC,CAAsDkP,EAAtD,EAA2DhQ,GAA3D,CAAgEovC,SAAhE;AAEA;;AAED,UAAOQ,OAAP;AAEA,GArHD;AAuHA,EA7HoB,EAlHQ;;AAiP7BG,kBAAiB,YAAY;;AAE5B,MAAIptC,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASsqC,eAAT,CAA0BzyB,MAA1B,EAAkC5rB,MAAlC,EAA2C;;AAEjDiR,MAAGhC,UAAH,CAAe2c,OAAOha,MAAtB,EAA8B,KAAKsrC,MAAnC;AACA,OAAIoB,MAAMrtC,GAAGhB,GAAH,CAAQ,KAAKsf,SAAb,CAAV;AACA,OAAIpkB,KAAK8F,GAAGhB,GAAH,CAAQgB,EAAR,IAAeqtC,MAAMA,GAA9B;AACA,OAAIC,UAAU3yB,OAAO1I,MAAP,GAAgB0I,OAAO1I,MAArC;;AAEA,OAAK/X,KAAKozC,OAAV,EAAoB,OAAO,IAAP;;AAEpB,OAAIC,MAAMx/C,KAAKmR,IAAL,CAAWouC,UAAUpzC,EAArB,CAAV;;AAEA;AACA,OAAIszC,KAAKH,MAAME,GAAf;;AAEA;AACA,OAAIE,KAAKJ,MAAME,GAAf;;AAEA;AACA,OAAKC,KAAK,CAAL,IAAUC,KAAK,CAApB,EAAwB,OAAO,IAAP;;AAExB;AACA;AACA;AACA,OAAKD,KAAK,CAAV,EAAc,OAAO,KAAKrB,EAAL,CAASsB,EAAT,EAAa1+C,MAAb,CAAP;;AAEd;AACA,UAAO,KAAKo9C,EAAL,CAASqB,EAAT,EAAaz+C,MAAb,CAAP;AAEA,GA5BD;AA8BA,EAlCgB,EAjPY;;AAqR7B0rB,mBAAkB,UAAWE,MAAX,EAAoB;;AAErC,SAAO,KAAKoB,eAAL,CAAsBpB,OAAOha,MAA7B,KAAyCga,OAAO1I,MAAvD;AAEA,EAzR4B;;AA2R7By7B,kBAAiB,UAAW5yB,KAAX,EAAmB;;AAEnC,MAAI0D,cAAc1D,MAAMpJ,MAAN,CAAa1S,GAAb,CAAkB,KAAKsf,SAAvB,CAAlB;;AAEA,MAAKE,gBAAgB,CAArB,EAAyB;;AAExB;AACA,OAAK1D,MAAMiB,eAAN,CAAuB,KAAKkwB,MAA5B,MAAyC,CAA9C,EAAkD;;AAEjD,WAAO,CAAP;AAEA;;AAED;;AAEA,UAAO,IAAP;AAEA;;AAED,MAAI9wC,IAAI,EAAI,KAAK8wC,MAAL,CAAYjtC,GAAZ,CAAiB8b,MAAMpJ,MAAvB,IAAkCoJ,MAAMC,QAA5C,IAAyDyD,WAAjE;;AAEA;;AAEA,SAAOrjB,KAAK,CAAL,GAASA,CAAT,GAAa,IAApB;AAEA,EApT4B;;AAsT7BwyC,iBAAgB,UAAW7yB,KAAX,EAAkB/rB,MAAlB,EAA2B;;AAE1C,MAAIoM,IAAI,KAAKuyC,eAAL,CAAsB5yB,KAAtB,CAAR;;AAEA,MAAK3f,MAAM,IAAX,EAAkB;;AAEjB,UAAO,IAAP;AAEA;;AAED,SAAO,KAAKgxC,EAAL,CAAShxC,CAAT,EAAYpM,MAAZ,CAAP;AAEA,EAlU4B;;AAoU7B8rB,kBAAiB,UAAWC,KAAX,EAAmB;;AAEnC;;AAEA,MAAI8yB,cAAc9yB,MAAMiB,eAAN,CAAuB,KAAKkwB,MAA5B,CAAlB;;AAEA,MAAK2B,gBAAgB,CAArB,EAAyB;;AAExB,UAAO,IAAP;AAEA;;AAED,MAAIpvB,cAAc1D,MAAMpJ,MAAN,CAAa1S,GAAb,CAAkB,KAAKsf,SAAvB,CAAlB;;AAEA,MAAKE,cAAcovB,WAAd,GAA4B,CAAjC,EAAqC;;AAEpC,UAAO,IAAP;AAEA;;AAED;;AAEA,SAAO,KAAP;AAEA,EA5V4B;;AA8V7BC,eAAc,UAAWx0B,GAAX,EAAgBtqB,MAAhB,EAAyB;;AAEtC,MAAI++C,IAAJ,EAAUC,IAAV,EAAgBC,KAAhB,EAAuBC,KAAvB,EAA8BC,KAA9B,EAAqCC,KAArC;;AAEA,MAAIC,UAAU,IAAI,KAAK9vB,SAAL,CAAehwB,CAAjC;AAAA,MACC+/C,UAAU,IAAI,KAAK/vB,SAAL,CAAepjB,CAD9B;AAAA,MAECozC,UAAU,IAAI,KAAKhwB,SAAL,CAAe1b,CAF9B;;AAIA,MAAIqpC,SAAS,KAAKA,MAAlB;;AAEA,MAAKmC,WAAW,CAAhB,EAAoB;;AAEnBN,UAAO,CAAEz0B,IAAI9e,GAAJ,CAAQjM,CAAR,GAAY29C,OAAO39C,CAArB,IAA2B8/C,OAAlC;AACAL,UAAO,CAAE10B,IAAI7e,GAAJ,CAAQlM,CAAR,GAAY29C,OAAO39C,CAArB,IAA2B8/C,OAAlC;AAEA,GALD,MAKO;;AAENN,UAAO,CAAEz0B,IAAI7e,GAAJ,CAAQlM,CAAR,GAAY29C,OAAO39C,CAArB,IAA2B8/C,OAAlC;AACAL,UAAO,CAAE10B,IAAI9e,GAAJ,CAAQjM,CAAR,GAAY29C,OAAO39C,CAArB,IAA2B8/C,OAAlC;AAEA;;AAED,MAAKC,WAAW,CAAhB,EAAoB;;AAEnBL,WAAQ,CAAE30B,IAAI9e,GAAJ,CAAQW,CAAR,GAAY+wC,OAAO/wC,CAArB,IAA2BmzC,OAAnC;AACAJ,WAAQ,CAAE50B,IAAI7e,GAAJ,CAAQU,CAAR,GAAY+wC,OAAO/wC,CAArB,IAA2BmzC,OAAnC;AAEA,GALD,MAKO;;AAENL,WAAQ,CAAE30B,IAAI7e,GAAJ,CAAQU,CAAR,GAAY+wC,OAAO/wC,CAArB,IAA2BmzC,OAAnC;AACAJ,WAAQ,CAAE50B,IAAI9e,GAAJ,CAAQW,CAAR,GAAY+wC,OAAO/wC,CAArB,IAA2BmzC,OAAnC;AAEA;;AAED,MAAOP,OAAOG,KAAT,IAAsBD,QAAQD,IAAnC,EAA4C,OAAO,IAAP;;AAE5C;AACA;;AAEA,MAAKC,QAAQF,IAAR,IAAgBA,SAASA,IAA9B,EAAqCA,OAAOE,KAAP;;AAErC,MAAKC,QAAQF,IAAR,IAAgBA,SAASA,IAA9B,EAAqCA,OAAOE,KAAP;;AAErC,MAAKK,WAAW,CAAhB,EAAoB;;AAEnBJ,WAAQ,CAAE70B,IAAI9e,GAAJ,CAAQqI,CAAR,GAAYqpC,OAAOrpC,CAArB,IAA2B0rC,OAAnC;AACAH,WAAQ,CAAE90B,IAAI7e,GAAJ,CAAQoI,CAAR,GAAYqpC,OAAOrpC,CAArB,IAA2B0rC,OAAnC;AAEA,GALD,MAKO;;AAENJ,WAAQ,CAAE70B,IAAI7e,GAAJ,CAAQoI,CAAR,GAAYqpC,OAAOrpC,CAArB,IAA2B0rC,OAAnC;AACAH,WAAQ,CAAE90B,IAAI9e,GAAJ,CAAQqI,CAAR,GAAYqpC,OAAOrpC,CAArB,IAA2B0rC,OAAnC;AAEA;;AAED,MAAOR,OAAOK,KAAT,IAAsBD,QAAQH,IAAnC,EAA4C,OAAO,IAAP;;AAE5C,MAAKG,QAAQJ,IAAR,IAAgBA,SAASA,IAA9B,EAAqCA,OAAOI,KAAP;;AAErC,MAAKC,QAAQJ,IAAR,IAAgBA,SAASA,IAA9B,EAAqCA,OAAOI,KAAP;;AAErC;;AAEA,MAAKJ,OAAO,CAAZ,EAAgB,OAAO,IAAP;;AAEhB,SAAO,KAAK5B,EAAL,CAAS2B,QAAQ,CAAR,GAAYA,IAAZ,GAAmBC,IAA5B,EAAkCh/C,MAAlC,CAAP;AAEA,EAja4B;;AAma7ByrB,gBAAiB,YAAY;;AAE5B,MAAIpd,IAAI,IAAI0F,OAAJ,EAAR;;AAEA,SAAO,SAAS0X,aAAT,CAAwBnB,GAAxB,EAA8B;;AAEpC,UAAO,KAAKw0B,YAAL,CAAmBx0B,GAAnB,EAAwBjc,CAAxB,MAAgC,IAAvC;AAEA,GAJD;AAMA,EAVc,EAnac;;AA+a7BmxC,oBAAmB,YAAY;;AAE9B;AACA,MAAItO,OAAO,IAAIn9B,OAAJ,EAAX;AACA,MAAI0rC,QAAQ,IAAI1rC,OAAJ,EAAZ;AACA,MAAI2rC,QAAQ,IAAI3rC,OAAJ,EAAZ;AACA,MAAI4O,SAAS,IAAI5O,OAAJ,EAAb;;AAEA,SAAO,SAASyrC,iBAAT,CAA4B3wC,CAA5B,EAA+BC,CAA/B,EAAkC+C,CAAlC,EAAqC8tC,eAArC,EAAsD3/C,MAAtD,EAA+D;;AAErE;;AAEAy/C,SAAMxwC,UAAN,CAAkBH,CAAlB,EAAqBD,CAArB;AACA6wC,SAAMzwC,UAAN,CAAkB4C,CAAlB,EAAqBhD,CAArB;AACA8T,UAAO9M,YAAP,CAAqB4pC,KAArB,EAA4BC,KAA5B;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAIE,MAAM,KAAKrwB,SAAL,CAAetf,GAAf,CAAoB0S,MAApB,CAAV;AACA,OAAIrjB,IAAJ;;AAEA,OAAKsgD,MAAM,CAAX,EAAe;;AAEd,QAAKD,eAAL,EAAuB,OAAO,IAAP;AACvBrgD,WAAO,CAAP;AAEA,IALD,MAKO,IAAKsgD,MAAM,CAAX,EAAe;;AAErBtgD,WAAO,CAAE,CAAT;AACAsgD,UAAM,CAAEA,GAAR;AAEA,IALM,MAKA;;AAEN,WAAO,IAAP;AAEA;;AAED1O,QAAKjiC,UAAL,CAAiB,KAAKiuC,MAAtB,EAA8BruC,CAA9B;AACA,OAAIgxC,SAASvgD,OAAO,KAAKiwB,SAAL,CAAetf,GAAf,CAAoByvC,MAAM7pC,YAAN,CAAoBq7B,IAApB,EAA0BwO,KAA1B,CAApB,CAApB;;AAEA;AACA,OAAKG,SAAS,CAAd,EAAkB;;AAEjB,WAAO,IAAP;AAEA;;AAED,OAAIC,SAASxgD,OAAO,KAAKiwB,SAAL,CAAetf,GAAf,CAAoBwvC,MAAMz9B,KAAN,CAAakvB,IAAb,CAApB,CAApB;;AAEA;AACA,OAAK4O,SAAS,CAAd,EAAkB;;AAEjB,WAAO,IAAP;AAEA;;AAED;AACA,OAAKD,SAASC,MAAT,GAAkBF,GAAvB,EAA6B;;AAE5B,WAAO,IAAP;AAEA;;AAED;AACA,OAAIG,MAAM,CAAEzgD,IAAF,GAAS4xC,KAAKjhC,GAAL,CAAU0S,MAAV,CAAnB;;AAEA;AACA,OAAKo9B,MAAM,CAAX,EAAe;;AAEd,WAAO,IAAP;AAEA;;AAED;AACA,UAAO,KAAK3C,EAAL,CAAS2C,MAAMH,GAAf,EAAoB5/C,MAApB,CAAP;AAEA,GAvED;AAyEA,EAjFkB,EA/aU;;AAkgB7BmY,eAAc,UAAWwL,OAAX,EAAqB;;AAElC,OAAKu5B,MAAL,CAAY/kC,YAAZ,CAA0BwL,OAA1B;AACA,OAAK4L,SAAL,CAAexN,kBAAf,CAAmC4B,OAAnC;;AAEA,SAAO,IAAP;AAEA,EAzgB4B;;AA2gB7BxS,SAAQ,UAAWgsC,GAAX,EAAiB;;AAExB,SAAOA,IAAID,MAAJ,CAAW/rC,MAAX,CAAmB,KAAK+rC,MAAxB,KAAoCC,IAAI5tB,SAAJ,CAAcpe,MAAd,CAAsB,KAAKoe,SAA3B,CAA3C;AAEA;;AA/gB4B,CAA9B;;AAmhBA;;;;AAIA,SAASywB,KAAT,CAAgBtwB,KAAhB,EAAuBI,GAAvB,EAA6B;;AAE5B,MAAKJ,KAAL,GAAeA,UAAU3wB,SAAZ,GAA0B2wB,KAA1B,GAAkC,IAAI3b,OAAJ,EAA/C;AACA,MAAK+b,GAAL,GAAaA,QAAQ/wB,SAAV,GAAwB+wB,GAAxB,GAA8B,IAAI/b,OAAJ,EAAzC;AAEA;;AAEDrU,OAAOK,MAAP,CAAeigD,MAAMvgD,SAArB,EAAgC;;AAE/BgO,MAAK,UAAWiiB,KAAX,EAAkBI,GAAlB,EAAwB;;AAE5B,OAAKJ,KAAL,CAAWthB,IAAX,CAAiBshB,KAAjB;AACA,OAAKI,GAAL,CAAS1hB,IAAT,CAAe0hB,GAAf;;AAEA,SAAO,IAAP;AAEA,EAT8B;;AAW/B5hB,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EAf8B;;AAiB/BA,OAAM,UAAWkhB,IAAX,EAAkB;;AAEvB,OAAKI,KAAL,CAAWthB,IAAX,CAAiBkhB,KAAKI,KAAtB;AACA,OAAKI,GAAL,CAAS1hB,IAAT,CAAekhB,KAAKQ,GAApB;;AAEA,SAAO,IAAP;AAEA,EAxB8B;;AA0B/BtF,YAAW,UAAWxqB,MAAX,EAAoB;;AAE9B,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,kDAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO/T,OAAO0O,UAAP,CAAmB,KAAKghB,KAAxB,EAA+B,KAAKI,GAApC,EAA0C1gB,cAA1C,CAA0D,GAA1D,CAAP;AAEA,EArC8B;;AAuC/BogB,QAAO,UAAWxvB,MAAX,EAAoB;;AAE1B,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,8CAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO/T,OAAOiP,UAAP,CAAmB,KAAK6gB,GAAxB,EAA6B,KAAKJ,KAAlC,CAAP;AAEA,EAlD8B;;AAoD/BuwB,aAAY,YAAY;;AAEvB,SAAO,KAAKvwB,KAAL,CAAWhf,iBAAX,CAA8B,KAAKof,GAAnC,CAAP;AAEA,EAxD8B;;AA0D/BmC,WAAU,YAAY;;AAErB,SAAO,KAAKvC,KAAL,CAAWjf,UAAX,CAAuB,KAAKqf,GAA5B,CAAP;AAEA,EA9D8B;;AAgE/BstB,KAAI,UAAWhxC,CAAX,EAAcpM,MAAd,EAAuB;;AAE1B,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,2CAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO,KAAKyb,KAAL,CAAYxvB,MAAZ,EAAqBoP,cAArB,CAAqChD,CAArC,EAAyCkC,GAAzC,CAA8C,KAAKohB,KAAnD,CAAP;AAEA,EA3E8B;;AA6E/BwwB,+BAA8B,YAAY;;AAEzC,MAAIC,SAAS,IAAIpsC,OAAJ,EAAb;AACA,MAAIqsC,WAAW,IAAIrsC,OAAJ,EAAf;;AAEA,SAAO,SAASmsC,4BAAT,CAAuCx1B,KAAvC,EAA8C21B,WAA9C,EAA4D;;AAElEF,UAAOlxC,UAAP,CAAmByb,KAAnB,EAA0B,KAAKgF,KAA/B;AACA0wB,YAASnxC,UAAT,CAAqB,KAAK6gB,GAA1B,EAA+B,KAAKJ,KAApC;;AAEA,OAAI4wB,YAAYF,SAASnwC,GAAT,CAAcmwC,QAAd,CAAhB;AACA,OAAIG,kBAAkBH,SAASnwC,GAAT,CAAckwC,MAAd,CAAtB;;AAEA,OAAI/zC,IAAIm0C,kBAAkBD,SAA1B;;AAEA,OAAKD,WAAL,EAAmB;;AAElBj0C,QAAI1B,MAAMa,KAAN,CAAaa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAJ;AAEA;;AAED,UAAOA,CAAP;AAEA,GAlBD;AAoBA,EAzB6B,EA7EC;;AAwG/BkxC,sBAAqB,UAAW5yB,KAAX,EAAkB21B,WAAlB,EAA+BrgD,MAA/B,EAAwC;;AAE5D,MAAIoM,IAAI,KAAK8zC,4BAAL,CAAmCx1B,KAAnC,EAA0C21B,WAA1C,CAAR;;AAEA,MAAKrgD,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,4DAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO,KAAKyb,KAAL,CAAYxvB,MAAZ,EAAqBoP,cAArB,CAAqChD,CAArC,EAAyCkC,GAAzC,CAA8C,KAAKohB,KAAnD,CAAP;AAEA,EArH8B;;AAuH/BvX,eAAc,UAAWsD,MAAX,EAAoB;;AAEjC,OAAKiU,KAAL,CAAWvX,YAAX,CAAyBsD,MAAzB;AACA,OAAKqU,GAAL,CAAS3X,YAAT,CAAuBsD,MAAvB;;AAEA,SAAO,IAAP;AAEA,EA9H8B;;AAgI/BtK,SAAQ,UAAWme,IAAX,EAAkB;;AAEzB,SAAOA,KAAKI,KAAL,CAAWve,MAAX,CAAmB,KAAKue,KAAxB,KAAmCJ,KAAKQ,GAAL,CAAS3e,MAAT,CAAiB,KAAK2e,GAAtB,CAA1C;AAEA;;AApI8B,CAAhC;;AAwIA;;;;;AAKA,SAAS0wB,QAAT,CAAmB3xC,CAAnB,EAAsBC,CAAtB,EAAyB+C,CAAzB,EAA6B;;AAE5B,MAAKhD,CAAL,GAAWA,MAAM9P,SAAR,GAAsB8P,CAAtB,GAA0B,IAAIkF,OAAJ,EAAnC;AACA,MAAKjF,CAAL,GAAWA,MAAM/P,SAAR,GAAsB+P,CAAtB,GAA0B,IAAIiF,OAAJ,EAAnC;AACA,MAAKlC,CAAL,GAAWA,MAAM9S,SAAR,GAAsB8S,CAAtB,GAA0B,IAAIkC,OAAJ,EAAnC;AAEA;;AAEDrU,OAAOK,MAAP,CAAeygD,QAAf,EAAyB;;AAExBC,YAAW,YAAY;;AAEtB,MAAIv0B,KAAK,IAAInY,OAAJ,EAAT;;AAEA,SAAO,SAAS0sC,SAAT,CAAoB5xC,CAApB,EAAuBC,CAAvB,EAA0B+C,CAA1B,EAA6B7R,MAA7B,EAAsC;;AAE5C,OAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,qDAAd;AACAzO,aAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED/T,UAAOiP,UAAP,CAAmB4C,CAAnB,EAAsB/C,CAAtB;AACAod,MAAGjd,UAAH,CAAeJ,CAAf,EAAkBC,CAAlB;AACA9O,UAAOgiB,KAAP,CAAckK,EAAd;;AAEA,OAAIw0B,iBAAiB1gD,OAAOkQ,QAAP,EAArB;AACA,OAAKwwC,iBAAiB,CAAtB,EAA0B;;AAEzB,WAAO1gD,OAAOoP,cAAP,CAAuB,IAAIpQ,KAAKmR,IAAL,CAAWuwC,cAAX,CAA3B,CAAP;AAEA;;AAED,UAAO1gD,OAAOyN,GAAP,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB,CAAP;AAEA,GAtBD;AAwBA,EA5BU,EAFa;;AAgCxB;AACA;AACAkzC,eAAc,YAAY;;AAEzB,MAAIz0B,KAAK,IAAInY,OAAJ,EAAT;AACA,MAAI9C,KAAK,IAAI8C,OAAJ,EAAT;AACA,MAAI7C,KAAK,IAAI6C,OAAJ,EAAT;;AAEA,SAAO,SAAS4sC,YAAT,CAAuBj2B,KAAvB,EAA8B7b,CAA9B,EAAiCC,CAAjC,EAAoC+C,CAApC,EAAuC7R,MAAvC,EAAgD;;AAEtDksB,MAAGjd,UAAH,CAAe4C,CAAf,EAAkBhD,CAAlB;AACAoC,MAAGhC,UAAH,CAAeH,CAAf,EAAkBD,CAAlB;AACAqC,MAAGjC,UAAH,CAAeyb,KAAf,EAAsB7b,CAAtB;;AAEA,OAAI+xC,QAAQ10B,GAAGjc,GAAH,CAAQic,EAAR,CAAZ;AACA,OAAI20B,QAAQ30B,GAAGjc,GAAH,CAAQgB,EAAR,CAAZ;AACA,OAAI6vC,QAAQ50B,GAAGjc,GAAH,CAAQiB,EAAR,CAAZ;AACA,OAAI6vC,QAAQ9vC,GAAGhB,GAAH,CAAQgB,EAAR,CAAZ;AACA,OAAI+vC,QAAQ/vC,GAAGhB,GAAH,CAAQiB,EAAR,CAAZ;;AAEA,OAAI+vC,QAAUL,QAAQG,KAAR,GAAgBF,QAAQA,KAAtC;;AAEA,OAAK7gD,WAAWjB,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,wDAAd;AACAzO,aAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED;AACA,OAAKktC,UAAU,CAAf,EAAmB;;AAElB;AACA;AACA,WAAOjhD,OAAOyN,GAAP,CAAY,CAAE,CAAd,EAAiB,CAAE,CAAnB,EAAsB,CAAE,CAAxB,CAAP;AAEA;;AAED,OAAIyzC,WAAW,IAAID,KAAnB;AACA,OAAIznB,IAAI,CAAEunB,QAAQD,KAAR,GAAgBD,QAAQG,KAA1B,IAAoCE,QAA5C;AACA,OAAI7yC,IAAI,CAAEuyC,QAAQI,KAAR,GAAgBH,QAAQC,KAA1B,IAAoCI,QAA5C;;AAEA;AACA,UAAOlhD,OAAOyN,GAAP,CAAY,IAAI+rB,CAAJ,GAAQnrB,CAApB,EAAuBA,CAAvB,EAA0BmrB,CAA1B,CAAP;AAEA,GArCD;AAuCA,EA7Ca,EAlCU;;AAiFxBlO,gBAAe,YAAY;;AAE1B,MAAIra,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASuX,aAAT,CAAwBZ,KAAxB,EAA+B7b,CAA/B,EAAkCC,CAAlC,EAAqC+C,CAArC,EAAyC;;AAE/C2uC,YAASG,YAAT,CAAuBj2B,KAAvB,EAA8B7b,CAA9B,EAAiCC,CAAjC,EAAoC+C,CAApC,EAAuCZ,EAAvC;;AAEA,UAASA,GAAG1R,CAAH,IAAQ,CAAV,IAAmB0R,GAAG9E,CAAH,IAAQ,CAA3B,IAAsC8E,GAAG1R,CAAH,GAAO0R,GAAG9E,CAAZ,IAAmB,CAA9D;AAEA,GAND;AAQA,EAZc;;AAjFS,CAAzB;;AAiGAzM,OAAOK,MAAP,CAAeygD,SAAS/gD,SAAxB,EAAmC;;AAElCgO,MAAK,UAAWoB,CAAX,EAAcC,CAAd,EAAiB+C,CAAjB,EAAqB;;AAEzB,OAAKhD,CAAL,CAAOT,IAAP,CAAaS,CAAb;AACA,OAAKC,CAAL,CAAOV,IAAP,CAAaU,CAAb;AACA,OAAK+C,CAAL,CAAOzD,IAAP,CAAayD,CAAb;;AAEA,SAAO,IAAP;AAEA,EAViC;;AAYlCsvC,0BAAyB,UAAWv3B,MAAX,EAAmBw3B,EAAnB,EAAuBC,EAAvB,EAA2BC,EAA3B,EAAgC;;AAExD,OAAKzyC,CAAL,CAAOT,IAAP,CAAawb,OAAQw3B,EAAR,CAAb;AACA,OAAKtyC,CAAL,CAAOV,IAAP,CAAawb,OAAQy3B,EAAR,CAAb;AACA,OAAKxvC,CAAL,CAAOzD,IAAP,CAAawb,OAAQ03B,EAAR,CAAb;;AAEA,SAAO,IAAP;AAEA,EApBiC;;AAsBlCpzC,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EA1BiC;;AA4BlCA,OAAM,UAAW2e,QAAX,EAAsB;;AAE3B,OAAKle,CAAL,CAAOT,IAAP,CAAa2e,SAASle,CAAtB;AACA,OAAKC,CAAL,CAAOV,IAAP,CAAa2e,SAASje,CAAtB;AACA,OAAK+C,CAAL,CAAOzD,IAAP,CAAa2e,SAASlb,CAAtB;;AAEA,SAAO,IAAP;AAEA,EApCiC;;AAsClC0vC,UAAS,YAAY;;AAEpB,MAAIr1B,KAAK,IAAInY,OAAJ,EAAT;AACA,MAAI9C,KAAK,IAAI8C,OAAJ,EAAT;;AAEA,SAAO,SAASwtC,OAAT,GAAmB;;AAEzBr1B,MAAGjd,UAAH,CAAe,KAAK4C,CAApB,EAAuB,KAAK/C,CAA5B;AACAmC,MAAGhC,UAAH,CAAe,KAAKJ,CAApB,EAAuB,KAAKC,CAA5B;;AAEA,UAAOod,GAAGlK,KAAH,CAAU/Q,EAAV,EAAe5Q,MAAf,KAA0B,GAAjC;AAEA,GAPD;AASA,EAdQ,EAtCyB;;AAsDlCmhD,cAAa,UAAWxhD,MAAX,EAAoB;;AAEhC,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,uDAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO/T,OAAO0O,UAAP,CAAmB,KAAKG,CAAxB,EAA2B,KAAKC,CAAhC,EAAoCR,GAApC,CAAyC,KAAKuD,CAA9C,EAAkDzC,cAAlD,CAAkE,IAAI,CAAtE,CAAP;AAEA,EAjEiC;;AAmElCqxC,YAAW,UAAWzgD,MAAX,EAAoB;;AAE9B,SAAOwgD,SAASC,SAAT,CAAoB,KAAK5xC,CAAzB,EAA4B,KAAKC,CAAjC,EAAoC,KAAK+C,CAAzC,EAA4C7R,MAA5C,CAAP;AAEA,EAvEiC;;AAyElCyhD,WAAU,UAAWzhD,MAAX,EAAoB;;AAE7B,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,oDAAd;AACAzO,YAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,SAAO/T,OAAOivB,qBAAP,CAA8B,KAAKpgB,CAAnC,EAAsC,KAAKC,CAA3C,EAA8C,KAAK+C,CAAnD,CAAP;AAEA,EApFiC;;AAsFlC8uC,eAAc,UAAWj2B,KAAX,EAAkB1qB,MAAlB,EAA2B;;AAExC,SAAOwgD,SAASG,YAAT,CAAuBj2B,KAAvB,EAA8B,KAAK7b,CAAnC,EAAsC,KAAKC,CAA3C,EAA8C,KAAK+C,CAAnD,EAAsD7R,MAAtD,CAAP;AAEA,EA1FiC;;AA4FlCsrB,gBAAe,UAAWZ,KAAX,EAAmB;;AAEjC,SAAO81B,SAASl1B,aAAT,CAAwBZ,KAAxB,EAA+B,KAAK7b,CAApC,EAAuC,KAAKC,CAA5C,EAA+C,KAAK+C,CAApD,CAAP;AAEA,EAhGiC;;AAkGlC4Z,gBAAe,UAAWnB,GAAX,EAAiB;;AAE/B,SAAOA,IAAI2B,kBAAJ,CAAwB,IAAxB,CAAP;AAEA,EAtGiC;;AAwGlCqxB,sBAAqB,YAAY;;AAEhC,MAAIvxB,QAAQ,IAAI+C,KAAJ,EAAZ;AACA,MAAI4yB,WAAW,CAAE,IAAI1B,KAAJ,EAAF,EAAe,IAAIA,KAAJ,EAAf,EAA4B,IAAIA,KAAJ,EAA5B,CAAf;AACA,MAAI2B,iBAAiB,IAAI5tC,OAAJ,EAArB;AACA,MAAI4X,eAAe,IAAI5X,OAAJ,EAAnB;;AAEA,SAAO,SAASupC,mBAAT,CAA8B5yB,KAA9B,EAAqC1qB,MAArC,EAA8C;;AAEpD,OAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,+DAAd;AACAzO,aAAS,IAAI+T,OAAJ,EAAT;AAEA;;AAED,OAAI6tC,cAAc34B,QAAlB;;AAEA;;AAEA8C,SAAMkD,qBAAN,CAA6B,KAAKpgB,CAAlC,EAAqC,KAAKC,CAA1C,EAA6C,KAAK+C,CAAlD;AACAka,SAAMqD,YAAN,CAAoB1E,KAApB,EAA2Bi3B,cAA3B;;AAEA;;AAEA,OAAK,KAAKr2B,aAAL,CAAoBq2B,cAApB,MAAyC,IAA9C,EAAqD;;AAEpD;;AAEA3hD,WAAOoO,IAAP,CAAauzC,cAAb;AAEA,IAND,MAMO;;AAEN;;AAEAD,aAAU,CAAV,EAAcj0C,GAAd,CAAmB,KAAKoB,CAAxB,EAA2B,KAAKC,CAAhC;AACA4yC,aAAU,CAAV,EAAcj0C,GAAd,CAAmB,KAAKqB,CAAxB,EAA2B,KAAK+C,CAAhC;AACA6vC,aAAU,CAAV,EAAcj0C,GAAd,CAAmB,KAAKoE,CAAxB,EAA2B,KAAKhD,CAAhC;;AAEA,SAAM,IAAInN,IAAI,CAAd,EAAiBA,IAAIggD,SAASrhD,MAA9B,EAAsCqB,GAAtC,EAA6C;;AAE5CggD,cAAUhgD,CAAV,EAAc47C,mBAAd,CAAmCqE,cAAnC,EAAmD,IAAnD,EAAyDh2B,YAAzD;;AAEA,SAAIsG,WAAW0vB,eAAejxC,iBAAf,CAAkCib,YAAlC,CAAf;;AAEA,SAAKsG,WAAW2vB,WAAhB,EAA8B;;AAE7BA,oBAAc3vB,QAAd;;AAEAjyB,aAAOoO,IAAP,CAAaud,YAAb;AAEA;AAED;AAED;;AAED,UAAO3rB,MAAP;AAEA,GApDD;AAsDA,EA7DoB,EAxGa;;AAuKlCmR,SAAQ,UAAW4b,QAAX,EAAsB;;AAE7B,SAAOA,SAASle,CAAT,CAAWsC,MAAX,CAAmB,KAAKtC,CAAxB,KAA+Bke,SAASje,CAAT,CAAWqC,MAAX,CAAmB,KAAKrC,CAAxB,CAA/B,IAA8Die,SAASlb,CAAT,CAAWV,MAAX,CAAmB,KAAKU,CAAxB,CAArE;AAEA;;AA3KiC,CAAnC;;AA+KA;;;;;;;AAOA,SAASgwC,IAAT,CAAe72B,QAAf,EAAyBof,QAAzB,EAAoC;;AAEnC5D,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,MAAZ;;AAEA,MAAKoqB,QAAL,GAAgBA,aAAajsB,SAAb,GAAyBisB,QAAzB,GAAoC,IAAIyqB,cAAJ,EAApD;AACA,MAAKrL,QAAL,GAAgBA,aAAarrC,SAAb,GAAyBqrC,QAAzB,GAAoC,IAAI8R,iBAAJ,CAAuB,EAAEthB,OAAO57B,KAAKiM,MAAL,KAAgB,QAAzB,EAAvB,CAApD;;AAEA,MAAK62C,QAAL,GAAgBj4C,iBAAhB;;AAEA,MAAKk4C,kBAAL;AAEA;;AAEDF,KAAKpiD,SAAL,GAAiBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAEpE0O,cAAa0zC,IAFuD;;AAIpEpR,SAAQ,IAJ4D;;AAMpEuR,cAAa,UAAW7iD,KAAX,EAAmB;;AAE/B,OAAK2iD,QAAL,GAAgB3iD,KAAhB;AAEA,EAVmE;;AAYpEiP,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBkmC,WAAS/mC,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,OAAKwhD,QAAL,GAAgBxhD,OAAOwhD,QAAvB;;AAEA,MAAKxhD,OAAO2hD,qBAAP,KAAiCljD,SAAtC,EAAkD;;AAEjD,QAAKkjD,qBAAL,GAA6B3hD,OAAO2hD,qBAAP,CAA6BxgD,KAA7B,EAA7B;AAEA;;AAED,MAAKnB,OAAO4hD,qBAAP,KAAiCnjD,SAAtC,EAAkD;;AAEjD,QAAKmjD,qBAAL,GAA6BxiD,OAAOK,MAAP,CAAe,EAAf,EAAmBO,OAAO4hD,qBAA1B,CAA7B;AAEA;;AAED,SAAO,IAAP;AAEA,EAhCmE;;AAkCpEH,qBAAoB,YAAY;;AAE/B,MAAI/2B,WAAW,KAAKA,QAApB;AACA,MAAIpf,CAAJ,EAAOu2C,EAAP,EAAWr9B,IAAX;;AAEA,MAAKkG,SAASG,gBAAd,EAAiC;;AAEhC,OAAIuqB,kBAAkB1qB,SAAS0qB,eAA/B;AACA,OAAI+B,OAAO/3C,OAAO+3C,IAAP,CAAa/B,eAAb,CAAX;;AAEA,OAAK+B,KAAKp3C,MAAL,GAAc,CAAnB,EAAuB;;AAEtB,QAAIq3C,iBAAiBhC,gBAAiB+B,KAAM,CAAN,CAAjB,CAArB;;AAEA,QAAKC,mBAAmB34C,SAAxB,EAAoC;;AAEnC,UAAKkjD,qBAAL,GAA6B,EAA7B;AACA,UAAKC,qBAAL,GAA6B,EAA7B;;AAEA,UAAMt2C,IAAI,CAAJ,EAAOu2C,KAAKzK,eAAer3C,MAAjC,EAAyCuL,IAAIu2C,EAA7C,EAAiDv2C,GAAjD,EAAwD;;AAEvDkZ,aAAO4yB,eAAgB9rC,CAAhB,EAAoBkZ,IAApB,IAA4Bs9B,OAAQx2C,CAAR,CAAnC;;AAEA,WAAKq2C,qBAAL,CAA2BhhD,IAA3B,CAAiC,CAAjC;AACA,WAAKihD,qBAAL,CAA4Bp9B,IAA5B,IAAqClZ,CAArC;AAEA;AAED;AAED;AAED,GA3BD,MA2BO;;AAEN,OAAI2gC,eAAevhB,SAASuhB,YAA5B;;AAEA,OAAKA,iBAAiBxtC,SAAjB,IAA8BwtC,aAAalsC,MAAb,GAAsB,CAAzD,EAA6D;;AAE5D,SAAK4hD,qBAAL,GAA6B,EAA7B;AACA,SAAKC,qBAAL,GAA6B,EAA7B;;AAEA,SAAMt2C,IAAI,CAAJ,EAAOu2C,KAAK5V,aAAalsC,MAA/B,EAAuCuL,IAAIu2C,EAA3C,EAA+Cv2C,GAA/C,EAAsD;;AAErDkZ,YAAOynB,aAAc3gC,CAAd,EAAkBkZ,IAAlB,IAA0Bs9B,OAAQx2C,CAAR,CAAjC;;AAEA,UAAKq2C,qBAAL,CAA2BhhD,IAA3B,CAAiC,CAAjC;AACA,UAAKihD,qBAAL,CAA4Bp9B,IAA5B,IAAqClZ,CAArC;AAEA;AAED;AAED;AAED,EAxFmE;;AA0FpE09B,UAAW,YAAY;;AAEtB,MAAI+Y,gBAAgB,IAAIrwC,OAAJ,EAApB;AACA,MAAImrC,MAAM,IAAIF,GAAJ,EAAV;AACA,MAAIrxB,SAAS,IAAIuB,MAAJ,EAAb;;AAEA,MAAIuhB,KAAK,IAAI36B,OAAJ,EAAT;AACA,MAAI46B,KAAK,IAAI56B,OAAJ,EAAT;AACA,MAAI66B,KAAK,IAAI76B,OAAJ,EAAT;;AAEA,MAAIuuC,QAAQ,IAAIvuC,OAAJ,EAAZ;AACA,MAAIwuC,QAAQ,IAAIxuC,OAAJ,EAAZ;AACA,MAAIyuC,QAAQ,IAAIzuC,OAAJ,EAAZ;;AAEA,MAAI0uC,MAAM,IAAIl1C,OAAJ,EAAV;AACA,MAAIm1C,MAAM,IAAIn1C,OAAJ,EAAV;AACA,MAAIo1C,MAAM,IAAIp1C,OAAJ,EAAV;;AAEA,MAAIq1C,YAAY,IAAI7uC,OAAJ,EAAhB;;AAEA,MAAI8uC,oBAAoB,IAAI9uC,OAAJ,EAAxB;AACA,MAAI+uC,yBAAyB,IAAI/uC,OAAJ,EAA7B;;AAEA,WAASgvC,cAAT,CAAyBr4B,KAAzB,EAAgCmC,EAAhC,EAAoCC,EAApC,EAAwCuD,EAAxC,EAA4C2yB,GAA5C,EAAiDjV,GAAjD,EAAsDkV,GAAtD,EAA4D;;AAE3DzC,YAASG,YAAT,CAAuBj2B,KAAvB,EAA8BmC,EAA9B,EAAkCC,EAAlC,EAAsCuD,EAAtC,EAA0CuyB,SAA1C;;AAEAI,OAAI5zC,cAAJ,CAAoBwzC,UAAUrjD,CAA9B;AACAwuC,OAAI3+B,cAAJ,CAAoBwzC,UAAUz2C,CAA9B;AACA82C,OAAI7zC,cAAJ,CAAoBwzC,UAAU/uC,CAA9B;;AAEAmvC,OAAI10C,GAAJ,CAASy/B,GAAT,EAAez/B,GAAf,CAAoB20C,GAApB;;AAEA,UAAOD,IAAI90C,KAAJ,EAAP;AAEA;;AAED,WAASg1C,iBAAT,CAA4B94B,MAA5B,EAAoCggB,QAApC,EAA8C+Y,SAA9C,EAAyDhG,GAAzD,EAA8DtG,EAA9D,EAAkEC,EAAlE,EAAsEC,EAAtE,EAA0ErsB,KAA1E,EAAkF;;AAEjF,OAAI0C,SAAJ;;AAEA,OAAKgd,SAASqP,IAAT,KAAkB92C,QAAvB,EAAkC;;AAEjCyqB,gBAAY+vB,IAAIqC,iBAAJ,CAAuBzI,EAAvB,EAA2BD,EAA3B,EAA+BD,EAA/B,EAAmC,IAAnC,EAAyCnsB,KAAzC,CAAZ;AAEA,IAJD,MAIO;;AAEN0C,gBAAY+vB,IAAIqC,iBAAJ,CAAuB3I,EAAvB,EAA2BC,EAA3B,EAA+BC,EAA/B,EAAmC3M,SAASqP,IAAT,KAAkB72C,UAArD,EAAiE8nB,KAAjE,CAAZ;AAEA;;AAED,OAAK0C,cAAc,IAAnB,EAA0B,OAAO,IAAP;;AAE1B01B,0BAAuB10C,IAAvB,CAA6Bsc,KAA7B;AACAo4B,0BAAuB3qC,YAAvB,CAAqCiS,OAAOvI,WAA5C;;AAEA,OAAIoQ,WAAWkxB,UAAUhG,GAAV,CAAcD,MAAd,CAAqBzsC,UAArB,CAAiCqyC,sBAAjC,CAAf;;AAEA,OAAK7wB,WAAWkxB,UAAUhnC,IAArB,IAA6B8V,WAAWkxB,UAAU/mC,GAAvD,EAA6D,OAAO,IAAP;;AAE7D,UAAO;AACN6V,cAAUA,QADJ;AAENvH,WAAOo4B,uBAAuB50C,KAAvB,EAFD;AAGNkc,YAAQA;AAHF,IAAP;AAMA;;AAED,WAASg5B,+BAAT,CAA0Ch5B,MAA1C,EAAkD+4B,SAAlD,EAA6DhG,GAA7D,EAAkEjjC,QAAlE,EAA4EmN,EAA5E,EAAgFxY,CAAhF,EAAmFC,CAAnF,EAAsF+C,CAAtF,EAA0F;;AAEzF68B,MAAGn9B,mBAAH,CAAwB2I,QAAxB,EAAkCrL,CAAlC;AACA8/B,MAAGp9B,mBAAH,CAAwB2I,QAAxB,EAAkCpL,CAAlC;AACA8/B,MAAGr9B,mBAAH,CAAwB2I,QAAxB,EAAkCrI,CAAlC;;AAEA,OAAIwxC,eAAeH,kBAAmB94B,MAAnB,EAA2BA,OAAOggB,QAAlC,EAA4C+Y,SAA5C,EAAuDhG,GAAvD,EAA4DzO,EAA5D,EAAgEC,EAAhE,EAAoEC,EAApE,EAAwEiU,iBAAxE,CAAnB;;AAEA,OAAKQ,YAAL,EAAoB;;AAEnB,QAAKh8B,EAAL,EAAU;;AAETo7B,SAAIlxC,mBAAJ,CAAyB8V,EAAzB,EAA6BxY,CAA7B;AACA6zC,SAAInxC,mBAAJ,CAAyB8V,EAAzB,EAA6BvY,CAA7B;AACA6zC,SAAIpxC,mBAAJ,CAAyB8V,EAAzB,EAA6BxV,CAA7B;;AAEAwxC,kBAAah8B,EAAb,GAAkB07B,eAAgBF,iBAAhB,EAAmCnU,EAAnC,EAAuCC,EAAvC,EAA2CC,EAA3C,EAA+C6T,GAA/C,EAAoDC,GAApD,EAAyDC,GAAzD,CAAlB;AAEA;;AAED,QAAItV,OAAO,IAAIvB,KAAJ,CAAWj9B,CAAX,EAAcC,CAAd,EAAiB+C,CAAjB,CAAX;AACA2uC,aAASC,SAAT,CAAoB/R,EAApB,EAAwBC,EAAxB,EAA4BC,EAA5B,EAAgCvB,KAAK1qB,MAArC;;AAEA0gC,iBAAahW,IAAb,GAAoBA,IAApB;AAEA;;AAED,UAAOgW,YAAP;AAEA;;AAED,SAAO,SAAS/Z,OAAT,CAAkB6Z,SAAlB,EAA6BG,UAA7B,EAA0C;;AAEhD,OAAIt4B,WAAW,KAAKA,QAApB;AACA,OAAIof,WAAW,KAAKA,QAApB;AACA,OAAIvoB,cAAc,KAAKA,WAAvB;;AAEA,OAAKuoB,aAAarrC,SAAlB,EAA8B;;AAE9B;;AAEA,OAAKisB,SAAS4G,cAAT,KAA4B,IAAjC,EAAwC5G,SAAS6G,qBAAT;;AAExCjG,UAAOxd,IAAP,CAAa4c,SAAS4G,cAAtB;AACAhG,UAAOzT,YAAP,CAAqB0J,WAArB;;AAEA,OAAKshC,UAAUhG,GAAV,CAAczxB,gBAAd,CAAgCE,MAAhC,MAA6C,KAAlD,EAA0D;;AAE1D;;AAEAy2B,iBAAc5pC,UAAd,CAA0BoJ,WAA1B;AACAs7B,OAAI/uC,IAAJ,CAAU+0C,UAAUhG,GAApB,EAA0BhlC,YAA1B,CAAwCkqC,aAAxC;;AAEA;;AAEA,OAAKr3B,SAAS4hB,WAAT,KAAyB,IAA9B,EAAqC;;AAEpC,QAAKuQ,IAAI1xB,aAAJ,CAAmBT,SAAS4hB,WAA5B,MAA8C,KAAnD,EAA2D;AAE3D;;AAED,OAAIyW,YAAJ;;AAEA,OAAKr4B,SAASG,gBAAd,EAAiC;;AAEhC,QAAItc,CAAJ,EAAOC,CAAP,EAAU+C,CAAV;AACA,QAAI1R,QAAQ6qB,SAAS7qB,KAArB;AACA,QAAI+Z,WAAW8Q,SAASI,UAAT,CAAoBlR,QAAnC;AACA,QAAImN,KAAK2D,SAASI,UAAT,CAAoB/D,EAA7B;AACA,QAAI3lB,CAAJ,EAAOC,CAAP;;AAEA,QAAKxB,UAAU,IAAf,EAAsB;;AAErB;;AAEA,UAAMuB,IAAI,CAAJ,EAAOC,IAAIxB,MAAM8X,KAAvB,EAA8BvW,IAAIC,CAAlC,EAAqCD,KAAK,CAA1C,EAA8C;;AAE7CmN,UAAI1O,MAAMsR,IAAN,CAAY/P,CAAZ,CAAJ;AACAoN,UAAI3O,MAAMsR,IAAN,CAAY/P,IAAI,CAAhB,CAAJ;AACAmQ,UAAI1R,MAAMsR,IAAN,CAAY/P,IAAI,CAAhB,CAAJ;;AAEA2hD,qBAAeD,gCAAiC,IAAjC,EAAuCD,SAAvC,EAAkDhG,GAAlD,EAAuDjjC,QAAvD,EAAiEmN,EAAjE,EAAqExY,CAArE,EAAwEC,CAAxE,EAA2E+C,CAA3E,CAAf;;AAEA,UAAKwxC,YAAL,EAAoB;;AAEnBA,oBAAaE,SAAb,GAAyBvkD,KAAKK,KAAL,CAAYqC,IAAI,CAAhB,CAAzB,CAFmB,CAE2B;AAC9C4hD,kBAAWriD,IAAX,CAAiBoiD,YAAjB;AAEA;AAED;AAED,KArBD,MAqBO,IAAKnpC,aAAanb,SAAlB,EAA8B;;AAEpC;;AAEA,UAAM2C,IAAI,CAAJ,EAAOC,IAAIuY,SAASjC,KAA1B,EAAiCvW,IAAIC,CAArC,EAAwCD,KAAK,CAA7C,EAAiD;;AAEhDmN,UAAInN,CAAJ;AACAoN,UAAIpN,IAAI,CAAR;AACAmQ,UAAInQ,IAAI,CAAR;;AAEA2hD,qBAAeD,gCAAiC,IAAjC,EAAuCD,SAAvC,EAAkDhG,GAAlD,EAAuDjjC,QAAvD,EAAiEmN,EAAjE,EAAqExY,CAArE,EAAwEC,CAAxE,EAA2E+C,CAA3E,CAAf;;AAEA,UAAKwxC,YAAL,EAAoB;;AAEnBA,oBAAaE,SAAb,GAAyBvkD,KAAKK,KAAL,CAAYqC,IAAI,CAAhB,CAAzB,CAFmB,CAE2B;AAC9C4hD,kBAAWriD,IAAX,CAAiBoiD,YAAjB;AAEA;AAED;AAED;AAED,IApDD,MAoDO,IAAKr4B,SAASC,UAAd,EAA2B;;AAEjC,QAAIu4B,GAAJ,EAASC,GAAT,EAAcC,GAAd;AACA,QAAIC,kBAAkB9pB,MAAMC,OAAN,CAAesQ,QAAf,CAAtB;;AAEA,QAAIlf,WAAWF,SAASE,QAAxB;AACA,QAAImhB,QAAQrhB,SAASqhB,KAArB;AACA,QAAIwB,GAAJ;;AAEA,QAAIvB,gBAAgBthB,SAASshB,aAAT,CAAwB,CAAxB,CAApB;AACA,QAAKA,cAAcjsC,MAAd,GAAuB,CAA5B,EAAgCwtC,MAAMvB,aAAN;;AAEhC,SAAM,IAAI/3B,IAAI,CAAR,EAAWk6B,KAAKpC,MAAMhsC,MAA5B,EAAoCkU,IAAIk6B,EAAxC,EAA4Cl6B,GAA5C,EAAmD;;AAElD,SAAI84B,OAAOhB,MAAO93B,CAAP,CAAX;AACA,SAAIqvC,eAAeD,kBAAkBvZ,SAAUiD,KAAKtB,aAAf,CAAlB,GAAmD3B,QAAtE;;AAEA,SAAKwZ,iBAAiB7kD,SAAtB,EAAkC;;AAElCykD,WAAMt4B,SAAUmiB,KAAKx+B,CAAf,CAAN;AACA40C,WAAMv4B,SAAUmiB,KAAKv+B,CAAf,CAAN;AACA40C,WAAMx4B,SAAUmiB,KAAKx7B,CAAf,CAAN;;AAEA,SAAK+xC,aAAarX,YAAb,KAA8B,IAAnC,EAA0C;;AAEzC,UAAIA,eAAevhB,SAASuhB,YAA5B;AACA,UAAIsX,kBAAkB,KAAK5B,qBAA3B;;AAEAvT,SAAGjhC,GAAH,CAAQ,CAAR,EAAW,CAAX,EAAc,CAAd;AACAkhC,SAAGlhC,GAAH,CAAQ,CAAR,EAAW,CAAX,EAAc,CAAd;AACAmhC,SAAGnhC,GAAH,CAAQ,CAAR,EAAW,CAAX,EAAc,CAAd;;AAEA,WAAM,IAAIrB,IAAI,CAAR,EAAW03C,KAAKvX,aAAalsC,MAAnC,EAA2C+L,IAAI03C,EAA/C,EAAmD13C,GAAnD,EAA0D;;AAEzD,WAAI23C,YAAYF,gBAAiBz3C,CAAjB,CAAhB;;AAEA,WAAK23C,cAAc,CAAnB,EAAuB;;AAEvB,WAAIC,UAAUzX,aAAcngC,CAAd,EAAkB8e,QAAhC;;AAEAwjB,UAAG3/B,eAAH,CAAoBuzC,MAAMrzC,UAAN,CAAkB+0C,QAAS3W,KAAKx+B,CAAd,CAAlB,EAAqC20C,GAArC,CAApB,EAAgEO,SAAhE;AACApV,UAAG5/B,eAAH,CAAoBwzC,MAAMtzC,UAAN,CAAkB+0C,QAAS3W,KAAKv+B,CAAd,CAAlB,EAAqC20C,GAArC,CAApB,EAAgEM,SAAhE;AACAnV,UAAG7/B,eAAH,CAAoByzC,MAAMvzC,UAAN,CAAkB+0C,QAAS3W,KAAKx7B,CAAd,CAAlB,EAAqC6xC,GAArC,CAApB,EAAgEK,SAAhE;AAEA;;AAEDrV,SAAGpgC,GAAH,CAAQk1C,GAAR;AACA7U,SAAGrgC,GAAH,CAAQm1C,GAAR;AACA7U,SAAGtgC,GAAH,CAAQo1C,GAAR;;AAEAF,YAAM9U,EAAN;AACA+U,YAAM9U,EAAN;AACA+U,YAAM9U,EAAN;AAEA;;AAEDyU,oBAAeH,kBAAmB,IAAnB,EAAyBU,YAAzB,EAAuCT,SAAvC,EAAkDhG,GAAlD,EAAuDqG,GAAvD,EAA4DC,GAA5D,EAAiEC,GAAjE,EAAsEb,iBAAtE,CAAf;;AAEA,SAAKQ,YAAL,EAAoB;;AAEnB,UAAKxV,OAAOA,IAAKt5B,CAAL,CAAZ,EAAuB;;AAEtB,WAAI0vC,QAAQpW,IAAKt5B,CAAL,CAAZ;AACAkuC,WAAIr0C,IAAJ,CAAU61C,MAAO,CAAP,CAAV;AACAvB,WAAIt0C,IAAJ,CAAU61C,MAAO,CAAP,CAAV;AACAtB,WAAIv0C,IAAJ,CAAU61C,MAAO,CAAP,CAAV;;AAEAZ,oBAAah8B,EAAb,GAAkB07B,eAAgBF,iBAAhB,EAAmCW,GAAnC,EAAwCC,GAAxC,EAA6CC,GAA7C,EAAkDjB,GAAlD,EAAuDC,GAAvD,EAA4DC,GAA5D,CAAlB;AAEA;;AAEDU,mBAAahW,IAAb,GAAoBA,IAApB;AACAgW,mBAAaE,SAAb,GAAyBhvC,CAAzB;AACA+uC,iBAAWriD,IAAX,CAAiBoiD,YAAjB;AAEA;AAED;AAED;AAED,GArKD;AAuKA,EA1QU,EA1FyD;;AAsWpEn1C,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAK6c,QAA3B,EAAqC,KAAKof,QAA1C,EAAqDh8B,IAArD,CAA2D,IAA3D,CAAP;AAEA;;AA1WmE,CAApD,CAAjB;;AA8WA;;;;AAIA,SAAS81C,eAAT,CAA0BC,QAA1B,EAAoCC,KAApC,EAA2CC,OAA3C,EAAoDtJ,kBAApD,EAAyE;;AAExE,KAAIuJ,aAAa,IAAItqB,KAAJ,CAAW,QAAX,CAAjB;AACA,KAAIuqB,aAAa,CAAjB;;AAEA,KAAIC,WAAJ,EAAiBC,SAAjB;AACA,KAAIC,OAAJ;;AAEA,UAASC,MAAT,CAAiBC,UAAjB,EAA6BC,KAA7B,EAAoCljC,MAApC,EAA4CmjC,UAA5C,EAAyD;;AAExD,MAAIC,aAAaF,MAAME,UAAvB;;AAEA,MAAKA,eAAe,IAApB,EAA2B;;AAE1BC,YAAUV,UAAV,EAAsBC,UAAtB;AAEA,GAJD,MAIO,IAAKQ,cAAcA,WAAWnrB,OAA9B,EAAwC;;AAE9CorB,YAAUD,UAAV,EAAsB,CAAtB;AACAD,gBAAa,IAAb;AAEA;;AAED,MAAKX,SAASc,SAAT,IAAsBH,UAA3B,EAAwC;;AAEvCX,YAASe,KAAT,CAAgBf,SAASgB,cAAzB,EAAyChB,SAASiB,cAAlD,EAAkEjB,SAASkB,gBAA3E;AAEA;;AAED,MAAKN,cAAcA,WAAWO,aAA9B,EAA8C;;AAE7C,OAAKZ,YAAY3lD,SAAjB,EAA6B;;AAE5B2lD,cAAU,IAAI7C,IAAJ,CACT,IAAI9J,iBAAJ,CAAuB,CAAvB,EAA0B,CAA1B,EAA6B,CAA7B,CADS,EAET,IAAIsE,cAAJ,CAAoB;AACnB/iB,eAAUgH,UAAUiB,IAAV,CAAejI,QADN;AAEnBkH,mBAAcF,UAAUiB,IAAV,CAAef,YAFV;AAGnBC,qBAAgBH,UAAUiB,IAAV,CAAed,cAHZ;AAInBgZ,WAAM92C,QAJa;AAKnBw3C,gBAAW,IALQ;AAMnBC,iBAAY,KANO;AAOnB5b,UAAK;AAPc,KAApB,CAFS,CAAV;;AAaAkmB,YAAQ15B,QAAR,CAAiBgrB,eAAjB,CAAkC,QAAlC;AACA0O,YAAQ15B,QAAR,CAAiBgrB,eAAjB,CAAkC,IAAlC;;AAEA0O,YAAQjd,cAAR,GAAyB,UAAW0c,QAAX,EAAqBU,KAArB,EAA4BljC,MAA5B,EAAqC;;AAE7D,UAAKE,WAAL,CAAiBvO,YAAjB,CAA+BqO,OAAOE,WAAtC;AAEA,KAJD;;AAMAwiC,YAAQnmC,MAAR,CAAgBwmC,OAAhB;AAEA;;AAEDA,WAAQta,QAAR,CAAiB9Q,QAAjB,CAA0BkI,KAA1B,CAAgCriC,KAAhC,GAAwC4lD,UAAxC;;AAEAH,cAAW3jD,IAAX,CAAiByjD,OAAjB,EAA0BA,QAAQ15B,QAAlC,EAA4C05B,QAAQta,QAApD,EAA8D,CAA9D,EAAiE,IAAjE;AAEA,GAlCD,MAkCO,IAAK2a,cAAcA,WAAWp/B,SAA9B,EAA0C;;AAEhD,OAAK6+B,gBAAgBzlD,SAArB,EAAiC;;AAEhCylD,kBAAc,IAAI1Z,kBAAJ,CAAwB,CAAE,CAA1B,EAA6B,CAA7B,EAAgC,CAAhC,EAAmC,CAAE,CAArC,EAAwC,CAAxC,EAA2C,CAA3C,CAAd;;AAEA2Z,gBAAY,IAAI5C,IAAJ,CACX,IAAI5I,mBAAJ,CAAyB,CAAzB,EAA4B,CAA5B,CADW,EAEX,IAAIiD,iBAAJ,CAAuB,EAAE/B,WAAW,KAAb,EAAoBC,YAAY,KAAhC,EAAuC5b,KAAK,KAA5C,EAAvB,CAFW,CAAZ;;AAKA6lB,YAAQnmC,MAAR,CAAgBumC,SAAhB;AAEA;;AAEDA,aAAUra,QAAV,CAAmB/N,GAAnB,GAAyB0oB,UAAzB;;AAEA;;AAEAZ,YAASoB,kBAAT,CAA6Bf,WAA7B,EAA0C,IAA1C,EAAgDC,UAAUz5B,QAA1D,EAAoEy5B,UAAUra,QAA9E,EAAwFqa,SAAxF,EAAmG,IAAnG;AAEA;AAED;;AAED,UAASO,QAAT,CAAmBpqB,KAAnB,EAA0B7pB,KAA1B,EAAkC;;AAEjCqzC,QAAMrhB,OAAN,CAAcnI,KAAd,CAAoBoqB,QAApB,CAA8BpqB,MAAMtb,CAApC,EAAuCsb,MAAMnX,CAA7C,EAAgDmX,MAAM9rB,CAAtD,EAAyDiC,KAAzD,EAAgEgqC,kBAAhE;AAEA;;AAED,QAAO;;AAENyK,iBAAe,YAAY;;AAE1B,UAAOlB,UAAP;AAEA,GANK;AAONmB,iBAAe,UAAW7qB,KAAX,EAAkB7pB,KAAlB,EAA0B;;AAExCuzC,cAAW72C,GAAX,CAAgBmtB,KAAhB;AACA2pB,gBAAaxzC,UAAUhS,SAAV,GAAsBgS,KAAtB,GAA8B,CAA3C;AACAi0C,YAAUV,UAAV,EAAsBC,UAAtB;AAEA,GAbK;AAcNmB,iBAAe,YAAY;;AAE1B,UAAOnB,UAAP;AAEA,GAlBK;AAmBNoB,iBAAe,UAAW50C,KAAX,EAAmB;;AAEjCwzC,gBAAaxzC,KAAb;AACAi0C,YAAUV,UAAV,EAAsBC,UAAtB;AAEA,GAxBK;AAyBNI,UAAQA;;AAzBF,EAAP;AA6BA;;AAED;;;;AAIA,SAASiB,mBAAT,CAA8B9iB,EAA9B,EAAkC0Z,UAAlC,EAA8CqJ,IAA9C,EAAqD;;AAEpD,KAAIC,IAAJ;;AAEA,UAASC,OAAT,CAAkB5mD,KAAlB,EAA0B;;AAEzB2mD,SAAO3mD,KAAP;AAEA;;AAED,UAASwlD,MAAT,CAAiBj1B,KAAjB,EAAwBzX,KAAxB,EAAgC;;AAE/B6qB,KAAGkjB,UAAH,CAAeF,IAAf,EAAqBp2B,KAArB,EAA4BzX,KAA5B;;AAEA4tC,OAAK3nC,MAAL,CAAajG,KAAb,EAAoB6tC,IAApB;AAEA;;AAED,UAASG,eAAT,CAA0Bj7B,QAA1B,EAAoC0E,KAApC,EAA2CzX,KAA3C,EAAmD;;AAElD,MAAIiuC,YAAY1J,WAAW58C,GAAX,CAAgB,wBAAhB,CAAhB;;AAEA,MAAKsmD,cAAc,IAAnB,EAA0B;;AAEzB13C,WAAQyD,KAAR,CAAe,gIAAf;AACA;AAEA;;AAEDi0C,YAAUC,wBAAV,CAAoCL,IAApC,EAA0Cp2B,KAA1C,EAAiDzX,KAAjD,EAAwD+S,SAASo7B,iBAAjE;;AAEAP,OAAK3nC,MAAL,CAAajG,KAAb,EAAoB6tC,IAApB,EAA0B96B,SAASo7B,iBAAnC;AAEA;;AAED;;AAEA,MAAKL,OAAL,GAAeA,OAAf;AACA,MAAKpB,MAAL,GAAcA,MAAd;AACA,MAAKsB,eAAL,GAAuBA,eAAvB;AAEA;;AAED;;;;AAIA,SAASI,iBAAT,CAA4BvjB,EAA5B,EAAgC0Z,UAAhC,EAA4CtS,UAA5C,EAAyD;;AAExD,KAAIoc,aAAJ;;AAEA,UAASC,gBAAT,GAA4B;;AAE3B,MAAKD,kBAAkBvnD,SAAvB,EAAmC,OAAOunD,aAAP;;AAEnC,MAAIJ,YAAY1J,WAAW58C,GAAX,CAAgB,gCAAhB,CAAhB;;AAEA,MAAKsmD,cAAc,IAAnB,EAA0B;;AAEzBI,mBAAgBxjB,GAAGtX,YAAH,CAAiB06B,UAAUM,8BAA3B,CAAhB;AAEA,GAJD,MAIO;;AAENF,mBAAgB,CAAhB;AAEA;;AAED,SAAOA,aAAP;AAEA;;AAED,UAASG,eAAT,CAA0B1V,SAA1B,EAAsC;;AAErC,MAAKA,cAAc,OAAnB,EAA6B;;AAE5B,OAAKjO,GAAG4jB,wBAAH,CAA6B5jB,GAAG6jB,aAAhC,EAA+C7jB,GAAG8jB,UAAlD,EAA+D7V,SAA/D,GAA2E,CAA3E,IACAjO,GAAG4jB,wBAAH,CAA6B5jB,GAAG+jB,eAAhC,EAAiD/jB,GAAG8jB,UAApD,EAAiE7V,SAAjE,GAA6E,CADlF,EACsF;;AAErF,WAAO,OAAP;AAEA;;AAEDA,eAAY,SAAZ;AAEA;;AAED,MAAKA,cAAc,SAAnB,EAA+B;;AAE9B,OAAKjO,GAAG4jB,wBAAH,CAA6B5jB,GAAG6jB,aAAhC,EAA+C7jB,GAAGgkB,YAAlD,EAAiE/V,SAAjE,GAA6E,CAA7E,IACAjO,GAAG4jB,wBAAH,CAA6B5jB,GAAG+jB,eAAhC,EAAiD/jB,GAAGgkB,YAApD,EAAmE/V,SAAnE,GAA+E,CADpF,EACwF;;AAEvF,WAAO,SAAP;AAEA;AAED;;AAED,SAAO,MAAP;AAEA;;AAED,KAAIA,YAAY7G,WAAW6G,SAAX,KAAyBhyC,SAAzB,GAAqCmrC,WAAW6G,SAAhD,GAA4D,OAA5E;AACA,KAAIgW,eAAeN,gBAAiB1V,SAAjB,CAAnB;;AAEA,KAAKgW,iBAAiBhW,SAAtB,EAAkC;;AAEjCviC,UAAQC,IAAR,CAAc,sBAAd,EAAsCsiC,SAAtC,EAAiD,sBAAjD,EAAyEgW,YAAzE,EAAuF,UAAvF;AACAhW,cAAYgW,YAAZ;AAEA;;AAED,KAAIC,yBAAyB9c,WAAW8c,sBAAX,KAAsC,IAAnE;;AAEA,KAAIC,cAAcnkB,GAAGtX,YAAH,CAAiBsX,GAAGokB,uBAApB,CAAlB;AACA,KAAIC,oBAAoBrkB,GAAGtX,YAAH,CAAiBsX,GAAGskB,8BAApB,CAAxB;AACA,KAAIC,iBAAiBvkB,GAAGtX,YAAH,CAAiBsX,GAAGwkB,gBAApB,CAArB;AACA,KAAIC,iBAAiBzkB,GAAGtX,YAAH,CAAiBsX,GAAG0kB,yBAApB,CAArB;;AAEA,KAAIC,gBAAgB3kB,GAAGtX,YAAH,CAAiBsX,GAAG4kB,kBAApB,CAApB;AACA,KAAIC,oBAAoB7kB,GAAGtX,YAAH,CAAiBsX,GAAG8kB,0BAApB,CAAxB;AACA,KAAIC,cAAc/kB,GAAGtX,YAAH,CAAiBsX,GAAGglB,mBAApB,CAAlB;AACA,KAAIC,sBAAsBjlB,GAAGtX,YAAH,CAAiBsX,GAAGklB,4BAApB,CAA1B;;AAEA,KAAIC,iBAAiBd,oBAAoB,CAAzC;AACA,KAAIe,wBAAwB,CAAC,CAAE1L,WAAW58C,GAAX,CAAgB,mBAAhB,CAA/B;AACA,KAAIuoD,sBAAsBF,kBAAkBC,qBAA5C;;AAEA,QAAO;;AAEN3B,oBAAkBA,gBAFZ;AAGNE,mBAAiBA,eAHX;;AAKN1V,aAAWA,SALL;AAMNiW,0BAAwBA,sBANlB;;AAQNC,eAAaA,WARP;AASNE,qBAAmBA,iBATb;AAUNE,kBAAgBA,cAVV;AAWNE,kBAAgBA,cAXV;;AAaNE,iBAAeA,aAbT;AAcNE,qBAAmBA,iBAdb;AAeNE,eAAaA,WAfP;AAgBNE,uBAAqBA,mBAhBf;;AAkBNE,kBAAgBA,cAlBV;AAmBNC,yBAAuBA,qBAnBjB;AAoBNC,uBAAqBA;;AApBf,EAAP;AAwBA;;AAED;;;;AAIA,SAASC,aAAT,GAAyB;;AAExB,KAAIv9B,QAAQ,IAAZ;AAAA,KAECw9B,cAAc,IAFf;AAAA,KAGCC,kBAAkB,CAHnB;AAAA,KAICC,uBAAuB,KAJxB;AAAA,KAKCC,mBAAmB,KALpB;AAAA,KAOCz8B,QAAQ,IAAI+C,KAAJ,EAPT;AAAA,KAQC25B,mBAAmB,IAAInlC,OAAJ,EARpB;AAAA,KAUColC,UAAU,EAAEvpD,OAAO,IAAT,EAAei3C,aAAa,KAA5B,EAVX;;AAYA,MAAKsS,OAAL,GAAeA,OAAf;AACA,MAAKC,SAAL,GAAiB,CAAjB;AACA,MAAKC,eAAL,GAAuB,CAAvB;;AAEA,MAAKC,IAAL,GAAY,UAAWr4B,MAAX,EAAmBs4B,mBAAnB,EAAwCnnC,MAAxC,EAAiD;;AAE5D,MAAI2pB,UACH9a,OAAOnwB,MAAP,KAAkB,CAAlB,IACAyoD,mBADA;AAEA;AACA;AACAR,sBAAoB,CAJpB,IAKAC,oBAND;;AAQAA,yBAAuBO,mBAAvB;;AAEAT,gBAAcU,cAAev4B,MAAf,EAAuB7O,MAAvB,EAA+B,CAA/B,CAAd;AACA2mC,oBAAkB93B,OAAOnwB,MAAzB;;AAEA,SAAOirC,OAAP;AAEA,EAjBD;;AAmBA,MAAK0d,YAAL,GAAoB,YAAY;;AAE/BR,qBAAmB,IAAnB;AACAO,gBAAe,IAAf;AAEA,EALD;;AAOA,MAAKE,UAAL,GAAkB,YAAY;;AAE7BT,qBAAmB,KAAnB;AACAU;AAEA,EALD;;AAOA,MAAKC,QAAL,GAAgB,UAAW34B,MAAX,EAAmB8pB,gBAAnB,EAAqCC,WAArC,EAAkD54B,MAAlD,EAA0D4oB,KAA1D,EAAiE6e,SAAjE,EAA6E;;AAE5F,MAAK,CAAEb,oBAAF,IAA0B/3B,WAAW,IAArC,IAA6CA,OAAOnwB,MAAP,KAAkB,CAA/D,IAAoEmoD,oBAAoB,CAAEjO,WAA/F,EAA6G;;AAE5G;;AAEA,OAAKiO,gBAAL,EAAwB;;AAEvB;;AAEAO,kBAAe,IAAf;AAEA,IAND,MAMO;;AAENG;AAEA;AAED,GAhBD,MAgBO;;AAEN,OAAIG,UAAUb,mBAAmB,CAAnB,GAAuBF,eAArC;AAAA,OACCgB,UAAUD,UAAU,CADrB;AAAA,OAGCE,WAAWhf,MAAMif,aAAN,IAAuB,IAHnC;;AAKAd,WAAQvpD,KAAR,GAAgBoqD,QAAhB,CAPM,CAOoB;;AAE1BA,cAAWR,cAAev4B,MAAf,EAAuB7O,MAAvB,EAA+B2nC,OAA/B,EAAwCF,SAAxC,CAAX;;AAEA,QAAM,IAAI1nD,IAAI,CAAd,EAAiBA,MAAM4nD,OAAvB,EAAgC,EAAG5nD,CAAnC,EAAuC;;AAEtC6nD,aAAU7nD,CAAV,IAAgB2mD,YAAa3mD,CAAb,CAAhB;AAEA;;AAED6oC,SAAMif,aAAN,GAAsBD,QAAtB;AACA,QAAKX,eAAL,GAAuBtO,mBAAmB,KAAKqO,SAAxB,GAAoC,CAA3D;AACA,QAAKA,SAAL,IAAkBU,OAAlB;AAEA;AAGD,EA1CD;;AA4CA,UAASH,gBAAT,GAA4B;;AAE3B,MAAKR,QAAQvpD,KAAR,KAAkBkpD,WAAvB,EAAqC;;AAEpCK,WAAQvpD,KAAR,GAAgBkpD,WAAhB;AACAK,WAAQtS,WAAR,GAAsBkS,kBAAkB,CAAxC;AAEA;;AAEDz9B,QAAM89B,SAAN,GAAkBL,eAAlB;AACAz9B,QAAM+9B,eAAN,GAAwB,CAAxB;AAEA;;AAED,UAASG,aAAT,CAAwBv4B,MAAxB,EAAgC7O,MAAhC,EAAwC5E,SAAxC,EAAmD0sC,aAAnD,EAAmE;;AAElE,MAAIC,UAAUl5B,WAAW,IAAX,GAAkBA,OAAOnwB,MAAzB,GAAkC,CAAhD;AAAA,MACCkpD,WAAW,IADZ;;AAGA,MAAKG,YAAY,CAAjB,EAAqB;;AAEpBH,cAAWb,QAAQvpD,KAAnB;;AAEA,OAAKsqD,kBAAkB,IAAlB,IAA0BF,aAAa,IAA5C,EAAmD;;AAElD,QAAII,WAAW5sC,YAAY2sC,UAAU,CAArC;AAAA,QACCE,aAAajoC,OAAOkpB,kBADrB;;AAGA4d,qBAAiB/kC,eAAjB,CAAkCkmC,UAAlC;;AAEA,QAAKL,aAAa,IAAb,IAAqBA,SAASlpD,MAAT,GAAkBspD,QAA5C,EAAuD;;AAEtDJ,gBAAW,IAAI3lB,YAAJ,CAAkB+lB,QAAlB,CAAX;AAEA;;AAED,SAAM,IAAIjoD,IAAI,CAAR,EAAWmoD,KAAK9sC,SAAtB,EAAiCrb,MAAMgoD,OAAvC,EAAgD,EAAGhoD,CAAH,EAAMmoD,MAAM,CAA5D,EAAgE;;AAE/D99B,WAAM3d,IAAN,CAAYoiB,OAAQ9uB,CAAR,CAAZ,EAA0ByW,YAA1B,CAAwCyxC,UAAxC,EAAoDnB,gBAApD;;AAEA18B,WAAMpJ,MAAN,CAAarR,OAAb,CAAsBi4C,QAAtB,EAAgCM,EAAhC;AACAN,cAAUM,KAAK,CAAf,IAAqB99B,MAAMC,QAA3B;AAEA;AAED;;AAED08B,WAAQvpD,KAAR,GAAgBoqD,QAAhB;AACAb,WAAQtS,WAAR,GAAsB,IAAtB;AAEA;;AAEDvrB,QAAM89B,SAAN,GAAkBe,OAAlB;;AAEA,SAAOH,QAAP;AAEA;AAED;;AAED;;;;AAIA,SAASO,eAAT,CAA0BhnB,EAA1B,EAA+B;;AAE9B,KAAI0Z,aAAa,EAAjB;;AAEA,QAAO;;AAEN58C,OAAK,UAAWklB,IAAX,EAAkB;;AAEtB,OAAK03B,WAAY13B,IAAZ,MAAuB/lB,SAA5B,EAAwC;;AAEvC,WAAOy9C,WAAY13B,IAAZ,CAAP;AAEA;;AAED,OAAIohC,SAAJ;;AAEA,WAASphC,IAAT;;AAEC,SAAK,qBAAL;AACCohC,iBAAYpjB,GAAGinB,YAAH,CAAiB,qBAAjB,KAA4CjnB,GAAGinB,YAAH,CAAiB,yBAAjB,CAA5C,IAA4FjnB,GAAGinB,YAAH,CAAiB,4BAAjB,CAAxG;AACA;;AAED,SAAK,gCAAL;AACC7D,iBAAYpjB,GAAGinB,YAAH,CAAiB,gCAAjB,KAAuDjnB,GAAGinB,YAAH,CAAiB,oCAAjB,CAAvD,IAAkHjnB,GAAGinB,YAAH,CAAiB,uCAAjB,CAA9H;AACA;;AAED,SAAK,+BAAL;AACC7D,iBAAYpjB,GAAGinB,YAAH,CAAiB,+BAAjB,KAAsDjnB,GAAGinB,YAAH,CAAiB,mCAAjB,CAAtD,IAAgHjnB,GAAGinB,YAAH,CAAiB,sCAAjB,CAA5H;AACA;;AAED,SAAK,gCAAL;AACC7D,iBAAYpjB,GAAGinB,YAAH,CAAiB,gCAAjB,KAAuDjnB,GAAGinB,YAAH,CAAiB,uCAAjB,CAAnE;AACA;;AAED;AACC7D,iBAAYpjB,GAAGinB,YAAH,CAAiBjlC,IAAjB,CAAZ;;AAnBF;;AAuBA,OAAKohC,cAAc,IAAnB,EAA0B;;AAEzB13C,YAAQC,IAAR,CAAc,0BAA0BqW,IAA1B,GAAiC,2BAA/C;AAEA;;AAED03B,cAAY13B,IAAZ,IAAqBohC,SAArB;;AAEA,UAAOA,SAAP;AAEA;;AA7CK,EAAP;AAiDA;;AAED;;;;AAIA,SAAS8D,eAAT,CAA0BlnB,EAA1B,EAA8B1X,UAA9B,EAA0Cy6B,IAA1C,EAAiD;;AAEhD,KAAInc,aAAa,EAAjB;AACA,KAAIugB,sBAAsB,EAA1B;;AAEA,UAASC,iBAAT,CAA4B3oD,KAA5B,EAAoC;;AAEnC,MAAIypB,WAAWzpB,MAAMvB,MAArB;AACA,MAAImqD,iBAAiBzgB,WAAY1e,SAAS8d,EAArB,CAArB;;AAEA,MAAKqhB,eAAehqD,KAAf,KAAyB,IAA9B,EAAqC;;AAEpCirB,cAAW6Z,MAAX,CAAmBklB,eAAehqD,KAAlC;AAEA;;AAED,OAAM,IAAI2kB,IAAV,IAAkBqlC,eAAe/+B,UAAjC,EAA8C;;AAE7CA,cAAW6Z,MAAX,CAAmBklB,eAAe/+B,UAAf,CAA2BtG,IAA3B,CAAnB;AAEA;;AAEDkG,WAAS7pB,mBAAT,CAA8B,SAA9B,EAAyC+oD,iBAAzC;;AAEA,SAAOxgB,WAAY1e,SAAS8d,EAArB,CAAP;;AAEA;;AAEA,MAAIt3B,YAAYy4C,oBAAqBj/B,SAAS8d,EAA9B,CAAhB;;AAEA,MAAKt3B,SAAL,EAAiB;;AAEhB4Z,cAAW6Z,MAAX,CAAmBzzB,SAAnB;AACA,UAAOy4C,oBAAqBj/B,SAAS8d,EAA9B,CAAP;AAEA;;AAEDt3B,cAAYy4C,oBAAqBE,eAAerhB,EAApC,CAAZ;;AAEA,MAAKt3B,SAAL,EAAiB;;AAEhB4Z,cAAW6Z,MAAX,CAAmBzzB,SAAnB;AACA,UAAOy4C,oBAAqBE,eAAerhB,EAApC,CAAP;AAEA;;AAED;;AAEA+c,OAAKuE,MAAL,CAAY1gB,UAAZ;AAEA;;AAED,UAAS9pC,GAAT,CAAcwqB,MAAd,EAAsBY,QAAtB,EAAiC;;AAEhC,MAAIm/B,iBAAiBzgB,WAAY1e,SAAS8d,EAArB,CAArB;;AAEA,MAAKqhB,cAAL,EAAsB,OAAOA,cAAP;;AAEtBn/B,WAASrqB,gBAAT,CAA2B,SAA3B,EAAsCupD,iBAAtC;;AAEA,MAAKl/B,SAASG,gBAAd,EAAiC;;AAEhCg/B,oBAAiBn/B,QAAjB;AAEA,GAJD,MAIO,IAAKA,SAASC,UAAd,EAA2B;;AAEjC,OAAKD,SAASq/B,eAAT,KAA6BtrD,SAAlC,EAA8C;;AAE7CisB,aAASq/B,eAAT,GAA2B,IAAI5U,cAAJ,GAAqBtrB,aAArB,CAAoCC,MAApC,CAA3B;AAEA;;AAED+/B,oBAAiBn/B,SAASq/B,eAA1B;AAEA;;AAED3gB,aAAY1e,SAAS8d,EAArB,IAA4BqhB,cAA5B;;AAEAtE,OAAKuE,MAAL,CAAY1gB,UAAZ;;AAEA,SAAOygB,cAAP;AAEA;;AAED,UAASjsC,MAAT,CAAiB8M,QAAjB,EAA4B;;AAE3B,MAAI7qB,QAAQ6qB,SAAS7qB,KAArB;AACA,MAAImqD,qBAAqBt/B,SAASI,UAAlC;;AAEA,MAAKjrB,UAAU,IAAf,EAAsB;;AAErBirB,cAAWlN,MAAX,CAAmB/d,KAAnB,EAA0B2iC,GAAGynB,oBAA7B;AAEA;;AAED,OAAM,IAAIzlC,IAAV,IAAkBwlC,kBAAlB,EAAuC;;AAEtCl/B,cAAWlN,MAAX,CAAmBosC,mBAAoBxlC,IAApB,CAAnB,EAA+Cge,GAAG0nB,YAAlD;AAEA;;AAED;;AAEA,MAAI9U,kBAAkB1qB,SAAS0qB,eAA/B;;AAEA,OAAM,IAAI5wB,IAAV,IAAkB4wB,eAAlB,EAAoC;;AAEnC,OAAIl0C,QAAQk0C,gBAAiB5wB,IAAjB,CAAZ;;AAEA,QAAM,IAAIpjB,IAAI,CAAR,EAAWC,IAAIH,MAAMnB,MAA3B,EAAmCqB,IAAIC,CAAvC,EAA0CD,GAA1C,EAAiD;;AAEhD0pB,eAAWlN,MAAX,CAAmB1c,MAAOE,CAAP,CAAnB,EAA+BohC,GAAG0nB,YAAlC;AAEA;AAED;AAED;;AAED,UAASC,qBAAT,CAAgCz/B,QAAhC,EAA2C;;AAE1C,MAAIxZ,YAAYy4C,oBAAqBj/B,SAAS8d,EAA9B,CAAhB;;AAEA,MAAKt3B,SAAL,EAAiB,OAAOA,SAAP;;AAEjB,MAAIk8B,UAAU,EAAd;;AAEA,MAAIgd,gBAAgB1/B,SAAS7qB,KAA7B;AACA,MAAImqD,qBAAqBt/B,SAASI,UAAlC;;AAEA;;AAEA,MAAKs/B,kBAAkB,IAAvB,EAA8B;;AAE7B,OAAIlpD,QAAQkpD,cAAclpD,KAA1B;;AAEA,QAAM,IAAIE,IAAI,CAAR,EAAWC,IAAIH,MAAMnB,MAA3B,EAAmCqB,IAAIC,CAAvC,EAA0CD,KAAK,CAA/C,EAAmD;;AAElD,QAAImN,IAAIrN,MAAOE,IAAI,CAAX,CAAR;AACA,QAAIoN,IAAItN,MAAOE,IAAI,CAAX,CAAR;AACA,QAAImQ,IAAIrQ,MAAOE,IAAI,CAAX,CAAR;;AAEAgsC,YAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBA,CAApB,EAAuB+C,CAAvB,EAA0BA,CAA1B,EAA6BhD,CAA7B;AAEA;AAED,GAdD,MAcO;;AAEN,OAAIrN,QAAQ8oD,mBAAmBpwC,QAAnB,CAA4B1Y,KAAxC;;AAEA,QAAM,IAAIE,IAAI,CAAR,EAAWC,IAAMH,MAAMnB,MAAN,GAAe,CAAjB,GAAuB,CAA5C,EAA+CqB,IAAIC,CAAnD,EAAsDD,KAAK,CAA3D,EAA+D;;AAE9D,QAAImN,IAAInN,IAAI,CAAZ;AACA,QAAIoN,IAAIpN,IAAI,CAAZ;AACA,QAAImQ,IAAInQ,IAAI,CAAZ;;AAEAgsC,YAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBA,CAApB,EAAuB+C,CAAvB,EAA0BA,CAA1B,EAA6BhD,CAA7B;AAEA;AAED;;AAED;;AAEA2C,cAAY,KAAM+jC,SAAU7H,OAAV,IAAsB,KAAtB,GAA8B+G,qBAA9B,GAAsDF,qBAA5D,EAAqF7G,OAArF,EAA8F,CAA9F,CAAZ;;AAEAtiB,aAAWlN,MAAX,CAAmB1M,SAAnB,EAA8BsxB,GAAGynB,oBAAjC;;AAEAN,sBAAqBj/B,SAAS8d,EAA9B,IAAqCt3B,SAArC;;AAEA,SAAOA,SAAP;AAEA;;AAED,QAAO;;AAEN5R,OAAKA,GAFC;AAGNse,UAAQA,MAHF;;AAKNusC,yBAAuBA;;AALjB,EAAP;AASA;;AAED;;;;AAIA,SAASE,0BAAT,CAAqC7nB,EAArC,EAAyC0Z,UAAzC,EAAqDqJ,IAArD,EAA4D;;AAE3D,KAAIC,IAAJ;;AAEA,UAASC,OAAT,CAAkB5mD,KAAlB,EAA0B;;AAEzB2mD,SAAO3mD,KAAP;AAEA;;AAED,KAAIyB,IAAJ,EAAU8jC,eAAV;;AAEA,UAASmR,QAAT,CAAmB12C,KAAnB,EAA2B;;AAE1ByB,SAAOzB,MAAMyB,IAAb;AACA8jC,oBAAkBvlC,MAAMulC,eAAxB;AAEA;;AAED,UAASigB,MAAT,CAAiBj1B,KAAjB,EAAwBzX,KAAxB,EAAgC;;AAE/B6qB,KAAG8nB,YAAH,CAAiB9E,IAAjB,EAAuB7tC,KAAvB,EAA8BrX,IAA9B,EAAoC8uB,QAAQgV,eAA5C;;AAEAmhB,OAAK3nC,MAAL,CAAajG,KAAb,EAAoB6tC,IAApB;AAEA;;AAED,UAASG,eAAT,CAA0Bj7B,QAA1B,EAAoC0E,KAApC,EAA2CzX,KAA3C,EAAmD;;AAElD,MAAIiuC,YAAY1J,WAAW58C,GAAX,CAAgB,wBAAhB,CAAhB;;AAEA,MAAKsmD,cAAc,IAAnB,EAA0B;;AAEzB13C,WAAQyD,KAAR,CAAe,uIAAf;AACA;AAEA;;AAEDi0C,YAAU2E,0BAAV,CAAsC/E,IAAtC,EAA4C7tC,KAA5C,EAAmDrX,IAAnD,EAAyD8uB,QAAQgV,eAAjE,EAAkF1Z,SAASo7B,iBAA3F;;AAEAP,OAAK3nC,MAAL,CAAajG,KAAb,EAAoB6tC,IAApB,EAA0B96B,SAASo7B,iBAAnC;AAEA;;AAED;;AAEA,MAAKL,OAAL,GAAeA,OAAf;AACA,MAAKlQ,QAAL,GAAgBA,QAAhB;AACA,MAAK8O,MAAL,GAAcA,MAAd;AACA,MAAKsB,eAAL,GAAuBA,eAAvB;AAEA;;AAED;;;;AAIA,SAAS6E,SAAT,CAAoBhoB,EAApB,EAAyB;;AAExB,KAAIsnB,SAAS;AACZ1gB,cAAY,CADA;AAEZ1jB,YAAU;AAFE,EAAb;;AAKA,KAAI2+B,SAAS;AACZniB,SAAO,CADK;AAEZuoB,SAAO,CAFK;AAGZC,aAAW,CAHC;AAIZphC,UAAQ,CAJI;AAKZqhC,SAAO;AALK,EAAb;;AAQA,UAAS/sC,MAAT,CAAiBjG,KAAjB,EAAwB6tC,IAAxB,EAA8BoF,aAA9B,EAA8C;;AAE7CA,kBAAgBA,iBAAiB,CAAjC;;AAEAvG,SAAOoG,KAAP;;AAEA,UAASjF,IAAT;;AAEC,QAAKhjB,GAAGqoB,SAAR;AACCxG,WAAOqG,SAAP,IAAoBE,iBAAkBjzC,QAAQ,CAA1B,CAApB;AACA;;AAED,QAAK6qB,GAAGsoB,cAAR;AACA,QAAKtoB,GAAGuoB,YAAR;AACC1G,WAAOqG,SAAP,IAAoBE,iBAAkBjzC,QAAQ,CAA1B,CAApB;AACA;;AAED,QAAK6qB,GAAGwoB,KAAR;AACC3G,WAAOsG,KAAP,IAAgBC,iBAAkBjzC,QAAQ,CAA1B,CAAhB;AACA;;AAED,QAAK6qB,GAAGyoB,UAAR;AACC5G,WAAOsG,KAAP,IAAgBC,iBAAkBjzC,QAAQ,CAA1B,CAAhB;AACA;;AAED,QAAK6qB,GAAG0oB,SAAR;AACC7G,WAAOsG,KAAP,IAAgBC,gBAAgBjzC,KAAhC;AACA;;AAED,QAAK6qB,GAAG2oB,MAAR;AACC9G,WAAO/6B,MAAP,IAAiBshC,gBAAgBjzC,KAAjC;AACA;;AAED;AACCzJ,YAAQyD,KAAR,CAAe,qCAAf,EAAsD6zC,IAAtD;AACA;;AA7BF;AAiCA;;AAED,UAAS4F,KAAT,GAAiB;;AAEhB/G,SAAOniB,KAAP;AACAmiB,SAAOoG,KAAP,GAAe,CAAf;AACApG,SAAOqG,SAAP,GAAmB,CAAnB;AACArG,SAAO/6B,MAAP,GAAgB,CAAhB;AACA+6B,SAAOsG,KAAP,GAAe,CAAf;AAEA;;AAED,QAAO;AACNb,UAAQA,MADF;AAENzF,UAAQA,MAFF;AAGNgH,YAAU,IAHJ;AAINC,aAAW,IAJL;AAKNF,SAAOA,KALD;AAMNxtC,UAAQA;AANF,EAAP;AASA;;AAED;;;;AAIA,SAAS2tC,gBAAT,CAA2Bh9C,CAA3B,EAA8BC,CAA9B,EAAkC;;AAEjC,QAAO9P,KAAKqR,GAAL,CAAUvB,EAAG,CAAH,CAAV,IAAqB9P,KAAKqR,GAAL,CAAUxB,EAAG,CAAH,CAAV,CAA5B;AAEA;;AAED,SAASi9C,iBAAT,CAA4BhpB,EAA5B,EAAiC;;AAEhC,KAAIipB,iBAAiB,EAArB;AACA,KAAIlI,kBAAkB,IAAIjgB,YAAJ,CAAkB,CAAlB,CAAtB;;AAEA,UAAS1lB,MAAT,CAAiBkM,MAAjB,EAAyBY,QAAzB,EAAmCof,QAAnC,EAA6C4hB,OAA7C,EAAuD;;AAEtD,MAAIC,mBAAmB7hC,OAAO63B,qBAA9B;;AAEA,MAAI5hD,SAAS4rD,iBAAiB5rD,MAA9B;;AAEA,MAAI6rD,aAAaH,eAAgB/gC,SAAS8d,EAAzB,CAAjB;;AAEA,MAAKojB,eAAentD,SAApB,EAAgC;;AAE/B;;AAEAmtD,gBAAa,EAAb;;AAEA,QAAM,IAAIxqD,IAAI,CAAd,EAAiBA,IAAIrB,MAArB,EAA6BqB,GAA7B,EAAoC;;AAEnCwqD,eAAYxqD,CAAZ,IAAkB,CAAEA,CAAF,EAAK,CAAL,CAAlB;AAEA;;AAEDqqD,kBAAgB/gC,SAAS8d,EAAzB,IAAgCojB,UAAhC;AAEA;;AAED,MAAI3f,eAAenC,SAASmC,YAAT,IAAyBvhB,SAAS0qB,eAAT,CAAyBx7B,QAArE;AACA,MAAIsyB,eAAepC,SAASoC,YAAT,IAAyBxhB,SAAS0qB,eAAT,CAAyB/yB,MAArE;;AAEA;;AAEA,OAAM,IAAIjhB,IAAI,CAAd,EAAiBA,IAAIrB,MAArB,EAA6BqB,GAA7B,EAAoC;;AAEnC,OAAIqiD,YAAYmI,WAAYxqD,CAAZ,CAAhB;;AAEA,OAAKqiD,UAAW,CAAX,MAAmB,CAAxB,EAA4B;;AAE3B,QAAKxX,YAAL,EAAoBvhB,SAASgrB,eAAT,CAA0B,gBAAgBt0C,CAA1C;AACpB,QAAK8qC,YAAL,EAAoBxhB,SAASgrB,eAAT,CAA0B,gBAAgBt0C,CAA1C;AAEpB;AAED;;AAED;;AAEA,OAAM,IAAIA,IAAI,CAAd,EAAiBA,IAAIrB,MAArB,EAA6BqB,GAA7B,EAAoC;;AAEnC,OAAIqiD,YAAYmI,WAAYxqD,CAAZ,CAAhB;;AAEAqiD,aAAW,CAAX,IAAiBriD,CAAjB;AACAqiD,aAAW,CAAX,IAAiBkI,iBAAkBvqD,CAAlB,CAAjB;AAEA;;AAEDwqD,aAAW5a,IAAX,CAAiBua,gBAAjB;;AAEA;;AAEA,OAAM,IAAInqD,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B,OAAIqiD,YAAYmI,WAAYxqD,CAAZ,CAAhB;;AAEA,OAAKqiD,SAAL,EAAiB;;AAEhB,QAAI5jD,QAAQ4jD,UAAW,CAAX,CAAZ;AACA,QAAI5kD,QAAQ4kD,UAAW,CAAX,CAAZ;;AAEA,QAAK5kD,KAAL,EAAa;;AAEZ,SAAKotC,YAAL,EAAoBvhB,SAAS8qB,YAAT,CAAuB,gBAAgBp0C,CAAvC,EAA0C6qC,aAAcpsC,KAAd,CAA1C;AACpB,SAAKqsC,YAAL,EAAoBxhB,SAAS8qB,YAAT,CAAuB,gBAAgBp0C,CAAvC,EAA0C8qC,aAAcrsC,KAAd,CAA1C;;AAEpB0jD,qBAAiBniD,CAAjB,IAAuBvC,KAAvB;AACA;AAEA;AAED;;AAED0kD,mBAAiBniD,CAAjB,IAAuB,CAAvB;AAEA;;AAEDsqD,UAAQG,WAAR,GAAsBC,QAAtB,CAAgCtpB,EAAhC,EAAoC,uBAApC,EAA6D+gB,eAA7D;AAEA;;AAED,QAAO;;AAEN3lC,UAAQA;;AAFF,EAAP;AAMA;;AAED;;;;AAIA,SAASmuC,YAAT,CAAuB3iB,UAAvB,EAAmCmc,IAAnC,EAA0C;;AAEzC,KAAIyG,aAAa,EAAjB;;AAEA,UAASpuC,MAAT,CAAiBkM,MAAjB,EAA0B;;AAEzB,MAAIoY,QAAQqjB,KAAKlB,MAAL,CAAYniB,KAAxB;;AAEA,MAAIxX,WAAWZ,OAAOY,QAAtB;AACA,MAAIm/B,iBAAiBzgB,WAAW9pC,GAAX,CAAgBwqB,MAAhB,EAAwBY,QAAxB,CAArB;;AAEA;;AAEA,MAAKshC,WAAYnC,eAAerhB,EAA3B,MAAoCtG,KAAzC,EAAiD;;AAEhD,OAAKxX,SAASC,UAAd,EAA2B;;AAE1Bk/B,mBAAe5T,gBAAf,CAAiCnsB,MAAjC;AAEA;;AAEDsf,cAAWxrB,MAAX,CAAmBisC,cAAnB;;AAEAmC,cAAYnC,eAAerhB,EAA3B,IAAkCtG,KAAlC;AAEA;;AAED,SAAO2nB,cAAP;AAEA;;AAED,UAAShjC,OAAT,GAAmB;;AAElBmlC,eAAa,EAAb;AAEA;;AAED,QAAO;;AAENpuC,UAAQA,MAFF;AAGNiJ,WAASA;;AAHH,EAAP;AAOA;;AAED;;;;AAIA,SAASolC,WAAT,CAAsBtlC,MAAtB,EAA8B3C,OAA9B,EAAuCC,KAAvC,EAA8CC,KAA9C,EAAqDC,SAArD,EAAgEC,SAAhE,EAA2EC,MAA3E,EAAmF/jB,IAAnF,EAAyFgkB,UAAzF,EAAqGC,QAArG,EAAgH;;AAE/GoC,UAASA,WAAWloB,SAAX,GAAuBkoB,MAAvB,GAAgC,EAAzC;AACA3C,WAAUA,YAAYvlB,SAAZ,GAAwBulB,OAAxB,GAAkC7e,qBAA5C;;AAEA2e,SAAQ3jB,IAAR,CAAc,IAAd,EAAoBwmB,MAApB,EAA4B3C,OAA5B,EAAqCC,KAArC,EAA4CC,KAA5C,EAAmDC,SAAnD,EAA8DC,SAA9D,EAAyEC,MAAzE,EAAiF/jB,IAAjF,EAAuFgkB,UAAvF,EAAmGC,QAAnG;;AAEA,MAAKS,KAAL,GAAa,KAAb;AAEA;;AAEDinC,YAAY9sD,SAAZ,GAAwBC,OAAOgmB,MAAP,CAAetB,QAAQ3kB,SAAvB,CAAxB;AACA8sD,YAAY9sD,SAAZ,CAAsB0O,WAAtB,GAAoCo+C,WAApC;;AAEAA,YAAY9sD,SAAZ,CAAsB6lD,aAAtB,GAAsC,IAAtC;;AAEA5lD,OAAOC,cAAP,CAAuB4sD,YAAY9sD,SAAnC,EAA8C,QAA9C,EAAwD;;AAEvDG,MAAK,YAAY;;AAEhB,SAAO,KAAKykB,KAAZ;AAEA,EANsD;;AAQvD5W,MAAK,UAAWtO,KAAX,EAAmB;;AAEvB,OAAKklB,KAAL,GAAallB,KAAb;AAEA;;AAZsD,CAAxD;;AAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,IAAIqtD,eAAe,IAAIpoC,OAAJ,EAAnB;AACA,IAAIqoC,mBAAmB,IAAIF,WAAJ,EAAvB;;AAEA;;AAEA,SAASG,gBAAT,GAA4B;;AAE3B,MAAKC,GAAL,GAAW,EAAX;AACA,MAAKtwB,GAAL,GAAW,EAAX;AAEA;;AAED;;AAEA;;AAEA,IAAIuwB,gBAAgB,EAApB;AACA,IAAIC,gBAAgB,EAApB;;AAEA;;AAEA,IAAIC,YAAY,IAAIlpB,YAAJ,CAAkB,EAAlB,CAAhB;AACA,IAAImpB,YAAY,IAAInpB,YAAJ,CAAkB,CAAlB,CAAhB;AACA,IAAIopB,YAAY,IAAIppB,YAAJ,CAAkB,CAAlB,CAAhB;;AAEA;;AAEA,SAASqpB,OAAT,CAAkBzrD,KAAlB,EAAyB0rD,OAAzB,EAAkCC,SAAlC,EAA8C;;AAE7C,KAAIC,YAAY5rD,MAAO,CAAP,CAAhB;;AAEA,KAAK4rD,aAAa,CAAb,IAAkBA,YAAY,CAAnC,EAAuC,OAAO5rD,KAAP;AACvC;AACA;;AAEA,KAAImK,IAAIuhD,UAAUC,SAAlB;AAAA,KACC7tC,IAAIstC,cAAejhD,CAAf,CADL;;AAGA,KAAK2T,MAAMvgB,SAAX,EAAuB;;AAEtBugB,MAAI,IAAIskB,YAAJ,CAAkBj4B,CAAlB,CAAJ;AACAihD,gBAAejhD,CAAf,IAAqB2T,CAArB;AAEA;;AAED,KAAK4tC,YAAY,CAAjB,EAAqB;;AAEpBE,YAAU97C,OAAV,CAAmBgO,CAAnB,EAAsB,CAAtB;;AAEA,OAAM,IAAI5d,IAAI,CAAR,EAAW2P,SAAS,CAA1B,EAA6B3P,MAAMwrD,OAAnC,EAA4C,EAAGxrD,CAA/C,EAAmD;;AAElD2P,aAAU87C,SAAV;AACA3rD,SAAOE,CAAP,EAAW4P,OAAX,CAAoBgO,CAApB,EAAuBjO,MAAvB;AAEA;AAED;;AAED,QAAOiO,CAAP;AAEA;;AAED,SAAS+tC,WAAT,CAAsBx+C,CAAtB,EAAyBC,CAAzB,EAA6B;;AAE5B,KAAKD,EAAExO,MAAF,KAAayO,EAAEzO,MAApB,EAA6B,OAAO,KAAP;;AAE7B,MAAM,IAAIqB,IAAI,CAAR,EAAWC,IAAIkN,EAAExO,MAAvB,EAA+BqB,IAAIC,CAAnC,EAAsCD,GAAtC,EAA6C;;AAE5C,MAAKmN,EAAGnN,CAAH,MAAWoN,EAAGpN,CAAH,CAAhB,EAAyB,OAAO,KAAP;AAEzB;;AAED,QAAO,IAAP;AAEA;;AAED,SAAS+xC,SAAT,CAAoB5kC,CAApB,EAAuBC,CAAvB,EAA2B;;AAE1B,MAAM,IAAIpN,IAAI,CAAR,EAAWC,IAAImN,EAAEzO,MAAvB,EAA+BqB,IAAIC,CAAnC,EAAsCD,GAAtC,EAA6C;;AAE5CmN,IAAGnN,CAAH,IAASoN,EAAGpN,CAAH,CAAT;AAEA;AAED;;AAED;;AAEA,SAAS4rD,aAAT,CAAwBnJ,QAAxB,EAAkCx4C,CAAlC,EAAsC;;AAErC,KAAI2T,IAAIutC,cAAelhD,CAAf,CAAR;;AAEA,KAAK2T,MAAMvgB,SAAX,EAAuB;;AAEtBugB,MAAI,IAAI8kB,UAAJ,CAAgBz4B,CAAhB,CAAJ;AACAkhD,gBAAelhD,CAAf,IAAqB2T,CAArB;AAEA;;AAED,MAAM,IAAI5d,IAAI,CAAd,EAAiBA,MAAMiK,CAAvB,EAA0B,EAAGjK,CAA7B,EACC4d,EAAG5d,CAAH,IAASyiD,SAASoJ,gBAAT,EAAT;;AAED,QAAOjuC,CAAP;AAEA;;AAED;;AAEA;AACA;;AAEA;;AAEA,SAASkuC,UAAT,CAAqB1qB,EAArB,EAAyBz0B,CAAzB,EAA6B;;AAE5B,KAAIk8B,QAAQ,KAAKA,KAAjB;;AAEA,KAAKA,MAAO,CAAP,MAAel8B,CAApB,EAAwB;;AAExBy0B,IAAG2qB,SAAH,CAAc,KAAKC,IAAnB,EAAyBr/C,CAAzB;;AAEAk8B,OAAO,CAAP,IAAal8B,CAAb;AAEA;;AAED,SAASs/C,UAAT,CAAqB7qB,EAArB,EAAyBz0B,CAAzB,EAA6B;;AAE5B,KAAIk8B,QAAQ,KAAKA,KAAjB;;AAEA,KAAKA,MAAO,CAAP,MAAel8B,CAApB,EAAwB;;AAExBy0B,IAAG8qB,SAAH,CAAc,KAAKF,IAAnB,EAAyBr/C,CAAzB;;AAEAk8B,OAAO,CAAP,IAAal8B,CAAb;AAEA;;AAED;;AAEA,SAASw/C,WAAT,CAAsB/qB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;;AAEA,KAAKl8B,EAAE9O,CAAF,KAAQR,SAAb,EAAyB;;AAExB,MAAKwrC,MAAO,CAAP,MAAel8B,EAAE9O,CAAjB,IAAsBgrC,MAAO,CAAP,MAAel8B,EAAElC,CAA5C,EAAgD;;AAE/C22B,MAAGgrB,SAAH,CAAc,KAAKJ,IAAnB,EAAyBr/C,EAAE9O,CAA3B,EAA8B8O,EAAElC,CAAhC;;AAEAo+B,SAAO,CAAP,IAAal8B,EAAE9O,CAAf;AACAgrC,SAAO,CAAP,IAAal8B,EAAElC,CAAf;AAEA;AAED,EAXD,MAWO;;AAEN,MAAKkhD,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,KAAGirB,UAAH,CAAe,KAAKL,IAApB,EAA0Br/C,CAA1B;;AAEAolC,YAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA;AAED;;AAED,SAAS2/C,WAAT,CAAsBlrB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;;AAEA,KAAKl8B,EAAE9O,CAAF,KAAQR,SAAb,EAAyB;;AAExB,MAAKwrC,MAAO,CAAP,MAAel8B,EAAE9O,CAAjB,IAAsBgrC,MAAO,CAAP,MAAel8B,EAAElC,CAAvC,IAA4Co+B,MAAO,CAAP,MAAel8B,EAAEwF,CAAlE,EAAsE;;AAErEivB,MAAGmrB,SAAH,CAAc,KAAKP,IAAnB,EAAyBr/C,EAAE9O,CAA3B,EAA8B8O,EAAElC,CAAhC,EAAmCkC,EAAEwF,CAArC;;AAEA02B,SAAO,CAAP,IAAal8B,EAAE9O,CAAf;AACAgrC,SAAO,CAAP,IAAal8B,EAAElC,CAAf;AACAo+B,SAAO,CAAP,IAAal8B,EAAEwF,CAAf;AAEA;AAED,EAZD,MAYO,IAAKxF,EAAEiR,CAAF,KAAQvgB,SAAb,EAAyB;;AAE/B,MAAKwrC,MAAO,CAAP,MAAel8B,EAAEiR,CAAjB,IAAsBirB,MAAO,CAAP,MAAel8B,EAAEoV,CAAvC,IAA4C8mB,MAAO,CAAP,MAAel8B,EAAES,CAAlE,EAAsE;;AAErEg0B,MAAGmrB,SAAH,CAAc,KAAKP,IAAnB,EAAyBr/C,EAAEiR,CAA3B,EAA8BjR,EAAEoV,CAAhC,EAAmCpV,EAAES,CAArC;;AAEAy7B,SAAO,CAAP,IAAal8B,EAAEiR,CAAf;AACAirB,SAAO,CAAP,IAAal8B,EAAEoV,CAAf;AACA8mB,SAAO,CAAP,IAAal8B,EAAES,CAAf;AAEA;AAED,EAZM,MAYA;;AAEN,MAAKu+C,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,KAAGorB,UAAH,CAAe,KAAKR,IAApB,EAA0Br/C,CAA1B;;AAEAolC,YAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA;AAED;;AAED,SAAS8/C,WAAT,CAAsBrrB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;;AAEA,KAAKl8B,EAAE9O,CAAF,KAAQR,SAAb,EAAyB;;AAExB,MAAKwrC,MAAO,CAAP,MAAel8B,EAAE9O,CAAjB,IAAsBgrC,MAAO,CAAP,MAAel8B,EAAElC,CAAvC,IAA4Co+B,MAAO,CAAP,MAAel8B,EAAEwF,CAA7D,IAAkE02B,MAAO,CAAP,MAAel8B,EAAEE,CAAxF,EAA4F;;AAE3Fu0B,MAAGsrB,SAAH,CAAc,KAAKV,IAAnB,EAAyBr/C,EAAE9O,CAA3B,EAA8B8O,EAAElC,CAAhC,EAAmCkC,EAAEwF,CAArC,EAAwCxF,EAAEE,CAA1C;;AAEAg8B,SAAO,CAAP,IAAal8B,EAAE9O,CAAf;AACAgrC,SAAO,CAAP,IAAal8B,EAAElC,CAAf;AACAo+B,SAAO,CAAP,IAAal8B,EAAEwF,CAAf;AACA02B,SAAO,CAAP,IAAal8B,EAAEE,CAAf;AAEA;AAED,EAbD,MAaO;;AAEN,MAAK8+C,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,KAAGurB,UAAH,CAAe,KAAKX,IAApB,EAA0Br/C,CAA1B;;AAEAolC,YAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA;AAED;;AAED;;AAEA,SAASigD,WAAT,CAAsBxrB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;AACA,KAAI96B,WAAWpB,EAAEoB,QAAjB;;AAEA,KAAKA,aAAa1Q,SAAlB,EAA8B;;AAE7B,MAAKsuD,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,KAAGyrB,gBAAH,CAAqB,KAAKb,IAA1B,EAAgC,KAAhC,EAAuCr/C,CAAvC;;AAEAolC,YAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA,EARD,MAQO;;AAEN,MAAKg/C,YAAa9iB,KAAb,EAAoB96B,QAApB,CAAL,EAAsC;;AAEtCu9C,YAAUv/C,GAAV,CAAegC,QAAf;;AAEAqzB,KAAGyrB,gBAAH,CAAqB,KAAKb,IAA1B,EAAgC,KAAhC,EAAuCV,SAAvC;;AAEAvZ,YAAWlJ,KAAX,EAAkB96B,QAAlB;AAEA;AAED;;AAED,SAAS++C,WAAT,CAAsB1rB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;AACA,KAAI96B,WAAWpB,EAAEoB,QAAjB;;AAEA,KAAKA,aAAa1Q,SAAlB,EAA8B;;AAE7B,MAAKsuD,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,KAAG2rB,gBAAH,CAAqB,KAAKf,IAA1B,EAAgC,KAAhC,EAAuCr/C,CAAvC;;AAEAolC,YAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA,EARD,MAQO;;AAEN,MAAKg/C,YAAa9iB,KAAb,EAAoB96B,QAApB,CAAL,EAAsC;;AAEtCs9C,YAAUt/C,GAAV,CAAegC,QAAf;;AAEAqzB,KAAG2rB,gBAAH,CAAqB,KAAKf,IAA1B,EAAgC,KAAhC,EAAuCX,SAAvC;;AAEAtZ,YAAWlJ,KAAX,EAAkB96B,QAAlB;AAEA;AAED;;AAED,SAASi/C,WAAT,CAAsB5rB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;AACA,KAAI96B,WAAWpB,EAAEoB,QAAjB;;AAEA,KAAKA,aAAa1Q,SAAlB,EAA8B;;AAE7B,MAAKsuD,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,KAAG6rB,gBAAH,CAAqB,KAAKjB,IAA1B,EAAgC,KAAhC,EAAuCr/C,CAAvC;;AAEAolC,YAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA,EARD,MAQO;;AAEN,MAAKg/C,YAAa9iB,KAAb,EAAoB96B,QAApB,CAAL,EAAsC;;AAEtCq9C,YAAUr/C,GAAV,CAAegC,QAAf;;AAEAqzB,KAAG6rB,gBAAH,CAAqB,KAAKjB,IAA1B,EAAgC,KAAhC,EAAuCZ,SAAvC;;AAEArZ,YAAWlJ,KAAX,EAAkB96B,QAAlB;AAEA;AAED;;AAED;;AAEA,SAASm/C,UAAT,CAAqB9rB,EAArB,EAAyBz0B,CAAzB,EAA4B81C,QAA5B,EAAuC;;AAEtC,KAAI5Z,QAAQ,KAAKA,KAAjB;AACA,KAAIskB,OAAO1K,SAASoJ,gBAAT,EAAX;;AAEA,KAAKhjB,MAAO,CAAP,MAAeskB,IAApB,EAA2B;;AAE1B/rB,KAAG8qB,SAAH,CAAc,KAAKF,IAAnB,EAAyBmB,IAAzB;AACAtkB,QAAO,CAAP,IAAaskB,IAAb;AAEA;;AAED1K,UAAS2K,YAAT,CAAuBzgD,KAAKm+C,YAA5B,EAA0CqC,IAA1C;AAEA;;AAED,SAASE,UAAT,CAAqBjsB,EAArB,EAAyBz0B,CAAzB,EAA4B81C,QAA5B,EAAuC;;AAEtC,KAAI5Z,QAAQ,KAAKA,KAAjB;AACA,KAAIskB,OAAO1K,SAASoJ,gBAAT,EAAX;;AAEA,KAAKhjB,MAAO,CAAP,MAAeskB,IAApB,EAA2B;;AAE1B/rB,KAAG8qB,SAAH,CAAc,KAAKF,IAAnB,EAAyBmB,IAAzB;AACAtkB,QAAO,CAAP,IAAaskB,IAAb;AAEA;;AAED1K,UAAS6K,cAAT,CAAyB3gD,KAAKo+C,gBAA9B,EAAgDoC,IAAhD;AAEA;;AAED;;AAEA,SAASI,WAAT,CAAsBnsB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;;AAEA,KAAK8iB,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,IAAGosB,UAAH,CAAe,KAAKxB,IAApB,EAA0Br/C,CAA1B;;AAEAolC,WAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA;;AAED,SAAS8gD,WAAT,CAAsBrsB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;;AAEA,KAAK8iB,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,IAAGssB,UAAH,CAAe,KAAK1B,IAApB,EAA0Br/C,CAA1B;;AAEAolC,WAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA;;AAED,SAASghD,WAAT,CAAsBvsB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;;AAEA,KAAK8iB,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,IAAGwsB,UAAH,CAAe,KAAK5B,IAApB,EAA0Br/C,CAA1B;;AAEAolC,WAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA;;AAED;;AAEA,SAASkhD,iBAAT,CAA4B3uD,IAA5B,EAAmC;;AAElC,SAASA,IAAT;;AAEC,OAAK,MAAL;AAAa,UAAO4sD,UAAP,CAFd,CAEiC;AAChC,OAAK,MAAL;AAAa,UAAOK,WAAP,CAHd,CAGkC;AACjC,OAAK,MAAL;AAAa,UAAOG,WAAP,CAJd,CAIkC;AACjC,OAAK,MAAL;AAAa,UAAOG,WAAP,CALd,CAKkC;;AAEjC,OAAK,MAAL;AAAa,UAAOG,WAAP,CAPd,CAOkC;AACjC,OAAK,MAAL;AAAa,UAAOE,WAAP,CARd,CAQkC;AACjC,OAAK,MAAL;AAAa,UAAOE,WAAP,CATd,CASkC;;AAEjC,OAAK,MAAL,CAAa,KAAK,MAAL;AAAa,UAAOE,UAAP,CAX3B,CAW8C;AAC7C,OAAK,MAAL;AAAa,UAAOG,UAAP,CAZd,CAYiC;;AAEhC,OAAK,MAAL,CAAa,KAAK,MAAL;AAAa,UAAOpB,UAAP,CAd3B,CAc8C;AAC7C,OAAK,MAAL,CAAa,KAAK,MAAL;AAAa,UAAOsB,WAAP,CAf3B,CAe+C;AAC9C,OAAK,MAAL,CAAa,KAAK,MAAL;AAAa,UAAOE,WAAP,CAhB3B,CAgB+C;AAC9C,OAAK,MAAL,CAAa,KAAK,MAAL;AAAa,UAAOE,WAAP,CAjB3B,CAiB+C;;AAjB/C;AAqBA;;AAED;;AAEA,SAASG,WAAT,CAAsB1sB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;;AAEA,KAAK8iB,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,IAAG2sB,UAAH,CAAe,KAAK/B,IAApB,EAA0Br/C,CAA1B;;AAEAolC,WAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA;AACD,SAASqhD,WAAT,CAAsB5sB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;;AAEA,KAAK8iB,YAAa9iB,KAAb,EAAoBl8B,CAApB,CAAL,EAA+B;;AAE/By0B,IAAG6sB,UAAH,CAAe,KAAKjC,IAApB,EAA0Br/C,CAA1B;;AAEAolC,WAAWlJ,KAAX,EAAkBl8B,CAAlB;AAEA;;AAED;;AAEA,SAASuhD,WAAT,CAAsB9sB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;AACA,KAAIzhB,OAAOmkC,QAAS5+C,CAAT,EAAY,KAAK4b,IAAjB,EAAuB,CAAvB,CAAX;;AAEA,KAAKojC,YAAa9iB,KAAb,EAAoBzhB,IAApB,CAAL,EAAkC;;AAElCga,IAAGirB,UAAH,CAAe,KAAKL,IAApB,EAA0B5kC,IAA1B;;AAEA,MAAK+mC,WAAL,CAAkB/mC,IAAlB;AAEA;;AAED,SAASgnC,WAAT,CAAsBhtB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;AACA,KAAIzhB,OAAOmkC,QAAS5+C,CAAT,EAAY,KAAK4b,IAAjB,EAAuB,CAAvB,CAAX;;AAEA,KAAKojC,YAAa9iB,KAAb,EAAoBzhB,IAApB,CAAL,EAAkC;;AAElCga,IAAGorB,UAAH,CAAe,KAAKR,IAApB,EAA0B5kC,IAA1B;;AAEA,MAAK+mC,WAAL,CAAkB/mC,IAAlB;AAEA;;AAED,SAASinC,WAAT,CAAsBjtB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;AACA,KAAIzhB,OAAOmkC,QAAS5+C,CAAT,EAAY,KAAK4b,IAAjB,EAAuB,CAAvB,CAAX;;AAEA,KAAKojC,YAAa9iB,KAAb,EAAoBzhB,IAApB,CAAL,EAAkC;;AAElCga,IAAGurB,UAAH,CAAe,KAAKX,IAApB,EAA0B5kC,IAA1B;;AAEA,MAAK+mC,WAAL,CAAkB/mC,IAAlB;AAEA;;AAED;;AAEA,SAASknC,WAAT,CAAsBltB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;AACA,KAAIzhB,OAAOmkC,QAAS5+C,CAAT,EAAY,KAAK4b,IAAjB,EAAuB,CAAvB,CAAX;;AAEA,KAAKojC,YAAa9iB,KAAb,EAAoBzhB,IAApB,CAAL,EAAkC;;AAElCga,IAAGyrB,gBAAH,CAAqB,KAAKb,IAA1B,EAAgC,KAAhC,EAAuC5kC,IAAvC;;AAEA,MAAK+mC,WAAL,CAAkB/mC,IAAlB;AAEA;;AAED,SAASmnC,WAAT,CAAsBntB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;AACA,KAAIzhB,OAAOmkC,QAAS5+C,CAAT,EAAY,KAAK4b,IAAjB,EAAuB,CAAvB,CAAX;;AAEA,KAAKojC,YAAa9iB,KAAb,EAAoBzhB,IAApB,CAAL,EAAkC;;AAElCga,IAAG2rB,gBAAH,CAAqB,KAAKf,IAA1B,EAAgC,KAAhC,EAAuC5kC,IAAvC;;AAEA,MAAK+mC,WAAL,CAAkB/mC,IAAlB;AAEA;;AAED,SAASonC,WAAT,CAAsBptB,EAAtB,EAA0Bz0B,CAA1B,EAA8B;;AAE7B,KAAIk8B,QAAQ,KAAKA,KAAjB;AACA,KAAIzhB,OAAOmkC,QAAS5+C,CAAT,EAAY,KAAK4b,IAAjB,EAAuB,EAAvB,CAAX;;AAEA,KAAKojC,YAAa9iB,KAAb,EAAoBzhB,IAApB,CAAL,EAAkC;;AAElCga,IAAG6rB,gBAAH,CAAqB,KAAKjB,IAA1B,EAAgC,KAAhC,EAAuC5kC,IAAvC;;AAEA,MAAK+mC,WAAL,CAAkB/mC,IAAlB;AAEA;;AAED;;AAEA,SAASqnC,WAAT,CAAsBrtB,EAAtB,EAA0Bz0B,CAA1B,EAA6B81C,QAA7B,EAAwC;;AAEvC,KAAI5Z,QAAQ,KAAKA,KAAjB;AACA,KAAI5+B,IAAI0C,EAAEhO,MAAV;;AAEA,KAAI+vD,QAAQ9C,cAAenJ,QAAf,EAAyBx4C,CAAzB,CAAZ;;AAEA,KAAK0hD,YAAa9iB,KAAb,EAAoB6lB,KAApB,MAAgC,KAArC,EAA6C;;AAE5CttB,KAAG6sB,UAAH,CAAe,KAAKjC,IAApB,EAA0B0C,KAA1B;AACA3c,YAAWlJ,KAAX,EAAkB6lB,KAAlB;AAEA;;AAED,MAAM,IAAI1uD,IAAI,CAAd,EAAiBA,MAAMiK,CAAvB,EAA0B,EAAGjK,CAA7B,EAAiC;;AAEhCyiD,WAAS2K,YAAT,CAAuBzgD,EAAG3M,CAAH,KAAU8qD,YAAjC,EAA+C4D,MAAO1uD,CAAP,CAA/C;AAEA;AAED;;AAED,SAAS2uD,WAAT,CAAsBvtB,EAAtB,EAA0Bz0B,CAA1B,EAA6B81C,QAA7B,EAAwC;;AAEvC,KAAI5Z,QAAQ,KAAKA,KAAjB;AACA,KAAI5+B,IAAI0C,EAAEhO,MAAV;;AAEA,KAAI+vD,QAAQ9C,cAAenJ,QAAf,EAAyBx4C,CAAzB,CAAZ;;AAEA,KAAK0hD,YAAa9iB,KAAb,EAAoB6lB,KAApB,MAAgC,KAArC,EAA6C;;AAE5CttB,KAAG6sB,UAAH,CAAe,KAAKjC,IAApB,EAA0B0C,KAA1B;AACA3c,YAAWlJ,KAAX,EAAkB6lB,KAAlB;AAEA;;AAED,MAAM,IAAI1uD,IAAI,CAAd,EAAiBA,MAAMiK,CAAvB,EAA0B,EAAGjK,CAA7B,EAAiC;;AAEhCyiD,WAAS6K,cAAT,CAAyB3gD,EAAG3M,CAAH,KAAU+qD,gBAAnC,EAAqD2D,MAAO1uD,CAAP,CAArD;AAEA;AAED;;AAED;;AAEA,SAAS4uD,kBAAT,CAA6B1vD,IAA7B,EAAoC;;AAEnC,SAASA,IAAT;;AAEC,OAAK,MAAL;AAAa,UAAO4uD,WAAP,CAFd,CAEkC;AACjC,OAAK,MAAL;AAAa,UAAOI,WAAP,CAHd,CAGkC;AACjC,OAAK,MAAL;AAAa,UAAOE,WAAP,CAJd,CAIkC;AACjC,OAAK,MAAL;AAAa,UAAOC,WAAP,CALd,CAKkC;;AAEjC,OAAK,MAAL;AAAa,UAAOC,WAAP,CAPd,CAOkC;AACjC,OAAK,MAAL;AAAa,UAAOC,WAAP,CARd,CAQkC;AACjC,OAAK,MAAL;AAAa,UAAOC,WAAP,CATd,CASkC;;AAEjC,OAAK,MAAL;AAAa,UAAOC,WAAP,CAXd,CAWkC;AACjC,OAAK,MAAL;AAAa,UAAOE,WAAP,CAZd,CAYkC;;AAEjC,OAAK,MAAL,CAAa,KAAK,MAAL;AAAa,UAAOX,WAAP,CAd3B,CAc+C;AAC9C,OAAK,MAAL,CAAa,KAAK,MAAL;AAAa,UAAOT,WAAP,CAf3B,CAe+C;AAC9C,OAAK,MAAL,CAAa,KAAK,MAAL;AAAa,UAAOE,WAAP,CAhB3B,CAgB+C;AAC9C,OAAK,MAAL,CAAa,KAAK,MAAL;AAAa,UAAOE,WAAP,CAjB3B,CAiB+C;;AAjB/C;AAqBA;;AAED;;AAEA,SAASkB,aAAT,CAAwBznB,EAAxB,EAA4B0nB,UAA5B,EAAwC9C,IAAxC,EAA+C;;AAE9C,MAAK5kB,EAAL,GAAUA,EAAV;AACA,MAAK4kB,IAAL,GAAYA,IAAZ;AACA,MAAKnjB,KAAL,GAAa,EAAb;AACA,MAAK6hB,QAAL,GAAgBmD,kBAAmBiB,WAAW5vD,IAA9B,CAAhB;;AAEA;AAEA;;AAED,SAAS6vD,gBAAT,CAA2B3nB,EAA3B,EAA+B0nB,UAA/B,EAA2C9C,IAA3C,EAAkD;;AAEjD,MAAK5kB,EAAL,GAAUA,EAAV;AACA,MAAK4kB,IAAL,GAAYA,IAAZ;AACA,MAAKnjB,KAAL,GAAa,EAAb;AACA,MAAKtgB,IAAL,GAAYumC,WAAWvmC,IAAvB;AACA,MAAKmiC,QAAL,GAAgBkE,mBAAoBE,WAAW5vD,IAA/B,CAAhB;;AAEA;AAEA;;AAED6vD,iBAAiBhxD,SAAjB,CAA2BowD,WAA3B,GAAyC,UAAW/mC,IAAX,EAAkB;;AAE1D,KAAIyhB,QAAQ,KAAKA,KAAjB;;AAEA,KAAKzhB,gBAAgB8a,YAAhB,IAAgC2G,MAAMlqC,MAAN,KAAiByoB,KAAKzoB,MAA3D,EAAoE;;AAEnE,OAAKkqC,KAAL,GAAa,IAAI3G,YAAJ,CAAkB9a,KAAKzoB,MAAvB,CAAb;AAEA;;AAEDozC,WAAWlJ,KAAX,EAAkBzhB,IAAlB;AAEA,CAZD;;AAcA,SAAS4nC,iBAAT,CAA4B5nB,EAA5B,EAAiC;;AAEhC,MAAKA,EAAL,GAAUA,EAAV;;AAEA4jB,kBAAiBjsD,IAAjB,CAAuB,IAAvB,EAJgC,CAID;AAE/B;;AAEDiwD,kBAAkBjxD,SAAlB,CAA4B2sD,QAA5B,GAAuC,UAAWtpB,EAAX,EAAe3jC,KAAf,EAAuB;;AAE7D;AACA;;AAEA,KAAIwtD,MAAM,KAAKA,GAAf;;AAEA,MAAM,IAAIjrD,IAAI,CAAR,EAAWiK,IAAIghD,IAAItsD,MAAzB,EAAiCqB,MAAMiK,CAAvC,EAA0C,EAAGjK,CAA7C,EAAiD;;AAEhD,MAAI83B,IAAImzB,IAAKjrD,CAAL,CAAR;AACA83B,IAAE4yB,QAAF,CAAYtpB,EAAZ,EAAgB3jC,MAAOq6B,EAAEsP,EAAT,CAAhB;AAEA;AAED,CAdD;;AAgBA;;AAEA;;AAEA,IAAI6nB,aAAa,0BAAjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASC,UAAT,CAAqBC,SAArB,EAAgCC,aAAhC,EAAgD;;AAE/CD,WAAUlE,GAAV,CAAc1rD,IAAd,CAAoB6vD,aAApB;AACAD,WAAUx0B,GAAV,CAAey0B,cAAchoB,EAA7B,IAAoCgoB,aAApC;AAEA;;AAED,SAASC,YAAT,CAAuBP,UAAvB,EAAmC9C,IAAnC,EAAyCmD,SAAzC,EAAqD;;AAEpD,KAAIG,OAAOR,WAAW1rC,IAAtB;AAAA,KACCmsC,aAAaD,KAAK3wD,MADnB;;AAGA;AACAswD,YAAWO,SAAX,GAAuB,CAAvB;;AAEA,QAAQ,IAAR,EAAe;;AAEd,MAAIpxD,QAAQ6wD,WAAWh2B,IAAX,CAAiBq2B,IAAjB,CAAZ;AAAA,MACCG,WAAWR,WAAWO,SADvB;AAAA,MAGCpoB,KAAKhpC,MAAO,CAAP,CAHN;AAAA,MAICsxD,YAAYtxD,MAAO,CAAP,MAAe,GAJ5B;AAAA,MAKCuxD,YAAYvxD,MAAO,CAAP,CALb;;AAOA,MAAKsxD,SAAL,EAAiBtoB,KAAKA,KAAK,CAAV,CATH,CASgB;;AAE9B,MAAKuoB,cAActyD,SAAd,IAA2BsyD,cAAc,GAAd,IAAqBF,WAAW,CAAX,KAAiBF,UAAtE,EAAmF;;AAElF;;AAEAL,cAAYC,SAAZ,EAAuBQ,cAActyD,SAAd,GACtB,IAAIwxD,aAAJ,CAAmBznB,EAAnB,EAAuB0nB,UAAvB,EAAmC9C,IAAnC,CADsB,GAEtB,IAAI+C,gBAAJ,CAAsB3nB,EAAtB,EAA0B0nB,UAA1B,EAAsC9C,IAAtC,CAFD;;AAIA;AAEA,GAVD,MAUO;;AAEN;;AAEA,OAAIrxB,MAAMw0B,UAAUx0B,GAApB;AAAA,OAAyBi1B,OAAOj1B,IAAKyM,EAAL,CAAhC;;AAEA,OAAKwoB,SAASvyD,SAAd,EAA0B;;AAEzBuyD,WAAO,IAAIZ,iBAAJ,CAAuB5nB,EAAvB,CAAP;AACA8nB,eAAYC,SAAZ,EAAuBS,IAAvB;AAEA;;AAEDT,eAAYS,IAAZ;AAEA;AAED;AAED;;AAED;;AAEA,SAASC,aAAT,CAAwBzuB,EAAxB,EAA4BkpB,OAA5B,EAAqC7H,QAArC,EAAgD;;AAE/CuI,kBAAiBjsD,IAAjB,CAAuB,IAAvB;;AAEA,MAAK0jD,QAAL,GAAgBA,QAAhB;;AAEA,KAAIx4C,IAAIm3B,GAAG0uB,mBAAH,CAAwBxF,OAAxB,EAAiClpB,GAAG2uB,eAApC,CAAR;;AAEA,MAAM,IAAI/vD,IAAI,CAAd,EAAiBA,IAAIiK,CAArB,EAAwB,EAAGjK,CAA3B,EAA+B;;AAE9B,MAAImkD,OAAO/iB,GAAG4uB,gBAAH,CAAqB1F,OAArB,EAA8BtqD,CAA9B,CAAX;AAAA,MACCgsD,OAAO5qB,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgCnG,KAAK/gC,IAArC,CADR;;AAGAisC,eAAclL,IAAd,EAAoB6H,IAApB,EAA0B,IAA1B;AAEA;AAED;;AAED6D,cAAc9xD,SAAd,CAAwB2sD,QAAxB,GAAmC,UAAWtpB,EAAX,EAAehe,IAAf,EAAqB3lB,KAArB,EAA6B;;AAE/D,KAAIq6B,IAAI,KAAK6C,GAAL,CAAUvX,IAAV,CAAR;;AAEA,KAAK0U,MAAMz6B,SAAX,EAAuBy6B,EAAE4yB,QAAF,CAAYtpB,EAAZ,EAAgB3jC,KAAhB,EAAuB,KAAKglD,QAA5B;AAEvB,CAND;;AAQAoN,cAAc9xD,SAAd,CAAwBmyD,WAAxB,GAAsC,UAAW9uB,EAAX,EAAe1Y,MAAf,EAAuBtF,IAAvB,EAA8B;;AAEnE,KAAIzW,IAAI+b,OAAQtF,IAAR,CAAR;;AAEA,KAAKzW,MAAMtP,SAAX,EAAuB,KAAKqtD,QAAL,CAAetpB,EAAf,EAAmBhe,IAAnB,EAAyBzW,CAAzB;AAEvB,CAND;;AASA;;AAEAkjD,cAAcM,MAAd,GAAuB,UAAW/uB,EAAX,EAAe6pB,GAAf,EAAoBniB,MAApB,EAA4B2Z,QAA5B,EAAuC;;AAE7D,MAAM,IAAIziD,IAAI,CAAR,EAAWiK,IAAIghD,IAAItsD,MAAzB,EAAiCqB,MAAMiK,CAAvC,EAA0C,EAAGjK,CAA7C,EAAiD;;AAEhD,MAAI83B,IAAImzB,IAAKjrD,CAAL,CAAR;AAAA,MACC2M,IAAIm8B,OAAQhR,EAAEsP,EAAV,CADL;;AAGA,MAAKz6B,EAAE+nC,WAAF,KAAkB,KAAvB,EAA+B;;AAE9B;AACA5c,KAAE4yB,QAAF,CAAYtpB,EAAZ,EAAgBz0B,EAAElP,KAAlB,EAAyBglD,QAAzB;AAEA;AAED;AAED,CAhBD;;AAkBAoN,cAAcO,YAAd,GAA6B,UAAWnF,GAAX,EAAgBniB,MAAhB,EAAyB;;AAErD,KAAIlrB,IAAI,EAAR;;AAEA,MAAM,IAAI5d,IAAI,CAAR,EAAWiK,IAAIghD,IAAItsD,MAAzB,EAAiCqB,MAAMiK,CAAvC,EAA0C,EAAGjK,CAA7C,EAAiD;;AAEhD,MAAI83B,IAAImzB,IAAKjrD,CAAL,CAAR;AACA,MAAK83B,EAAEsP,EAAF,IAAQ0B,MAAb,EAAsBlrB,EAAEre,IAAF,CAAQu4B,CAAR;AAEtB;;AAED,QAAOla,CAAP;AAEA,CAbD;;AAeA;;;;AAIA,SAASyyC,cAAT,CAAyBt3B,MAAzB,EAAkC;;AAEjC,KAAIwwB,QAAQxwB,OAAOu3B,KAAP,CAAc,IAAd,CAAZ;;AAEA,MAAM,IAAItwD,IAAI,CAAd,EAAiBA,IAAIupD,MAAM5qD,MAA3B,EAAmCqB,GAAnC,EAA0C;;AAEzCupD,QAAOvpD,CAAP,IAAeA,IAAI,CAAN,GAAY,IAAZ,GAAmBupD,MAAOvpD,CAAP,CAAhC;AAEA;;AAED,QAAOupD,MAAMgH,IAAN,CAAY,IAAZ,CAAP;AAEA;;AAED,SAASC,WAAT,CAAsBpvB,EAAtB,EAA0BliC,IAA1B,EAAgC65B,MAAhC,EAAyC;;AAExC,KAAI03B,SAASrvB,GAAGsvB,YAAH,CAAiBxxD,IAAjB,CAAb;;AAEAkiC,IAAGuvB,YAAH,CAAiBF,MAAjB,EAAyB13B,MAAzB;AACAqI,IAAGwvB,aAAH,CAAkBH,MAAlB;;AAEA,KAAKrvB,GAAGyvB,kBAAH,CAAuBJ,MAAvB,EAA+BrvB,GAAG0vB,cAAlC,MAAuD,KAA5D,EAAoE;;AAEnEhkD,UAAQyD,KAAR,CAAe,8CAAf;AAEA;;AAED,KAAK6wB,GAAG2vB,gBAAH,CAAqBN,MAArB,MAAkC,EAAvC,EAA4C;;AAE3C3jD,UAAQC,IAAR,CAAc,0CAAd,EAA0D7N,SAASkiC,GAAG6jB,aAAZ,GAA4B,QAA5B,GAAuC,UAAjG,EAA6G7jB,GAAG2vB,gBAAH,CAAqBN,MAArB,CAA7G,EAA4IJ,eAAgBt3B,MAAhB,CAA5I;AAEA;;AAED;AACA;;AAEA,QAAO03B,MAAP;AAEA;;AAED;;;;AAIA,IAAIO,iBAAiB,CAArB;;AAEA,SAASC,qBAAT,CAAgC9tC,QAAhC,EAA2C;;AAE1C,SAASA,QAAT;;AAEC,OAAK7a,cAAL;AACC,UAAO,CAAE,QAAF,EAAY,WAAZ,CAAP;AACD,OAAKC,YAAL;AACC,UAAO,CAAE,MAAF,EAAU,WAAV,CAAP;AACD,OAAKE,YAAL;AACC,UAAO,CAAE,MAAF,EAAU,WAAV,CAAP;AACD,OAAKE,aAAL;AACC,UAAO,CAAE,MAAF,EAAU,gBAAV,CAAP;AACD,OAAKC,cAAL;AACC,UAAO,CAAE,MAAF,EAAU,iBAAV,CAAP;AACD,OAAKC,YAAL;AACC,UAAO,CAAE,MAAF,EAAU,kBAAV,CAAP;AACD,OAAKL,aAAL;AACC,UAAO,CAAE,OAAF,EAAW,kCAAX,CAAP;AACD;AACC,SAAM,IAAI8D,KAAJ,CAAW,2BAA2B6W,QAAtC,CAAN;;AAjBF;AAqBA;;AAED,SAAS+tC,wBAAT,CAAmCC,YAAnC,EAAiDhuC,QAAjD,EAA4D;;AAE3D,KAAIgW,aAAa83B,sBAAuB9tC,QAAvB,CAAjB;AACA,QAAO,UAAUguC,YAAV,GAAyB,0BAAzB,GAAsDh4B,WAAY,CAAZ,CAAtD,GAAwE,UAAxE,GAAqFA,WAAY,CAAZ,CAArF,GAAuG,KAA9G;AAEA;;AAED,SAASi4B,wBAAT,CAAmCD,YAAnC,EAAiDhuC,QAAjD,EAA4D;;AAE3D,KAAIgW,aAAa83B,sBAAuB9tC,QAAvB,CAAjB;AACA,QAAO,UAAUguC,YAAV,GAAyB,kCAAzB,GAA8Dh4B,WAAY,CAAZ,CAA9D,GAAgFA,WAAY,CAAZ,CAAhF,GAAkG,KAAzG;AAEA;;AAED,SAASk4B,sBAAT,CAAiCF,YAAjC,EAA+CG,WAA/C,EAA6D;;AAE5D,KAAIC,eAAJ;;AAEA,SAASD,WAAT;;AAEC,OAAK5tD,iBAAL;AACC6tD,qBAAkB,QAAlB;AACA;;AAED,OAAK5tD,mBAAL;AACC4tD,qBAAkB,UAAlB;AACA;;AAED,OAAK3tD,qBAAL;AACC2tD,qBAAkB,YAAlB;AACA;;AAED,OAAK1tD,iBAAL;AACC0tD,qBAAkB,iBAAlB;AACA;;AAED;AACC,SAAM,IAAIjlD,KAAJ,CAAW,8BAA8BglD,WAAzC,CAAN;;AAnBF;;AAuBA,QAAO,UAAUH,YAAV,GAAyB,0BAAzB,GAAsDI,eAAtD,GAAwE,yBAA/E;AAEA;;AAED,SAASC,kBAAT,CAA6B1W,UAA7B,EAAyCtS,UAAzC,EAAqDipB,kBAArD,EAA0E;;AAEzE3W,cAAaA,cAAc,EAA3B;;AAEA,KAAI4W,SAAS,CACV5W,WAAWC,WAAX,IAA0BvS,WAAWmpB,YAArC,IAAqDnpB,WAAWzM,OAAhE,IAA2EyM,WAAWtM,SAAtF,IAAmGsM,WAAWwP,WAAhH,GAAgI,iDAAhI,GAAoL,EADxK,EAEZ,CAAE8C,WAAWE,SAAX,IAAwBxS,WAAW8c,sBAArC,KAAiEmM,mBAAmBvzD,GAAnB,CAAwB,gBAAxB,CAAjE,GAA8G,uCAA9G,GAAwJ,EAF5I,EAGV48C,WAAWG,WAAb,IAA8BwW,mBAAmBvzD,GAAnB,CAAwB,oBAAxB,CAA9B,GAA+E,0CAA/E,GAA4H,EAHhH,EAIZ,CAAE48C,WAAWI,gBAAX,IAA+B1S,WAAWvN,MAA5C,KAAwDw2B,mBAAmBvzD,GAAnB,CAAwB,wBAAxB,CAAxD,GAA6G,+CAA7G,GAA+J,EAJnJ,CAAb;;AAOA,QAAOwzD,OAAOE,MAAP,CAAeC,eAAf,EAAiCtB,IAAjC,CAAuC,IAAvC,CAAP;AAEA;;AAED,SAASuB,eAAT,CAA0BlX,OAA1B,EAAoC;;AAEnC,KAAI8W,SAAS,EAAb;;AAEA,MAAM,IAAItuC,IAAV,IAAkBw3B,OAAlB,EAA4B;;AAE3B,MAAIn9C,QAAQm9C,QAASx3B,IAAT,CAAZ;;AAEA,MAAK3lB,UAAU,KAAf,EAAuB;;AAEvBi0D,SAAOnyD,IAAP,CAAa,aAAa6jB,IAAb,GAAoB,GAApB,GAA0B3lB,KAAvC;AAEA;;AAED,QAAOi0D,OAAOnB,IAAP,CAAa,IAAb,CAAP;AAEA;;AAED,SAASwB,uBAAT,CAAkC3wB,EAAlC,EAAsCkpB,OAAtC,EAAgD;;AAE/C,KAAI5gC,aAAa,EAAjB;;AAEA,KAAIzf,IAAIm3B,GAAG0uB,mBAAH,CAAwBxF,OAAxB,EAAiClpB,GAAG4wB,iBAApC,CAAR;;AAEA,MAAM,IAAIhyD,IAAI,CAAd,EAAiBA,IAAIiK,CAArB,EAAwBjK,GAAxB,EAA+B;;AAE9B,MAAImkD,OAAO/iB,GAAG6wB,eAAH,CAAoB3H,OAApB,EAA6BtqD,CAA7B,CAAX;AACA,MAAIojB,OAAO+gC,KAAK/gC,IAAhB;;AAEA;;AAEAsG,aAAYtG,IAAZ,IAAqBge,GAAG8wB,iBAAH,CAAsB5H,OAAtB,EAA+BlnC,IAA/B,CAArB;AAEA;;AAED,QAAOsG,UAAP;AAEA;;AAED,SAASmoC,eAAT,CAA0B94B,MAA1B,EAAmC;;AAElC,QAAOA,WAAW,EAAlB;AAEA;;AAED,SAASo5B,gBAAT,CAA2Bp5B,MAA3B,EAAmCyP,UAAnC,EAAgD;;AAE/C,QAAOzP,OACLq5B,OADK,CACI,iBADJ,EACuB5pB,WAAW6pB,YADlC,EAELD,OAFK,CAEI,kBAFJ,EAEwB5pB,WAAW8pB,aAFnC,EAGLF,OAHK,CAGI,uBAHJ,EAG6B5pB,WAAW+pB,iBAHxC,EAILH,OAJK,CAII,mBAJJ,EAIyB5pB,WAAWgqB,cAJpC,EAKLJ,OALK,CAKI,kBALJ,EAKwB5pB,WAAWiqB,aALnC,CAAP;AAOA;;AAED,SAASC,wBAAT,CAAmC35B,MAAnC,EAA2CyP,UAA3C,EAAwD;;AAEvD,QAAOzP,OACLq5B,OADK,CACI,sBADJ,EAC4B5pB,WAAWmqB,iBADvC,EAELP,OAFK,CAEI,wBAFJ,EAEgC5pB,WAAWmqB,iBAAX,GAA+BnqB,WAAWoqB,mBAF1E,CAAP;AAIA;;AAED,SAASC,aAAT,CAAwB95B,MAAxB,EAAiC;;AAEhC,KAAI+5B,UAAU,iCAAd;;AAEA,UAASV,OAAT,CAAkBh0D,KAAlB,EAAyB20D,OAAzB,EAAmC;;AAElC,MAAIX,UAAU36B,YAAas7B,OAAb,CAAd;;AAEA,MAAKX,YAAY/0D,SAAjB,EAA6B;;AAE5B,SAAM,IAAIiP,KAAJ,CAAW,+BAA+BymD,OAA/B,GAAyC,GAApD,CAAN;AAEA;;AAED,SAAOF,cAAeT,OAAf,CAAP;AAEA;;AAED,QAAOr5B,OAAOq5B,OAAP,CAAgBU,OAAhB,EAAyBV,OAAzB,CAAP;AAEA;;AAED,SAASY,WAAT,CAAsBj6B,MAAtB,EAA+B;;AAE9B,KAAI+5B,UAAU,8FAAd;;AAEA,UAASV,OAAT,CAAkBh0D,KAAlB,EAAyB4vB,KAAzB,EAAgCI,GAAhC,EAAqC6kC,OAArC,EAA+C;;AAE9C,MAAIC,SAAS,EAAb;;AAEA,OAAM,IAAIlzD,IAAIo5B,SAAUpL,KAAV,CAAd,EAAiChuB,IAAIo5B,SAAUhL,GAAV,CAArC,EAAsDpuB,GAAtD,EAA6D;;AAE5DkzD,aAAUD,QAAQb,OAAR,CAAiB,UAAjB,EAA6B,OAAOpyD,CAAP,GAAW,IAAxC,CAAV;AAEA;;AAED,SAAOkzD,MAAP;AAEA;;AAED,QAAOn6B,OAAOq5B,OAAP,CAAgBU,OAAhB,EAAyBV,OAAzB,CAAP;AAEA;;AAED,SAASe,YAAT,CAAuB1Q,QAAvB,EAAiC3H,UAAjC,EAA6CsY,IAA7C,EAAmD1qB,QAAnD,EAA6D+nB,MAA7D,EAAqEjoB,UAArE,EAAkF;;AAEjF,KAAIpH,KAAKqhB,SAAS39B,OAAlB;;AAEA,KAAI81B,UAAUlS,SAASkS,OAAvB;;AAEA,KAAI9b,eAAe2xB,OAAO3xB,YAA1B;AACA,KAAIC,iBAAiB0xB,OAAO1xB,cAA5B;;AAEA,KAAIs0B,sBAAsB,sBAA1B;;AAEA,KAAK7qB,WAAW8qB,aAAX,KAA6BxyD,YAAlC,EAAiD;;AAEhDuyD,wBAAsB,oBAAtB;AAEA,EAJD,MAIO,IAAK7qB,WAAW8qB,aAAX,KAA6BvyD,gBAAlC,EAAqD;;AAE3DsyD,wBAAsB,yBAAtB;AAEA;;AAED,KAAIE,mBAAmB,kBAAvB;AACA,KAAIC,mBAAmB,wBAAvB;AACA,KAAIC,uBAAuB,0BAA3B;;AAEA,KAAKjrB,WAAWvN,MAAhB,EAAyB;;AAExB,UAASyN,SAASzN,MAAT,CAAgBrY,OAAzB;;AAEC,QAAK7e,qBAAL;AACA,QAAKC,qBAAL;AACCuvD,uBAAmB,kBAAnB;AACA;;AAED,QAAKnvD,uBAAL;AACA,QAAKC,uBAAL;AACCkvD,uBAAmB,qBAAnB;AACA;;AAED,QAAKtvD,gCAAL;AACA,QAAKC,gCAAL;AACCqvD,uBAAmB,qBAAnB;AACA;;AAED,QAAKpvD,0BAAL;AACCovD,uBAAmB,oBAAnB;AACA;;AAnBF;;AAuBA,UAAS7qB,SAASzN,MAAT,CAAgBrY,OAAzB;;AAEC,QAAK5e,qBAAL;AACA,QAAKE,gCAAL;AACCsvD,uBAAmB,wBAAnB;AACA;;AALF;;AASA,UAAS9qB,SAAS+R,OAAlB;;AAEC,QAAKn3C,iBAAL;AACCmwD,2BAAuB,0BAAvB;AACA;;AAED,QAAKlwD,YAAL;AACCkwD,2BAAuB,qBAAvB;AACA;;AAED,QAAKjwD,YAAL;AACCiwD,2BAAuB,qBAAvB;AACA;;AAZF;AAgBA;;AAED,KAAIC,oBAAsBjR,SAASlpB,WAAT,GAAuB,CAAzB,GAA+BkpB,SAASlpB,WAAxC,GAAsD,GAA9E;;AAEA;;AAEA;;AAEA,KAAIo6B,mBAAmBnC,mBAAoB9oB,SAASoS,UAA7B,EAAyCtS,UAAzC,EAAqDsS,UAArD,CAAvB;;AAEA,KAAI8Y,gBAAgB9B,gBAAiBlX,OAAjB,CAApB;;AAEA;;AAEA,KAAI0P,UAAUlpB,GAAGyyB,aAAH,EAAd;;AAEA,KAAIC,YAAJ,EAAkBC,cAAlB;;AAEA,KAAKrrB,SAASsrB,mBAAd,EAAoC;;AAEnCF,iBAAe,CAEdF,aAFc,EAIbhC,MAJa,CAILC,eAJK,EAIatB,IAJb,CAImB,IAJnB,CAAf;;AAMA,MAAKuD,aAAan1D,MAAb,GAAsB,CAA3B,EAA+B;;AAE9Bm1D,mBAAgB,IAAhB;AAEA;;AAEDC,mBAAiB,CAEhBJ,gBAFgB,EAGhBC,aAHgB,EAKfhC,MALe,CAKPC,eALO,EAKWtB,IALX,CAKiB,IALjB,CAAjB;;AAOA,MAAKwD,eAAep1D,MAAf,GAAwB,CAA7B,EAAiC;;AAEhCo1D,qBAAkB,IAAlB;AAEA;AAED,EA3BD,MA2BO;;AAEND,iBAAe,CAEd,eAAetrB,WAAW6G,SAA1B,GAAsC,SAFxB,EAGd,eAAe7G,WAAW6G,SAA1B,GAAsC,OAHxB,EAKd,yBAAyBohB,OAAOrtC,IALlB,EAOdwwC,aAPc,EASdprB,WAAWyrB,sBAAX,GAAoC,yBAApC,GAAgE,EATlD,EAWd,0BAA0BP,iBAXZ,EAad,uBAAuBlrB,WAAW0rB,QAbpB,EAcZ1rB,WAAW2rB,MAAX,IAAqB3rB,WAAW1L,GAAlC,GAA0C,iBAA1C,GAA8D,EAdhD,EAeZ0L,WAAW2rB,MAAX,IAAqB3rB,WAAW4rB,MAAlC,GAA6C,kBAA7C,GAAkE,EAfpD,EAiBd5rB,WAAW7N,GAAX,GAAiB,iBAAjB,GAAqC,EAjBvB,EAkBd6N,WAAWvN,MAAX,GAAoB,oBAApB,GAA2C,EAlB7B,EAmBduN,WAAWvN,MAAX,GAAoB,aAAau4B,gBAAjC,GAAoD,EAnBtC,EAoBdhrB,WAAW9M,QAAX,GAAsB,sBAAtB,GAA+C,EApBjC,EAqBd8M,WAAWjN,KAAX,GAAmB,mBAAnB,GAAyC,EArB3B,EAsBdiN,WAAW3M,WAAX,GAAyB,yBAAzB,GAAqD,EAtBvC,EAuBd2M,WAAWzM,OAAX,GAAqB,qBAArB,GAA6C,EAvB/B,EAwBdyM,WAAWtM,SAAX,GAAuB,uBAAvB,GAAiD,EAxBnC,EAyBdsM,WAAWnM,eAAX,IAA8BmM,WAAWyrB,sBAAzC,GAAkE,6BAAlE,GAAkG,EAzBpF,EA0BdzrB,WAAWzN,WAAX,GAAyB,yBAAzB,GAAqD,EA1BvC,EA2BdyN,WAAW/L,YAAX,GAA0B,0BAA1B,GAAuD,EA3BzC,EA4Bd+L,WAAW7L,YAAX,GAA0B,0BAA1B,GAAuD,EA5BzC,EA6Bd6L,WAAW3N,QAAX,GAAsB,sBAAtB,GAA+C,EA7BjC,EA8Bd2N,WAAW+B,YAAX,GAA0B,mBAA1B,GAAgD,EA9BlC,EAgCd/B,WAAWwP,WAAX,GAAyB,qBAAzB,GAAiD,EAhCnC,EAkCdxP,WAAW6R,QAAX,GAAsB,sBAAtB,GAA+C,EAlCjC,EAmCd7R,WAAW6rB,gBAAX,GAA8B,sBAA9B,GAAuD,EAnCzC,EAqCd7rB,WAAWqC,YAAX,GAA0B,0BAA1B,GAAuD,EArCzC,EAsCdrC,WAAWsC,YAAX,IAA2BtC,WAAWwP,WAAX,KAA2B,KAAtD,GAA8D,0BAA9D,GAA2F,EAtC7E,EAuCdxP,WAAW8rB,WAAX,GAAyB,sBAAzB,GAAkD,EAvCpC,EAwCd9rB,WAAW+rB,SAAX,GAAuB,oBAAvB,GAA8C,EAxChC,EA0Cd/rB,WAAWgsB,gBAAX,GAA8B,uBAA9B,GAAwD,EA1C1C,EA2CdhsB,WAAWgsB,gBAAX,GAA8B,aAAanB,mBAA3C,GAAiE,EA3CnD,EA6Cd7qB,WAAWsR,eAAX,GAA6B,6BAA7B,GAA6D,EA7C/C,EA+CdtR,WAAW8c,sBAAX,GAAoC,yBAApC,GAAgE,EA/ClD,EAgDd9c,WAAW8c,sBAAX,IAAqCxK,WAAW58C,GAAX,CAAgB,gBAAhB,CAArC,GAA0E,6BAA1E,GAA0G,EAhD5F,EAkDd,2BAlDc,EAmDd,+BAnDc,EAoDd,gCApDc,EAqDd,0BArDc,EAsDd,4BAtDc,EAuDd,8BAvDc,EAyDd,0BAzDc,EA0Dd,wBA1Dc,EA2Dd,oBA3Dc,EA6Dd,kBA7Dc,EA+Dd,wBA/Dc,EAiEd,QAjEc,EAmEd,yBAnEc,EAqEd,+BArEc,EAsEd,+BAtEc,EAuEd,+BAvEc,EAwEd,+BAxEc,EA0Ed,0BA1Ec,EA4Ed,gCA5Ec,EA6Ed,gCA7Ec,EA8Ed,gCA9Ec,EA+Ed,gCA/Ec,EAiFd,QAjFc,EAmFd,gCAnFc,EAoFd,gCApFc,EAqFd,gCArFc,EAsFd,gCAtFc,EAwFd,SAxFc,EA0Fd,QA1Fc,EA4Fd,qBA5Fc,EA8Fd,4BA9Fc,EA+Fd,6BA/Fc,EAiGd,QAjGc,EAmGd,IAnGc,EAqGb0zD,MArGa,CAqGLC,eArGK,EAqGatB,IArGb,CAqGmB,IArGnB,CAAf;;AAuGAwD,mBAAiB,CAEhBJ,gBAFgB,EAIhB,eAAenrB,WAAW6G,SAA1B,GAAsC,SAJtB,EAKhB,eAAe7G,WAAW6G,SAA1B,GAAsC,OALtB,EAOhB,yBAAyBohB,OAAOrtC,IAPhB,EAShBwwC,aATgB,EAWhBprB,WAAW4Q,SAAX,GAAuB,uBAAuB5Q,WAAW4Q,SAAlC,IAAgD5Q,WAAW4Q,SAAX,GAAuB,CAAvB,GAA2B,EAA3B,GAAgC,IAAhF,CAAvB,GAAgH,EAXhG,EAWoG;;AAEpH,4BAA0Bsa,iBAbV,EAedlrB,WAAW2rB,MAAX,IAAqB3rB,WAAW1L,GAAlC,GAA0C,iBAA1C,GAA8D,EAf9C,EAgBd0L,WAAW2rB,MAAX,IAAqB3rB,WAAW4rB,MAAlC,GAA6C,kBAA7C,GAAkE,EAhBlD,EAkBhB5rB,WAAW7N,GAAX,GAAiB,iBAAjB,GAAqC,EAlBrB,EAmBhB6N,WAAWvN,MAAX,GAAoB,oBAApB,GAA2C,EAnB3B,EAoBhBuN,WAAWvN,MAAX,GAAoB,aAAas4B,gBAAjC,GAAoD,EApBpC,EAqBhB/qB,WAAWvN,MAAX,GAAoB,aAAau4B,gBAAjC,GAAoD,EArBpC,EAsBhBhrB,WAAWvN,MAAX,GAAoB,aAAaw4B,oBAAjC,GAAwD,EAtBxC,EAuBhBjrB,WAAW9M,QAAX,GAAsB,sBAAtB,GAA+C,EAvB/B,EAwBhB8M,WAAWjN,KAAX,GAAmB,mBAAnB,GAAyC,EAxBzB,EAyBhBiN,WAAW3M,WAAX,GAAyB,yBAAzB,GAAqD,EAzBrC,EA0BhB2M,WAAWzM,OAAX,GAAqB,qBAArB,GAA6C,EA1B7B,EA2BhByM,WAAWtM,SAAX,GAAuB,uBAAvB,GAAiD,EA3BjC,EA4BhBsM,WAAWzN,WAAX,GAAyB,yBAAzB,GAAqD,EA5BrC,EA6BhByN,WAAW/L,YAAX,GAA0B,0BAA1B,GAAuD,EA7BvC,EA8BhB+L,WAAW7L,YAAX,GAA0B,0BAA1B,GAAuD,EA9BvC,EA+BhB6L,WAAW3N,QAAX,GAAsB,sBAAtB,GAA+C,EA/B/B,EAgChB2N,WAAW+B,YAAX,GAA0B,mBAA1B,GAAgD,EAhChC,EAkChB/B,WAAW3L,WAAX,GAAyB,yBAAzB,GAAqD,EAlCrC,EAoChB2L,WAAWwP,WAAX,GAAyB,qBAAzB,GAAiD,EApCjC,EAsChBxP,WAAW8rB,WAAX,GAAyB,sBAAzB,GAAkD,EAtClC,EAuChB9rB,WAAW+rB,SAAX,GAAuB,oBAAvB,GAA8C,EAvC9B,EAyChB/rB,WAAWgsB,gBAAX,GAA8B,uBAA9B,GAAwD,EAzCxC,EA0ChBhsB,WAAWgsB,gBAAX,GAA8B,aAAanB,mBAA3C,GAAiE,EA1CjD,EA4ChB7qB,WAAW6Q,kBAAX,GAAgC,6BAAhC,GAAgE,EA5ChD,EA8ChB7Q,WAAWisB,uBAAX,GAAqC,mCAArC,GAA2E,EA9C3D,EAgDhBjsB,WAAW8c,sBAAX,GAAoC,yBAApC,GAAgE,EAhDhD,EAiDhB9c,WAAW8c,sBAAX,IAAqCxK,WAAW58C,GAAX,CAAgB,gBAAhB,CAArC,GAA0E,6BAA1E,GAA0G,EAjD1F,EAmDhBsqC,WAAWvN,MAAX,IAAqB6f,WAAW58C,GAAX,CAAgB,wBAAhB,CAArB,GAAkE,yBAAlE,GAA8F,EAnD9E,EAqDhB,0BArDgB,EAsDhB,8BAtDgB,EAwDdsqC,WAAW8oB,WAAX,KAA2B7tD,aAA7B,GAA+C,sBAA/C,GAAwE,EAxDxD,EAyDd+kC,WAAW8oB,WAAX,KAA2B7tD,aAA7B,GAA+Cg0B,YAAa,2BAAb,CAA/C,GAA4F,EAzD5E,EAyDgF;AAC9F+Q,aAAW8oB,WAAX,KAA2B7tD,aAA7B,GAA+C4tD,uBAAwB,aAAxB,EAAuC7oB,WAAW8oB,WAAlD,CAA/C,GAAiH,EA1DjG,EA4DhB9oB,WAAW2Q,SAAX,GAAuB,mBAAvB,GAA6C,EA5D7B,EA8Dd3Q,WAAWksB,cAAX,IAA6BlsB,WAAWmsB,WAAxC,IAAuDnsB,WAAWosB,cAAlE,IAAoFpsB,WAAWqsB,mBAAjG,GAAyHp9B,YAAa,yBAAb,CAAzH,GAAoK,EA9DpJ,EA8DwJ;AACxK+Q,aAAWmsB,WAAX,GAAyBzD,yBAA0B,kBAA1B,EAA8C1oB,WAAWmsB,WAAzD,CAAzB,GAAkG,EA/DlF,EAgEhBnsB,WAAWosB,cAAX,GAA4B1D,yBAA0B,qBAA1B,EAAiD1oB,WAAWosB,cAA5D,CAA5B,GAA2G,EAhE3F,EAiEhBpsB,WAAWqsB,mBAAX,GAAiC3D,yBAA0B,0BAA1B,EAAsD1oB,WAAWqsB,mBAAjE,CAAjC,GAA0H,EAjE1G,EAkEhBrsB,WAAWksB,cAAX,GAA4BtD,yBAA0B,qBAA1B,EAAiD5oB,WAAWksB,cAA5D,CAA5B,GAA2G,EAlE3F,EAoEhBlsB,WAAWssB,YAAX,GAA0B,2BAA2BpsB,SAASosB,YAA9D,GAA6E,EApE7D,EAsEhB,IAtEgB,EAwEflD,MAxEe,CAwEPC,eAxEO,EAwEWtB,IAxEX,CAwEiB,IAxEjB,CAAjB;AA0EA;;AAEDzxB,gBAAe+zB,cAAe/zB,YAAf,CAAf;AACAA,gBAAeqzB,iBAAkBrzB,YAAlB,EAAgC0J,UAAhC,CAAf;AACA1J,gBAAe4zB,yBAA0B5zB,YAA1B,EAAwC0J,UAAxC,CAAf;;AAEAzJ,kBAAiB8zB,cAAe9zB,cAAf,CAAjB;AACAA,kBAAiBozB,iBAAkBpzB,cAAlB,EAAkCyJ,UAAlC,CAAjB;AACAzJ,kBAAiB2zB,yBAA0B3zB,cAA1B,EAA0CyJ,UAA1C,CAAjB;;AAEA1J,gBAAek0B,YAAal0B,YAAb,CAAf;AACAC,kBAAiBi0B,YAAaj0B,cAAb,CAAjB;;AAEA,KAAIg2B,aAAajB,eAAeh1B,YAAhC;AACA,KAAIk2B,eAAejB,iBAAiBh1B,cAApC;;AAEA;AACA;;AAEA,KAAIk2B,iBAAiBzE,YAAapvB,EAAb,EAAiBA,GAAG6jB,aAApB,EAAmC8P,UAAnC,CAArB;AACA,KAAIG,mBAAmB1E,YAAapvB,EAAb,EAAiBA,GAAG+jB,eAApB,EAAqC6P,YAArC,CAAvB;;AAEA5zB,IAAG+zB,YAAH,CAAiB7K,OAAjB,EAA0B2K,cAA1B;AACA7zB,IAAG+zB,YAAH,CAAiB7K,OAAjB,EAA0B4K,gBAA1B;;AAEA;;AAEA,KAAKxsB,SAAS0S,mBAAT,KAAiC/9C,SAAtC,EAAkD;;AAEjD+jC,KAAGg0B,kBAAH,CAAuB9K,OAAvB,EAAgC,CAAhC,EAAmC5hB,SAAS0S,mBAA5C;AAEA,EAJD,MAIO,IAAK5S,WAAWqC,YAAX,KAA4B,IAAjC,EAAwC;;AAE9C;AACAzJ,KAAGg0B,kBAAH,CAAuB9K,OAAvB,EAAgC,CAAhC,EAAmC,UAAnC;AAEA;;AAEDlpB,IAAGi0B,WAAH,CAAgB/K,OAAhB;;AAEA,KAAIgL,aAAal0B,GAAGm0B,iBAAH,CAAsBjL,OAAtB,EAAgCkL,IAAhC,EAAjB;AACA,KAAIC,YAAYr0B,GAAG2vB,gBAAH,CAAqBkE,cAArB,EAAsCO,IAAtC,EAAhB;AACA,KAAIE,cAAct0B,GAAG2vB,gBAAH,CAAqBmE,gBAArB,EAAwCM,IAAxC,EAAlB;;AAEA,KAAIG,WAAW,IAAf;AACA,KAAIC,kBAAkB,IAAtB;;AAEA;AACA;;AAEA,KAAKx0B,GAAG0uB,mBAAH,CAAwBxF,OAAxB,EAAiClpB,GAAGy0B,WAApC,MAAsD,KAA3D,EAAmE;;AAElEF,aAAW,KAAX;;AAEA7oD,UAAQyD,KAAR,CAAe,oCAAf,EAAqD6wB,GAAG00B,QAAH,EAArD,EAAoE,oBAApE,EAA0F10B,GAAG0uB,mBAAH,CAAwBxF,OAAxB,EAAiClpB,GAAG20B,eAApC,CAA1F,EAAiJ,sBAAjJ,EAAyKT,UAAzK,EAAqLG,SAArL,EAAgMC,WAAhM;AAEA,EAND,MAMO,IAAKJ,eAAe,EAApB,EAAyB;;AAE/BxoD,UAAQC,IAAR,CAAc,4CAAd,EAA4DuoD,UAA5D;AAEA,EAJM,MAIA,IAAKG,cAAc,EAAd,IAAoBC,gBAAgB,EAAzC,EAA8C;;AAEpDE,oBAAkB,KAAlB;AAEA;;AAED,KAAKA,eAAL,EAAuB;;AAEtB,OAAKI,WAAL,GAAmB;;AAElBL,aAAUA,QAFQ;AAGlBjtB,aAAUA,QAHQ;;AAKlB4sB,eAAYA,UALM;;AAOlBx2B,iBAAc;;AAEbpzB,SAAK+pD,SAFQ;AAGbQ,YAAQnC;;AAHK,IAPI;;AAclB/0B,mBAAgB;;AAEfrzB,SAAKgqD,WAFU;AAGfO,YAAQlC;;AAHO;;AAdE,GAAnB;AAuBA;;AAED;;AAEA3yB,IAAG80B,YAAH,CAAiBjB,cAAjB;AACA7zB,IAAG80B,YAAH,CAAiBhB,gBAAjB;;AAEA;;AAEA,KAAIiB,cAAJ;;AAEA,MAAK1L,WAAL,GAAmB,YAAY;;AAE9B,MAAK0L,mBAAmB94D,SAAxB,EAAoC;;AAEnC84D,oBAAiB,IAAItG,aAAJ,CAAmBzuB,EAAnB,EAAuBkpB,OAAvB,EAAgC7H,QAAhC,CAAjB;AAEA;;AAED,SAAO0T,cAAP;AAEA,EAVD;;AAYA;;AAEA,KAAIC,gBAAJ;;AAEA,MAAKC,aAAL,GAAqB,YAAY;;AAEhC,MAAKD,qBAAqB/4D,SAA1B,EAAsC;;AAErC+4D,sBAAmBrE,wBAAyB3wB,EAAzB,EAA6BkpB,OAA7B,CAAnB;AAEA;;AAED,SAAO8L,gBAAP;AAEA,EAVD;;AAYA;;AAEA,MAAKE,OAAL,GAAe,YAAY;;AAE1Bl1B,KAAGm1B,aAAH,CAAkBjM,OAAlB;AACA,OAAKA,OAAL,GAAejtD,SAAf;AAEA,EALD;;AAOA;;AAEAW,QAAO8N,gBAAP,CAAyB,IAAzB,EAA+B;;AAE9B8rB,YAAU;AACT15B,QAAK,YAAY;;AAEhB4O,YAAQC,IAAR,CAAc,sDAAd;AACA,WAAO,KAAK09C,WAAL,EAAP;AAEA;AANQ,GAFoB;;AAW9B/gC,cAAY;AACXxrB,QAAK,YAAY;;AAEhB4O,YAAQC,IAAR,CAAc,0DAAd;AACA,WAAO,KAAKspD,aAAL,EAAP;AAEA;AANU;;AAXkB,EAA/B;;AAuBA;;AAEA,MAAKjzC,IAAL,GAAYqtC,OAAOrtC,IAAnB;AACA,MAAKgkB,EAAL,GAAU4pB,gBAAV;AACA,MAAKoC,IAAL,GAAYA,IAAZ;AACA,MAAKoD,SAAL,GAAiB,CAAjB;AACA,MAAKlM,OAAL,GAAeA,OAAf;AACA,MAAKxrB,YAAL,GAAoBm2B,cAApB;AACA,MAAKl2B,cAAL,GAAsBm2B,gBAAtB;;AAEA,QAAO,IAAP;AAEA;;AAED;;;;AAIA,SAASuB,aAAT,CAAwBhU,QAAxB,EAAkC3H,UAAlC,EAA8C4b,YAA9C,EAA6D;;AAE5D,KAAIzM,WAAW,EAAf;;AAEA,KAAI0M,YAAY;AACfC,qBAAmB,OADJ;AAEfC,wBAAsB,cAFP;AAGfC,sBAAoB,QAHL;AAIftc,qBAAmB,OAJJ;AAKfuc,uBAAqB,SALN;AAMfC,qBAAmB,OANJ;AAOfC,oBAAkB,OAPH;AAQfC,wBAAsB,UARP;AASfC,wBAAsB,UATP;AAUfC,qBAAmB,OAVJ;AAWfC,sBAAoB,QAXL;AAYfC,kBAAgB,QAZD;AAafC,kBAAgB;AAbD,EAAhB;;AAgBA,KAAIC,iBAAiB,CACpB,WADoB,EACP,wBADO,EACmB,KADnB,EAC0B,aAD1B,EACyC,QADzC,EACmD,YADnD,EACiE,gBADjE,EAEpB,UAFoB,EAER,OAFQ,EAEC,aAFD,EAEgB,qBAFhB,EAEuC,SAFvC,EAEkD,WAFlD,EAE+D,iBAF/D,EAEkF,aAFlF,EAGpB,cAHoB,EAGJ,cAHI,EAGY,aAHZ,EAIpB,UAJoB,EAIR,SAJQ,EAIG,cAJH,EAImB,KAJnB,EAI0B,QAJ1B,EAIoC,QAJpC,EAKpB,aALoB,EAKL,iBALK,EAKc,wBALd,EAKwC,UALxC,EAMpB,UANoB,EAMR,kBANQ,EAMY,cANZ,EAM4B,cAN5B,EAOpB,iBAPoB,EAOD,iBAPC,EAOkB,oBAPlB,EAQpB,cARoB,EAQJ,gBARI,EAQc,eARd,EAQ+B,eAR/B,EAQgD,mBARhD,EASpB,kBAToB,EASA,eATA,EASiB,aATjB,EASgC,yBAThC,EAUpB,WAVoB,EAUP,aAVO,EAUQ,WAVR,EAUqB,mBAVrB,EAU0C,qBAV1C,EAUiE,cAVjE,EAUiF,WAVjF,CAArB;;AAcA,UAASC,aAAT,CAAwB/uC,MAAxB,EAAiC;;AAEhC,MAAIgvC,WAAWhvC,OAAOgvC,QAAtB;AACA,MAAIC,QAAQD,SAASC,KAArB;;AAEA,MAAKjB,aAAajQ,mBAAlB,EAAwC;;AAEvC,UAAO,IAAP;AAEA,GAJD,MAIO;;AAEN;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAImR,kBAAkBlB,aAAazQ,iBAAnC;AACA,OAAI4R,kBAAkBv6D,KAAKK,KAAL,CAAY,CAAEi6D,kBAAkB,EAApB,IAA2B,CAAvC,CAAtB;;AAEA,OAAI1D,WAAW52D,KAAKwM,GAAL,CAAU+tD,eAAV,EAA2BF,MAAMh5D,MAAjC,CAAf;;AAEA,OAAKu1D,WAAWyD,MAAMh5D,MAAtB,EAA+B;;AAE9BmO,YAAQC,IAAR,CAAc,uCAAuC4qD,MAAMh5D,MAA7C,GAAsD,4BAAtD,GAAqFu1D,QAArF,GAAgG,GAA9G;AACA,WAAO,CAAP;AAEA;;AAED,UAAOA,QAAP;AAEA;AAED;;AAED,UAAS4D,yBAAT,CAAoCn9B,GAApC,EAAyCo9B,mBAAzC,EAA+D;;AAE9D,MAAI50C,QAAJ;;AAEA,MAAK,CAAEwX,GAAP,EAAa;;AAEZxX,cAAW7a,cAAX;AAEA,GAJD,MAIO,IAAKqyB,IAAI1W,SAAT,EAAqB;;AAE3Bd,cAAWwX,IAAIxX,QAAf;AAEA,GAJM,MAIA,IAAKwX,IAAI9T,mBAAT,EAA+B;;AAErC/Z,WAAQC,IAAR,CAAc,2HAAd;AACAoW,cAAWwX,IAAIlU,OAAJ,CAAYtD,QAAvB;AAEA;;AAED;AACA,MAAKA,aAAa7a,cAAb,IAA+ByvD,mBAApC,EAA0D;;AAEzD50C,cAAW3a,aAAX;AAEA;;AAED,SAAO2a,QAAP;AAEA;;AAED,MAAK60C,aAAL,GAAqB,UAAWtvB,QAAX,EAAqBvL,MAArB,EAA6B86B,OAA7B,EAAsCn7B,GAAtC,EAA2Co7B,WAA3C,EAAwDC,iBAAxD,EAA2EzvC,MAA3E,EAAoF;;AAExG,MAAI0vC,WAAWzB,UAAWjuB,SAASxpC,IAApB,CAAf;;AAEA;AACA;;AAEA,MAAIg1D,WAAWxrC,OAAO2vC,aAAP,GAAuBZ,cAAe/uC,MAAf,CAAvB,GAAiD,CAAhE;AACA,MAAI2mB,YAAYqnB,aAAarnB,SAA7B;;AAEA,MAAK3G,SAAS2G,SAAT,KAAuB,IAA5B,EAAmC;;AAElCA,eAAYqnB,aAAa3R,eAAb,CAA8Brc,SAAS2G,SAAvC,CAAZ;;AAEA,OAAKA,cAAc3G,SAAS2G,SAA5B,EAAwC;;AAEvCviC,YAAQC,IAAR,CAAc,mCAAd,EAAmD27B,SAAS2G,SAA5D,EAAuE,sBAAvE,EAA+FA,SAA/F,EAA0G,UAA1G;AAEA;AAED;;AAED,MAAIipB,sBAAsB7V,SAAS8V,eAAT,EAA1B;;AAEA,MAAI/vB,aAAa;;AAEhB4vB,aAAUA,QAFM;;AAIhB/oB,cAAWA,SAJK;AAKhB4kB,2BAAwByC,aAAanQ,cALrB;AAMhBmO,mBAAgBoD,0BAA6B,CAAEQ,mBAAJ,GAA4B,IAA5B,GAAmCA,oBAAoB7xC,OAAlF,EAA2Fg8B,SAAS+V,WAApG,CANA;AAOhB79B,QAAK,CAAC,CAAE+N,SAAS/N,GAPD;AAQhBg6B,gBAAamD,0BAA2BpvB,SAAS/N,GAApC,EAAyC8nB,SAASgW,UAAlD,CARG;AAShBx9B,WAAQ,CAAC,CAAEyN,SAASzN,MATJ;AAUhBy9B,eAAYhwB,SAASzN,MAAT,IAAmByN,SAASzN,MAAT,CAAgBrY,OAV/B;AAWhBgyC,mBAAgBkD,0BAA2BpvB,SAASzN,MAApC,EAA4CwnB,SAASgW,UAArD,CAXA;AAYhB9G,iBAAgB,CAAC,CAAEjpB,SAASzN,MAAd,KAA8ByN,SAASzN,MAAT,CAAgBrY,OAAhB,KAA4Bxe,uBAA9B,IAA6DskC,SAASzN,MAAT,CAAgBrY,OAAhB,KAA4Bve,uBAArH,CAZE;AAahBq3B,aAAU,CAAC,CAAEgN,SAAShN,QAbN;AAchBH,UAAO,CAAC,CAAEmN,SAASnN,KAdH;AAehBM,gBAAa,CAAC,CAAE6M,SAAS7M,WAfT;AAgBhBg5B,wBAAqBiD,0BAA2BpvB,SAAS7M,WAApC,EAAiD4mB,SAASgW,UAA1D,CAhBL;AAiBhB18B,YAAS,CAAC,CAAE2M,SAAS3M,OAjBL;AAkBhBG,cAAW,CAAC,CAAEwM,SAASxM,SAlBP;AAmBhBG,oBAAiB,CAAC,CAAEqM,SAASrM,eAnBb;AAoBhBI,iBAAc,CAAC,CAAEiM,SAASjM,YApBV;AAqBhBE,iBAAc,CAAC,CAAE+L,SAAS/L,YArBV;AAsBhB5B,gBAAa,CAAC,CAAE2N,SAAS3N,WAtBT;AAuBhBF,aAAU,CAAC,CAAE6N,SAAS7N,QAvBN;;AAyBhBgC,gBAAa,CAAC,CAAE6L,SAAS7L,WAzBT;;AA2BhB4d,YAAS/R,SAAS+R,OA3BF;;AA6BhBlQ,iBAAc7B,SAAS6B,YA7BP;;AA+BhBzN,QAAK,CAAC,CAAEA,GA/BQ;AAgChBq3B,WAAQzrB,SAAS5L,GAhCD;AAiChBs3B,WAAUt3B,OAAOA,IAAI67B,SAjCL;;AAmChB3gB,gBAAatP,SAASsP,WAnCN;;AAqChB8B,oBAAiBpR,SAASoR,eArCV;AAsChBwL,2BAAwBoR,aAAapR,sBAtCrB;;AAwChBjL,aAAU3R,SAAS2R,QAAT,IAAqB6Z,WAAW,CAxC1B;AAyChBA,aAAUA,QAzCM;AA0ChBG,qBAAkBqC,aAAajQ,mBA1Cf;;AA4ChB5b,iBAAcnC,SAASmC,YA5CP;AA6ChBC,iBAAcpC,SAASoC,YA7CP;AA8ChB8tB,oBAAiBnW,SAASmW,eA9CV;AA+ChBC,oBAAiBpW,SAASoW,eA/CV;;AAiDhBxG,iBAAcl1B,OAAO27B,WAAP,CAAmBn6D,MAjDjB;AAkDhB6zD,mBAAgBr1B,OAAOnU,KAAP,CAAarqB,MAlDb;AAmDhB2zD,kBAAen1B,OAAO47B,IAAP,CAAYp6D,MAnDX;AAoDhB4zD,sBAAmBp1B,OAAO67B,QAAP,CAAgBr6D,MApDnB;AAqDhB8zD,kBAAet1B,OAAO87B,IAAP,CAAYt6D,MArDX;;AAuDhBg0D,sBAAmBuF,WAvDH;AAwDhBtF,wBAAqBuF,iBAxDL;;AA0DhBhf,cAAWzQ,SAASyQ,SA1DJ;;AA4DhBqb,qBAAkB/R,SAASyW,SAAT,CAAmBtvB,OAAnB,IAA8BlhB,OAAOgd,aAArC,IAAsDuyB,QAAQt5D,MAAR,GAAiB,CA5DzE;AA6DhB20D,kBAAe7Q,SAASyW,SAAT,CAAmBh6D,IA7DlB;;AA+DhBoyD,gBAAa7O,SAAS6O,WA/DN;AAgEhBmD,4BAAyBhS,SAASgS,uBAhElB;;AAkEhBpb,uBAAoB3Q,SAAS2Q,kBAlEb;;AAoEhBD,cAAW1Q,SAAS0Q,SApEJ;AAqEhBkb,gBAAa5rB,SAASqP,IAAT,KAAkB72C,UArEf;AAsEhBqzD,cAAW7rB,SAASqP,IAAT,KAAkB92C,QAtEb;;AAwEhB6zD,iBAAgBpsB,SAASosB,YAAT,KAA0Bz3D,SAA5B,GAA0CqrC,SAASosB,YAAnD,GAAkE;;AAxEhE,GAAjB;;AA4EA,SAAOtsB,UAAP;AAEA,EAtGD;;AAwGA,MAAK2wB,cAAL,GAAsB,UAAWzwB,QAAX,EAAqBF,UAArB,EAAkC;;AAEvD,MAAI1oC,QAAQ,EAAZ;;AAEA,MAAK0oC,WAAW4vB,QAAhB,EAA2B;;AAE1Bt4D,SAAMP,IAAN,CAAYipC,WAAW4vB,QAAvB;AAEA,GAJD,MAIO;;AAENt4D,SAAMP,IAAN,CAAYmpC,SAAS3J,cAArB;AACAj/B,SAAMP,IAAN,CAAYmpC,SAAS5J,YAArB;AAEA;;AAED,MAAK4J,SAASkS,OAAT,KAAqBv9C,SAA1B,EAAsC;;AAErC,QAAM,IAAI+lB,IAAV,IAAkBslB,SAASkS,OAA3B,EAAqC;;AAEpC96C,UAAMP,IAAN,CAAY6jB,IAAZ;AACAtjB,UAAMP,IAAN,CAAYmpC,SAASkS,OAAT,CAAkBx3B,IAAlB,CAAZ;AAEA;AAED;;AAED,OAAM,IAAIpjB,IAAI,CAAd,EAAiBA,IAAIw3D,eAAe74D,MAApC,EAA4CqB,GAA5C,EAAmD;;AAElDF,SAAMP,IAAN,CAAYipC,WAAYgvB,eAAgBx3D,CAAhB,CAAZ,CAAZ;AAEA;;AAEDF,QAAMP,IAAN,CAAYmpC,SAAS8Q,eAAT,CAAyBr7C,QAAzB,EAAZ;;AAEA2B,QAAMP,IAAN,CAAYkjD,SAAS+V,WAArB;;AAEA,SAAO14D,MAAMywD,IAAN,EAAP;AAEA,EAtCD;;AAwCA,MAAK6I,cAAL,GAAsB,UAAW1wB,QAAX,EAAqB+nB,MAArB,EAA6BjoB,UAA7B,EAAyC4qB,IAAzC,EAAgD;;AAErE,MAAI9I,OAAJ;;AAEA;AACA,OAAM,IAAIzvC,IAAI,CAAR,EAAWw+C,KAAKpP,SAAStrD,MAA/B,EAAuCkc,IAAIw+C,EAA3C,EAA+Cx+C,GAA/C,EAAsD;;AAErD,OAAIy+C,cAAcrP,SAAUpvC,CAAV,CAAlB;;AAEA,OAAKy+C,YAAYlG,IAAZ,KAAqBA,IAA1B,EAAiC;;AAEhC9I,cAAUgP,WAAV;AACA,MAAGhP,QAAQkM,SAAX;;AAEA;AAEA;AAED;;AAED,MAAKlM,YAAYjtD,SAAjB,EAA6B;;AAE5BitD,aAAU,IAAI6I,YAAJ,CAAkB1Q,QAAlB,EAA4B3H,UAA5B,EAAwCsY,IAAxC,EAA8C1qB,QAA9C,EAAwD+nB,MAAxD,EAAgEjoB,UAAhE,CAAV;AACAyhB,YAAS1qD,IAAT,CAAe+qD,OAAf;AAEA;;AAED,SAAOA,OAAP;AAEA,EA7BD;;AA+BA,MAAKiP,cAAL,GAAsB,UAAWjP,OAAX,EAAqB;;AAE1C,MAAK,EAAGA,QAAQkM,SAAX,KAAyB,CAA9B,EAAkC;;AAEjC;AACA,OAAIx2D,IAAIiqD,SAAS3qD,OAAT,CAAkBgrD,OAAlB,CAAR;AACAL,YAAUjqD,CAAV,IAAgBiqD,SAAUA,SAAStrD,MAAT,GAAkB,CAA5B,CAAhB;AACAsrD,YAASuP,GAAT;;AAEA;AACAlP,WAAQgM,OAAR;AAEA;AAED,EAdD;;AAgBA;AACA,MAAKrM,QAAL,GAAgBA,QAAhB;AAEA;;AAED;;;;AAIA,SAASwP,eAAT,GAA2B;;AAE1B,KAAIn8B,aAAa,IAAIgE,OAAJ,EAAjB;;AAEA,UAASpjC,GAAT,CAAcwqB,MAAd,EAAuB;;AAEtB,MAAIiS,MAAM2C,WAAWp/B,GAAX,CAAgBwqB,MAAhB,CAAV;;AAEA,MAAKiS,QAAQt9B,SAAb,EAAyB;;AAExBs9B,SAAM,EAAN;AACA2C,cAAWvxB,GAAX,CAAgB2c,MAAhB,EAAwBiS,GAAxB;AAEA;;AAED,SAAOA,GAAP;AAEA;;AAED,UAAS4I,MAAT,CAAiB7a,MAAjB,EAA0B;;AAEzB4U,aAAWmG,MAAX,CAAmB/a,MAAnB;AAEA;;AAED,UAASlM,MAAT,CAAiBkM,MAAjB,EAAyBqgB,GAAzB,EAA8BtrC,KAA9B,EAAsC;;AAErC6/B,aAAWp/B,GAAX,CAAgBwqB,MAAhB,EAA0BqgB,GAA1B,IAAkCtrC,KAAlC;AAEA;;AAED,UAASgoB,OAAT,GAAmB;;AAElB6X,eAAa,IAAIgE,OAAJ,EAAb;AAEA;;AAED,QAAO;AACNpjC,OAAKA,GADC;AAENqlC,UAAQA,MAFF;AAGN/mB,UAAQA,MAHF;AAINiJ,WAASA;AAJH,EAAP;AAOA;;AAED;;;;AAIA,SAASi0C,iBAAT,CAA4BvsD,CAA5B,EAA+BC,CAA/B,EAAmC;;AAElC,KAAKD,EAAEy4B,WAAF,KAAkBx4B,EAAEw4B,WAAzB,EAAuC;;AAEtC,SAAOz4B,EAAEy4B,WAAF,GAAgBx4B,EAAEw4B,WAAzB;AAEA,EAJD,MAIO,IAAKz4B,EAAEm9C,OAAF,IAAal9C,EAAEk9C,OAAf,IAA0Bn9C,EAAEm9C,OAAF,KAAcl9C,EAAEk9C,OAA/C,EAAyD;;AAE/D,SAAOn9C,EAAEm9C,OAAF,CAAUljB,EAAV,GAAeh6B,EAAEk9C,OAAF,CAAUljB,EAAhC;AAEA,EAJM,MAIA,IAAKj6B,EAAEu7B,QAAF,CAAWtB,EAAX,KAAkBh6B,EAAEs7B,QAAF,CAAWtB,EAAlC,EAAuC;;AAE7C,SAAOj6B,EAAEu7B,QAAF,CAAWtB,EAAX,GAAgBh6B,EAAEs7B,QAAF,CAAWtB,EAAlC;AAEA,EAJM,MAIA,IAAKj6B,EAAEgF,CAAF,KAAQ/E,EAAE+E,CAAf,EAAmB;;AAEzB,SAAOhF,EAAEgF,CAAF,GAAM/E,EAAE+E,CAAf;AAEA,EAJM,MAIA;;AAEN,SAAOhF,EAAEi6B,EAAF,GAAOh6B,EAAEg6B,EAAhB;AAEA;AAED;;AAED,SAASuyB,wBAAT,CAAmCxsD,CAAnC,EAAsCC,CAAtC,EAA0C;;AAEzC,KAAKD,EAAEy4B,WAAF,KAAkBx4B,EAAEw4B,WAAzB,EAAuC;;AAEtC,SAAOz4B,EAAEy4B,WAAF,GAAgBx4B,EAAEw4B,WAAzB;AAEA,EAAC,IAAKz4B,EAAEgF,CAAF,KAAQ/E,EAAE+E,CAAf,EAAmB;;AAEpB,SAAO/E,EAAE+E,CAAF,GAAMhF,EAAEgF,CAAf;AAEA,EAJC,MAIK;;AAEN,SAAOhF,EAAEi6B,EAAF,GAAOh6B,EAAEg6B,EAAhB;AAEA;AAED;;AAED,SAASwyB,eAAT,GAA2B;;AAE1B,KAAIC,cAAc,EAAlB;AACA,KAAIC,mBAAmB,CAAvB;;AAEA,KAAIC,SAAS,EAAb;AACA,KAAI9hB,cAAc,EAAlB;;AAEA,UAASkP,IAAT,GAAgB;;AAEf2S,qBAAmB,CAAnB;;AAEAC,SAAOp7D,MAAP,GAAgB,CAAhB;AACAs5C,cAAYt5C,MAAZ,GAAqB,CAArB;AAEA;;AAED,UAASY,IAAT,CAAempB,MAAf,EAAuBY,QAAvB,EAAiCof,QAAjC,EAA2Cv2B,CAA3C,EAA8Cw6B,KAA9C,EAAsD;;AAErD,MAAIqtB,aAAaH,YAAaC,gBAAb,CAAjB;;AAEA,MAAKE,eAAe38D,SAApB,EAAgC;;AAE/B28D,gBAAa;AACZ5yB,QAAI1e,OAAO0e,EADC;AAEZ1e,YAAQA,MAFI;AAGZY,cAAUA,QAHE;AAIZof,cAAUA,QAJE;AAKZ4hB,aAAS5hB,SAAS4hB,OALN;AAMZ1kB,iBAAald,OAAOkd,WANR;AAOZzzB,OAAGA,CAPS;AAQZw6B,WAAOA;AARK,IAAb;;AAWAktB,eAAaC,gBAAb,IAAkCE,UAAlC;AAEA,GAfD,MAeO;;AAENA,cAAW5yB,EAAX,GAAgB1e,OAAO0e,EAAvB;AACA4yB,cAAWtxC,MAAX,GAAoBA,MAApB;AACAsxC,cAAW1wC,QAAX,GAAsBA,QAAtB;AACA0wC,cAAWtxB,QAAX,GAAsBA,QAAtB;AACAsxB,cAAW1P,OAAX,GAAqB5hB,SAAS4hB,OAA9B;AACA0P,cAAWp0B,WAAX,GAAyBld,OAAOkd,WAAhC;AACAo0B,cAAW7nD,CAAX,GAAeA,CAAf;AACA6nD,cAAWrtB,KAAX,GAAmBA,KAAnB;AAEA;;AAED,GAAEjE,SAASuP,WAAT,KAAyB,IAAzB,GAAgCA,WAAhC,GAA8C8hB,MAAhD,EAAyDx6D,IAAzD,CAA+Dy6D,UAA/D;;AAEAF;AAEA;;AAED,UAASlqB,IAAT,GAAgB;;AAEf,MAAKmqB,OAAOp7D,MAAP,GAAgB,CAArB,EAAyBo7D,OAAOnqB,IAAP,CAAa8pB,iBAAb;AACzB,MAAKzhB,YAAYt5C,MAAZ,GAAqB,CAA1B,EAA8Bs5C,YAAYrI,IAAZ,CAAkB+pB,wBAAlB;AAE9B;;AAED,QAAO;AACNI,UAAQA,MADF;AAEN9hB,eAAaA,WAFP;;AAINkP,QAAMA,IAJA;AAKN5nD,QAAMA,IALA;;AAONqwC,QAAMA;AAPA,EAAP;AAUA;;AAED,SAASqqB,gBAAT,GAA4B;;AAE3B,KAAIC,QAAQ,EAAZ;;AAEA,UAASh8D,GAAT,CAAcilD,KAAd,EAAqBljC,MAArB,EAA8B;;AAE7B,MAAI6wB,OAAOqS,MAAM/b,EAAN,GAAW,GAAX,GAAiBnnB,OAAOmnB,EAAnC;AACA,MAAI+yB,OAAOD,MAAOppB,IAAP,CAAX;;AAEA,MAAKqpB,SAAS98D,SAAd,EAA0B;;AAEzB;;AAEA88D,UAAO,IAAIP,eAAJ,EAAP;AACAM,SAAOppB,IAAP,IAAgBqpB,IAAhB;AAEA;;AAED,SAAOA,IAAP;AAEA;;AAED,UAAS10C,OAAT,GAAmB;;AAElBy0C,UAAQ,EAAR;AAEA;;AAED,QAAO;AACNh8D,OAAKA,GADC;AAENunB,WAASA;AAFH,EAAP;AAKA;;AAED;;;;AAIA,SAAS20C,aAAT,GAAyB;;AAExB,KAAIj9B,SAAS,EAAb;;AAEA,QAAO;;AAENj/B,OAAK,UAAWm8D,KAAX,EAAmB;;AAEvB,OAAKl9B,OAAQk9B,MAAMjzB,EAAd,MAAuB/pC,SAA5B,EAAwC;;AAEvC,WAAO8/B,OAAQk9B,MAAMjzB,EAAd,CAAP;AAEA;;AAED,OAAIxP,QAAJ;;AAEA,WAASyiC,MAAMn7D,IAAf;;AAEC,SAAK,kBAAL;AACC04B,gBAAW;AACV/J,iBAAW,IAAIxb,OAAJ,EADD;AAEV6mB,aAAO,IAAIZ,KAAJ,EAFG;;AAIViF,cAAQ,KAJE;AAKVC,kBAAY,CALF;AAMVC,oBAAc,CANJ;AAOVC,qBAAe,IAAI7xB,OAAJ;AAPL,MAAX;AASA;;AAED,SAAK,WAAL;AACC+rB,gBAAW;AACVpf,gBAAU,IAAInG,OAAJ,EADA;AAEVwb,iBAAW,IAAIxb,OAAJ,EAFD;AAGV6mB,aAAO,IAAIZ,KAAJ,EAHG;AAIV/H,gBAAU,CAJA;AAKVuN,eAAS,CALC;AAMVC,mBAAa,CANH;AAOVC,aAAO,CAPG;;AASVT,cAAQ,KATE;AAUVC,kBAAY,CAVF;AAWVC,oBAAc,CAXJ;AAYVC,qBAAe,IAAI7xB,OAAJ;AAZL,MAAX;AAcA;;AAED,SAAK,YAAL;AACC+rB,gBAAW;AACVpf,gBAAU,IAAInG,OAAJ,EADA;AAEV6mB,aAAO,IAAIZ,KAAJ,EAFG;AAGV/H,gBAAU,CAHA;AAIVyN,aAAO,CAJG;;AAMVT,cAAQ,KANE;AAOVC,kBAAY,CAPF;AAQVC,oBAAc,CARJ;AASVC,qBAAe,IAAI7xB,OAAJ,EATL;AAUVuyB,wBAAkB,CAVR;AAWVC,uBAAiB;AAXP,MAAX;AAaA;;AAED,SAAK,iBAAL;AACCzG,gBAAW;AACV/J,iBAAW,IAAIxb,OAAJ,EADD;AAEVosB,gBAAU,IAAInG,KAAJ,EAFA;AAGVoG,mBAAa,IAAIpG,KAAJ;AAHH,MAAX;AAKA;;AAED,SAAK,eAAL;AACCV,gBAAW;AACVsB,aAAO,IAAIZ,KAAJ,EADG;AAEV9f,gBAAU,IAAInG,OAAJ,EAFA;AAGVioD,iBAAW,IAAIjoD,OAAJ,EAHD;AAIVkoD,kBAAY,IAAIloD,OAAJ;AACZ;AALU,MAAX;AAOA;;AA/DF;;AAmEA8qB,UAAQk9B,MAAMjzB,EAAd,IAAqBxP,QAArB;;AAEA,UAAOA,QAAP;AAEA;;AAnFK,EAAP;AAuFA;;AAED,IAAIrhB,QAAQ,CAAZ;;AAEA,SAASikD,WAAT,GAAuB;;AAEtB,KAAI3xB,QAAQ,IAAIuxB,aAAJ,EAAZ;;AAEA,KAAI1X,QAAQ;;AAEXtb,MAAI7wB,OAFO;;AAIXu6B,QAAM,EAJK;;AAMX2pB,WAAS,CAAE,CAAF,EAAK,CAAL,EAAQ,CAAR,CANE;AAOX3B,eAAa,EAPF;AAQXn7B,wBAAsB,EARX;AASXC,2BAAyB,EATd;AAUXm7B,QAAM,EAVK;AAWX96B,iBAAe,EAXJ;AAYXC,oBAAkB,EAZP;AAaX86B,YAAU,EAbC;AAcXhwC,SAAO,EAdI;AAeXsV,kBAAgB,EAfL;AAgBXC,qBAAmB,EAhBR;AAiBX06B,QAAM;;AAjBK,EAAZ;;AAqBA,KAAIyB,UAAU,IAAIroD,OAAJ,EAAd;AACA,KAAI4P,UAAU,IAAI3R,OAAJ,EAAd;AACA,KAAIqqD,WAAW,IAAIrqD,OAAJ,EAAf;;AAEA,UAASsqD,KAAT,CAAgBz9B,MAAhB,EAAwB86B,OAAxB,EAAiCh4C,MAAjC,EAA0C;;AAEzC,MAAIrC,IAAI,CAAR;AAAA,MAAWmE,IAAI,CAAf;AAAA,MAAkB3U,IAAI,CAAtB;;AAEA,MAAIytD,oBAAoB,CAAxB;AACA,MAAIC,cAAc,CAAlB;AACA,MAAIC,aAAa,CAAjB;AACA,MAAIC,iBAAiB,CAArB;AACA,MAAIC,aAAa,CAAjB;;AAEA,MAAI/S,aAAajoC,OAAOkpB,kBAAxB;;AAEA,OAAM,IAAInpC,IAAI,CAAR,EAAWC,IAAIk9B,OAAOx+B,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAIq6D,QAAQl9B,OAAQn9B,CAAR,CAAZ;;AAEA,OAAIk5B,QAAQmhC,MAAMnhC,KAAlB;AACA,OAAIgiC,YAAYb,MAAMa,SAAtB;AACA,OAAI3qC,WAAW8pC,MAAM9pC,QAArB;;AAEA,OAAI2oC,YAAcmB,MAAM98B,MAAN,IAAgB88B,MAAM98B,MAAN,CAAa5C,GAA/B,GAAuC0/B,MAAM98B,MAAN,CAAa5C,GAAb,CAAiBlU,OAAxD,GAAkE,IAAlF;;AAEA,OAAK4zC,MAAMc,cAAX,EAA4B;;AAE3Bv9C,SAAKsb,MAAMtb,CAAN,GAAUs9C,SAAf;AACAn5C,SAAKmX,MAAMnX,CAAN,GAAUm5C,SAAf;AACA9tD,SAAK8rB,MAAM9rB,CAAN,GAAU8tD,SAAf;AAEA,IAND,MAMO,IAAKb,MAAMe,kBAAX,EAAgC;;AAEtC,QAAIxjC,WAAWiR,MAAM3qC,GAAN,CAAWm8D,KAAX,CAAf;;AAEAziC,aAASsB,KAAT,CAAexsB,IAAf,CAAqB2tD,MAAMnhC,KAA3B,EAAmCxrB,cAAnC,CAAmD2sD,MAAMa,SAAzD;AACAtjC,aAAS/J,SAAT,CAAmBnM,qBAAnB,CAA0C24C,MAAMl6C,WAAhD;AACAu6C,YAAQh5C,qBAAR,CAA+B24C,MAAM/7D,MAAN,CAAa6hB,WAA5C;AACAyX,aAAS/J,SAAT,CAAmBvgB,GAAnB,CAAwBotD,OAAxB;AACA9iC,aAAS/J,SAAT,CAAmBxN,kBAAnB,CAAuC6nC,UAAvC;;AAEAtwB,aAAS2F,MAAT,GAAkB88B,MAAM50B,UAAxB;;AAEA,QAAK40B,MAAM50B,UAAX,EAAwB;;AAEvB,SAAIlI,SAAS88B,MAAM98B,MAAnB;;AAEA3F,cAAS4F,UAAT,GAAsBD,OAAO89B,IAA7B;AACAzjC,cAAS6F,YAAT,GAAwBF,OAAO/b,MAA/B;AACAoW,cAAS8F,aAAT,GAAyBH,OAAO+9B,OAAhC;AAEA;;AAED5Y,UAAM/kB,oBAAN,CAA4Bk9B,iBAA5B,IAAkD3B,SAAlD;AACAxW,UAAM9kB,uBAAN,CAA+Bi9B,iBAA/B,IAAqDR,MAAM98B,MAAN,CAAaxjB,MAAlE;AACA2oC,UAAMoW,WAAN,CAAmB+B,iBAAnB,IAAyCjjC,QAAzC;;AAEAijC;AAEA,IA5BM,MA4BA,IAAKR,MAAMkB,WAAX,EAAyB;;AAE/B,QAAI3jC,WAAWiR,MAAM3qC,GAAN,CAAWm8D,KAAX,CAAf;;AAEAziC,aAASpf,QAAT,CAAkBkJ,qBAAlB,CAAyC24C,MAAMl6C,WAA/C;AACAyX,aAASpf,QAAT,CAAkB/B,YAAlB,CAAgCyxC,UAAhC;;AAEAtwB,aAASsB,KAAT,CAAexsB,IAAf,CAAqBwsB,KAArB,EAA6BxrB,cAA7B,CAA6CwtD,SAA7C;AACAtjC,aAASrH,QAAT,GAAoBA,QAApB;;AAEAqH,aAAS/J,SAAT,CAAmBnM,qBAAnB,CAA0C24C,MAAMl6C,WAAhD;AACAu6C,YAAQh5C,qBAAR,CAA+B24C,MAAM/7D,MAAN,CAAa6hB,WAA5C;AACAyX,aAAS/J,SAAT,CAAmBvgB,GAAnB,CAAwBotD,OAAxB;AACA9iC,aAAS/J,SAAT,CAAmBxN,kBAAnB,CAAuC6nC,UAAvC;;AAEAtwB,aAASkG,OAAT,GAAmBxgC,KAAK8S,GAAL,CAAUiqD,MAAMxrD,KAAhB,CAAnB;AACA+oB,aAASmG,WAAT,GAAuBzgC,KAAK8S,GAAL,CAAUiqD,MAAMxrD,KAAN,IAAgB,IAAIwrD,MAAMmB,QAA1B,CAAV,CAAvB;AACA5jC,aAASoG,KAAT,GAAmBq8B,MAAM9pC,QAAN,KAAmB,CAArB,GAA2B,GAA3B,GAAiC8pC,MAAMr8B,KAAxD;;AAEApG,aAAS2F,MAAT,GAAkB88B,MAAM50B,UAAxB;;AAEA,QAAK40B,MAAM50B,UAAX,EAAwB;;AAEvB,SAAIlI,SAAS88B,MAAM98B,MAAnB;;AAEA3F,cAAS4F,UAAT,GAAsBD,OAAO89B,IAA7B;AACAzjC,cAAS6F,YAAT,GAAwBF,OAAO/b,MAA/B;AACAoW,cAAS8F,aAAT,GAAyBH,OAAO+9B,OAAhC;AAEA;;AAED5Y,UAAMzkB,aAAN,CAAqB88B,UAArB,IAAoC7B,SAApC;AACAxW,UAAMxkB,gBAAN,CAAwB68B,UAAxB,IAAuCV,MAAM98B,MAAN,CAAaxjB,MAApD;AACA2oC,UAAMqW,IAAN,CAAYgC,UAAZ,IAA2BnjC,QAA3B;;AAEAmjC;AAEA,IArCM,MAqCA,IAAKV,MAAMoB,eAAX,EAA6B;;AAEnC,QAAI7jC,WAAWiR,MAAM3qC,GAAN,CAAWm8D,KAAX,CAAf;;AAEA;AACA;;AAEA;AACAziC,aAASsB,KAAT,CAAexsB,IAAf,CAAqBwsB,KAArB,EAA6BxrB,cAA7B,CAA6CwtD,SAA7C;;AAEAtjC,aAASpf,QAAT,CAAkBkJ,qBAAlB,CAAyC24C,MAAMl6C,WAA/C;AACAyX,aAASpf,QAAT,CAAkB/B,YAAlB,CAAgCyxC,UAAhC;;AAEA;AACAyS,aAASjpD,QAAT;AACAuQ,YAAQvV,IAAR,CAAc2tD,MAAMl6C,WAApB;AACA8B,YAAQ5N,WAAR,CAAqB6zC,UAArB;AACAyS,aAASvoD,eAAT,CAA0B6P,OAA1B;;AAEA2V,aAAS0iC,SAAT,CAAmBvuD,GAAnB,CAAwBsuD,MAAMz1C,KAAN,GAAc,GAAtC,EAA2C,GAA3C,EAAgD,GAAhD;AACAgT,aAAS2iC,UAAT,CAAoBxuD,GAApB,CAAyB,GAAzB,EAA8BsuD,MAAMx1C,MAAN,GAAe,GAA7C,EAAkD,GAAlD;;AAEA+S,aAAS0iC,SAAT,CAAmB7jD,YAAnB,CAAiCkkD,QAAjC;AACA/iC,aAAS2iC,UAAT,CAAoB9jD,YAApB,CAAkCkkD,QAAlC;;AAEA;AACA;;AAEAjY,UAAMsW,QAAN,CAAgBgC,cAAhB,IAAmCpjC,QAAnC;;AAEAojC;AAEA,IAhCM,MAgCA,IAAKX,MAAMqB,YAAX,EAA0B;;AAEhC,QAAI9jC,WAAWiR,MAAM3qC,GAAN,CAAWm8D,KAAX,CAAf;;AAEAziC,aAASpf,QAAT,CAAkBkJ,qBAAlB,CAAyC24C,MAAMl6C,WAA/C;AACAyX,aAASpf,QAAT,CAAkB/B,YAAlB,CAAgCyxC,UAAhC;;AAEAtwB,aAASsB,KAAT,CAAexsB,IAAf,CAAqB2tD,MAAMnhC,KAA3B,EAAmCxrB,cAAnC,CAAmD2sD,MAAMa,SAAzD;AACAtjC,aAASrH,QAAT,GAAoB8pC,MAAM9pC,QAA1B;AACAqH,aAASoG,KAAT,GAAmBq8B,MAAM9pC,QAAN,KAAmB,CAArB,GAA2B,GAA3B,GAAiC8pC,MAAMr8B,KAAxD;;AAEApG,aAAS2F,MAAT,GAAkB88B,MAAM50B,UAAxB;;AAEA,QAAK40B,MAAM50B,UAAX,EAAwB;;AAEvB,SAAIlI,SAAS88B,MAAM98B,MAAnB;;AAEA3F,cAAS4F,UAAT,GAAsBD,OAAO89B,IAA7B;AACAzjC,cAAS6F,YAAT,GAAwBF,OAAO/b,MAA/B;AACAoW,cAAS8F,aAAT,GAAyBH,OAAO+9B,OAAhC;AACA1jC,cAASwG,gBAAT,GAA4Bb,OAAOtd,MAAP,CAAcxF,IAA1C;AACAmd,cAASyG,eAAT,GAA2Bd,OAAOtd,MAAP,CAAcvF,GAAzC;AAEA;;AAEDgoC,UAAMpkB,cAAN,CAAsBw8B,WAAtB,IAAsC5B,SAAtC;AACAxW,UAAMnkB,iBAAN,CAAyBu8B,WAAzB,IAAyCT,MAAM98B,MAAN,CAAaxjB,MAAtD;AACA2oC,UAAM15B,KAAN,CAAa8xC,WAAb,IAA6BljC,QAA7B;;AAEAkjC;AAEA,IA/BM,MA+BA,IAAKT,MAAMsB,iBAAX,EAA+B;;AAErC,QAAI/jC,WAAWiR,MAAM3qC,GAAN,CAAWm8D,KAAX,CAAf;;AAEAziC,aAAS/J,SAAT,CAAmBnM,qBAAnB,CAA0C24C,MAAMl6C,WAAhD;AACAyX,aAAS/J,SAAT,CAAmBxN,kBAAnB,CAAuC6nC,UAAvC;AACAtwB,aAAS/J,SAAT,CAAmBjf,SAAnB;;AAEAgpB,aAAS6G,QAAT,CAAkB/xB,IAAlB,CAAwB2tD,MAAMnhC,KAA9B,EAAsCxrB,cAAtC,CAAsDwtD,SAAtD;AACAtjC,aAAS8G,WAAT,CAAqBhyB,IAArB,CAA2B2tD,MAAM37B,WAAjC,EAA+ChxB,cAA/C,CAA+DwtD,SAA/D;;AAEAxY,UAAMuW,IAAN,CAAYgC,UAAZ,IAA2BrjC,QAA3B;;AAEAqjC;AAEA;AAED;;AAEDvY,QAAM+X,OAAN,CAAe,CAAf,IAAqB78C,CAArB;AACA8kC,QAAM+X,OAAN,CAAe,CAAf,IAAqB14C,CAArB;AACA2gC,QAAM+X,OAAN,CAAe,CAAf,IAAqBrtD,CAArB;;AAEAs1C,QAAMoW,WAAN,CAAkBn6D,MAAlB,GAA2Bk8D,iBAA3B;AACAnY,QAAMqW,IAAN,CAAWp6D,MAAX,GAAoBo8D,UAApB;AACArY,QAAMsW,QAAN,CAAer6D,MAAf,GAAwBq8D,cAAxB;AACAtY,QAAM15B,KAAN,CAAYrqB,MAAZ,GAAqBm8D,WAArB;AACApY,QAAMuW,IAAN,CAAWt6D,MAAX,GAAoBs8D,UAApB;;AAEAvY,QAAM5R,IAAN,GAAa4R,MAAMtb,EAAN,GAAW,GAAX,GAAiByzB,iBAAjB,GAAqC,GAArC,GAA2CC,WAA3C,GAAyD,GAAzD,GAA+DC,UAA/D,GAA4E,GAA5E,GAAkFC,cAAlF,GAAmG,GAAnG,GAAyGC,UAAzG,GAAsH,GAAtH,GAA4HhD,QAAQt5D,MAAjJ;AAEA;;AAED,QAAO;AACNi8D,SAAOA,KADD;AAENlY,SAAOA;AAFD,EAAP;AAKA;;AAED;;;;AAIA,SAASkZ,gBAAT,GAA4B;;AAE3B,KAAIz+B,SAAS,IAAIq9B,WAAJ,EAAb;;AAEA,KAAIqB,cAAc,EAAlB;AACA,KAAIC,eAAe,EAAnB;AACA,KAAIC,eAAe,EAAnB;;AAEA,UAAS5U,IAAT,GAAgB;;AAEf0U,cAAYl9D,MAAZ,GAAqB,CAArB;AACAm9D,eAAan9D,MAAb,GAAsB,CAAtB;AACAo9D,eAAap9D,MAAb,GAAsB,CAAtB;AAEA;;AAED,UAASq9D,SAAT,CAAoB3B,KAApB,EAA4B;;AAE3BwB,cAAYt8D,IAAZ,CAAkB86D,KAAlB;AAEA;;AAED,UAAS4B,UAAT,CAAqBC,WAArB,EAAmC;;AAElCJ,eAAav8D,IAAb,CAAmB28D,WAAnB;AAEA;;AAED,UAASC,UAAT,CAAqBD,WAArB,EAAmC;;AAElCH,eAAax8D,IAAb,CAAmB28D,WAAnB;AAEA;;AAED,UAASE,WAAT,CAAsBn8C,MAAtB,EAA+B;;AAE9Bkd,SAAOy9B,KAAP,CAAciB,WAAd,EAA2BC,YAA3B,EAAyC77C,MAAzC;AAEA;;AAED,KAAIyiC,QAAQ;AACXmZ,eAAaA,WADF;AAEXC,gBAAcA,YAFH;AAGXC,gBAAcA,YAHH;;AAKX5+B,UAAQA;AALG,EAAZ;;AAQA,QAAO;AACNgqB,QAAMA,IADA;AAENzE,SAAOA,KAFD;AAGN0Z,eAAaA,WAHP;;AAKNJ,aAAWA,SALL;AAMNC,cAAYA,UANN;AAONE,cAAYA;AAPN,EAAP;AAUA;;AAED,SAASE,iBAAT,GAA6B;;AAE5B,KAAIC,eAAe,EAAnB;;AAEA,UAASp+D,GAAT,CAAcilD,KAAd,EAAqBljC,MAArB,EAA8B;;AAE7B,MAAI6wB,OAAOqS,MAAM/b,EAAN,GAAW,GAAX,GAAiBnnB,OAAOmnB,EAAnC;;AAEA,MAAIm1B,cAAcD,aAAcxrB,IAAd,CAAlB;;AAEA,MAAKyrB,gBAAgBl/D,SAArB,EAAiC;;AAEhCk/D,iBAAc,IAAIX,gBAAJ,EAAd;AACAU,gBAAcxrB,IAAd,IAAuByrB,WAAvB;AAEA;;AAED,SAAOA,WAAP;AAEA;;AAED,UAAS92C,OAAT,GAAmB;;AAElB62C,iBAAe,EAAf;AAEA;;AAED,QAAO;AACNp+D,OAAKA,GADC;AAENunB,WAASA;AAFH,EAAP;AAKA;;AAED;;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAASmxC,iBAAT,CAA4BpuB,UAA5B,EAAyC;;AAExCqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,mBAAZ;;AAEA,MAAK41D,YAAL,GAAoBhsD,iBAApB;;AAEA,MAAKuxC,QAAL,GAAgB,KAAhB;AACA,MAAKxP,YAAL,GAAoB,KAApB;;AAEA,MAAKlQ,GAAL,GAAW,IAAX;;AAEA,MAAKE,QAAL,GAAgB,IAAhB;;AAEA,MAAKwB,eAAL,GAAuB,IAAvB;AACA,MAAKC,iBAAL,GAAyB,CAAzB;AACA,MAAKC,gBAAL,GAAwB,CAAxB;;AAEA,MAAK0d,SAAL,GAAiB,KAAjB;AACA,MAAKC,kBAAL,GAA0B,CAA1B;;AAEA,MAAKpd,GAAL,GAAW,KAAX;AACA,MAAKK,MAAL,GAAc,KAAd;;AAEA,MAAKsc,SAAL,CAAgBjR,UAAhB;AAEA;;AAEDouB,kBAAkB74D,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAA9B;AACA64D,kBAAkB74D,SAAlB,CAA4B0O,WAA5B,GAA0CmqD,iBAA1C;;AAEAA,kBAAkB74D,SAAlB,CAA4By+D,mBAA5B,GAAkD,IAAlD;;AAEA5F,kBAAkB74D,SAAlB,CAA4B2O,IAA5B,GAAmC,UAAW9N,MAAX,EAAoB;;AAEtDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKk2D,YAAL,GAAoBl2D,OAAOk2D,YAA3B;;AAEA,MAAKza,QAAL,GAAgBz7C,OAAOy7C,QAAvB;AACA,MAAKxP,YAAL,GAAoBjsC,OAAOisC,YAA3B;;AAEA,MAAKlQ,GAAL,GAAW/7B,OAAO+7B,GAAlB;;AAEA,MAAKE,QAAL,GAAgBj8B,OAAOi8B,QAAvB;;AAEA,MAAKwB,eAAL,GAAuBz9B,OAAOy9B,eAA9B;AACA,MAAKC,iBAAL,GAAyB19B,OAAO09B,iBAAhC;AACA,MAAKC,gBAAL,GAAwB39B,OAAO29B,gBAA/B;;AAEA,MAAK0d,SAAL,GAAiBr7C,OAAOq7C,SAAxB;AACA,MAAKC,kBAAL,GAA0Bt7C,OAAOs7C,kBAAjC;;AAEA,QAAO,IAAP;AAEA,CAtBD;;AAwBA;;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAS2c,oBAAT,CAA+BruB,UAA/B,EAA4C;;AAE3CqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,sBAAZ;;AAEA,MAAKihC,iBAAL,GAAyB,IAAI9tB,OAAJ,EAAzB;AACA,MAAK+tB,YAAL,GAAoB,CAApB;AACA,MAAKC,WAAL,GAAmB,IAAnB;;AAEA,MAAKga,QAAL,GAAgB,KAAhB;AACA,MAAKxP,YAAL,GAAoB,KAApB;;AAEA,MAAKlQ,GAAL,GAAW,IAAX;;AAEA,MAAKE,QAAL,GAAgB,IAAhB;;AAEA,MAAKwB,eAAL,GAAuB,IAAvB;AACA,MAAKC,iBAAL,GAAyB,CAAzB;AACA,MAAKC,gBAAL,GAAwB,CAAxB;;AAEA,MAAKO,GAAL,GAAW,KAAX;AACA,MAAKK,MAAL,GAAc,KAAd;;AAEA,MAAKsc,SAAL,CAAgBjR,UAAhB;AAEA;;AAEDquB,qBAAqB94D,SAArB,GAAiCC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAAjC;AACA84D,qBAAqB94D,SAArB,CAA+B0O,WAA/B,GAA6CoqD,oBAA7C;;AAEAA,qBAAqB94D,SAArB,CAA+B0+D,sBAA/B,GAAwD,IAAxD;;AAEA5F,qBAAqB94D,SAArB,CAA+B2O,IAA/B,GAAsC,UAAW9N,MAAX,EAAoB;;AAEzDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKuhC,iBAAL,CAAuBzzB,IAAvB,CAA6B9N,OAAOuhC,iBAApC;AACA,MAAKC,YAAL,GAAoBxhC,OAAOwhC,YAA3B;AACA,MAAKC,WAAL,GAAmBzhC,OAAOyhC,WAA1B;;AAEA,MAAKga,QAAL,GAAgBz7C,OAAOy7C,QAAvB;AACA,MAAKxP,YAAL,GAAoBjsC,OAAOisC,YAA3B;;AAEA,MAAKlQ,GAAL,GAAW/7B,OAAO+7B,GAAlB;;AAEA,MAAKE,QAAL,GAAgBj8B,OAAOi8B,QAAvB;;AAEA,MAAKwB,eAAL,GAAuBz9B,OAAOy9B,eAA9B;AACA,MAAKC,iBAAL,GAAyB19B,OAAO09B,iBAAhC;AACA,MAAKC,gBAAL,GAAwB39B,OAAO29B,gBAA/B;;AAEA,QAAO,IAAP;AAEA,CArBD;;AAuBA;;;;;AAKA,SAASmgC,cAAT,CAAyBC,SAAzB,EAAoCC,QAApC,EAA8CjX,cAA9C,EAA+D;;AAE9D,KAAIkX,WAAW,IAAInuC,OAAJ,EAAf;AAAA,KACCouC,oBAAoB,IAAIxsD,OAAJ,EADrB;AAAA,KAGCysD,iBAAiB,IAAIlxD,OAAJ,EAHlB;AAAA,KAICmxD,oBAAoB,IAAInxD,OAAJ,CAAa85C,cAAb,EAA6BA,cAA7B,CAJrB;AAAA,KAMCsX,cAAc,IAAI5qD,OAAJ,EANf;AAAA,KAOC6qD,sBAAsB,IAAI7qD,OAAJ,EAPvB;AAAA,KASC8qD,gBAAgB,CATjB;AAAA,KAUCC,gBAAgB,CAVjB;AAAA,KAYCC,4BAA4B,CAAEF,gBAAgBC,aAAlB,IAAoC,CAZjE;AAAA,KAcCE,kBAAkB,IAAInlC,KAAJ,CAAWklC,yBAAX,CAdnB;AAAA,KAeCE,qBAAqB,IAAIplC,KAAJ,CAAWklC,yBAAX,CAftB;AAAA,KAiBCG,iBAAiB,EAjBlB;;AAmBA,KAAI1kB,aAAa,EAAE,GAAG73C,QAAL,EAAe,GAAGD,SAAlB,EAA6B,GAAGE,UAAhC,EAAjB;;AAEA,KAAIu8D,iBAAiB,CACpB,IAAIprD,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CADoB,EACI,IAAIA,OAAJ,CAAa,CAAE,CAAf,EAAkB,CAAlB,EAAqB,CAArB,CADJ,EAC8B,IAAIA,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAD9B,EAEpB,IAAIA,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAE,CAArB,CAFoB,EAEM,IAAIA,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAFN,EAE8B,IAAIA,OAAJ,CAAa,CAAb,EAAgB,CAAE,CAAlB,EAAqB,CAArB,CAF9B,CAArB;;AAKA,KAAIqrD,UAAU,CACb,IAAIrrD,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CADa,EACW,IAAIA,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CADX,EACmC,IAAIA,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CADnC,EAEb,IAAIA,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAFa,EAEW,IAAIA,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAFX,EAEmC,IAAIA,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAE,CAArB,CAFnC,CAAd;;AAKA,KAAIsrD,kBAAkB,CACrB,IAAI/3C,OAAJ,EADqB,EACN,IAAIA,OAAJ,EADM,EACS,IAAIA,OAAJ,EADT,EAErB,IAAIA,OAAJ,EAFqB,EAEN,IAAIA,OAAJ,EAFM,EAES,IAAIA,OAAJ,EAFT,CAAtB;;AAKA;;AAEA,MAAM,IAAI5lB,IAAI,CAAd,EAAiBA,MAAMq9D,yBAAvB,EAAkD,EAAGr9D,CAArD,EAAyD;;AAExD,MAAI49D,cAAc,CAAE59D,IAAIm9D,aAAN,MAA0B,CAA5C;AACA,MAAIU,cAAc,CAAE79D,IAAIo9D,aAAN,MAA0B,CAA5C;;AAEA,MAAIU,gBAAgB,IAAIlH,iBAAJ,CAAuB;;AAE1C9B,iBAAc/rD,gBAF4B;;AAI1C8hC,iBAAc+yB,WAJ4B;AAK1CvjB,aAAUwjB;;AALgC,GAAvB,CAApB;;AASAP,kBAAiBt9D,CAAjB,IAAuB89D,aAAvB;;AAEA;;AAEA,MAAIC,mBAAmB,IAAIlH,oBAAJ,CAA0B;;AAEhDhsB,iBAAc+yB,WAFkC;AAGhDvjB,aAAUwjB;;AAHsC,GAA1B,CAAvB;;AAOAN,qBAAoBv9D,CAApB,IAA0B+9D,gBAA1B;AAEA;;AAED;;AAEA,KAAI50C,QAAQ,IAAZ;;AAEA,MAAKygB,OAAL,GAAe,KAAf;;AAEA,MAAKo0B,UAAL,GAAkB,IAAlB;AACA,MAAKtpB,WAAL,GAAmB,KAAnB;;AAEA,MAAKx1C,IAAL,GAAY4B,YAAZ;;AAEA,MAAKmiD,MAAL,GAAc,UAAW9lB,MAAX,EAAmBgmB,KAAnB,EAA0BljC,MAA1B,EAAmC;;AAEhD,MAAKkJ,MAAMygB,OAAN,KAAkB,KAAvB,EAA+B;AAC/B,MAAKzgB,MAAM60C,UAAN,KAAqB,KAArB,IAA8B70C,MAAMurB,WAAN,KAAsB,KAAzD,EAAiE;;AAEjE,MAAKvX,OAAOx+B,MAAP,KAAkB,CAAvB,EAA2B;;AAE3B;AACA,MAAIs/D,MAAMtB,UAAU73C,OAApB;AACA,MAAIo5C,SAASvB,UAAUja,KAAvB;;AAEA;AACAwb,SAAOx5B,OAAP,CAAgBu5B,IAAIE,KAApB;AACAD,SAAO78B,OAAP,CAAenI,KAAf,CAAqBoqB,QAArB,CAA+B,CAA/B,EAAkC,CAAlC,EAAqC,CAArC,EAAwC,CAAxC;AACA4a,SAAO78B,OAAP,CAAezB,KAAf,CAAqBw+B,OAArB,CAA8B,IAA9B;AACAF,SAAOG,cAAP,CAAuB,KAAvB;;AAEA;;AAEA,MAAIC,SAAJ;;AAEA,OAAM,IAAIt+D,IAAI,CAAR,EAAWooB,KAAK+U,OAAOx+B,MAA7B,EAAqCqB,IAAIooB,EAAzC,EAA6CpoB,GAA7C,EAAoD;;AAEnD,OAAIq6D,QAAQl9B,OAAQn9B,CAAR,CAAZ;AACA,OAAIu9B,SAAS88B,MAAM98B,MAAnB;AACA,OAAIm+B,eAAerB,SAASA,MAAMqB,YAAlC;;AAEA,OAAKn+B,WAAWlgC,SAAhB,EAA4B;;AAE3ByP,YAAQC,IAAR,CAAc,uBAAd,EAAuCstD,KAAvC,EAA8C,gBAA9C;AACA;AAEA;;AAED,OAAIkE,eAAehhC,OAAOtd,MAA1B;;AAEA88C,kBAAerwD,IAAf,CAAqB6wB,OAAO+9B,OAA5B;AACAyB,kBAAejzD,GAAf,CAAoBkzD,iBAApB;;AAEA,OAAKtB,YAAL,EAAoB;;AAEnB,QAAI8C,UAAUzB,eAAel/D,CAA7B;AACA,QAAI4gE,WAAW1B,eAAetyD,CAA9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACAkzD,oBAAiB,CAAjB,EAAqB5xD,GAArB,CAA0ByyD,UAAU,CAApC,EAAuCC,QAAvC,EAAiDD,OAAjD,EAA0DC,QAA1D;AACA;AACAd,oBAAiB,CAAjB,EAAqB5xD,GAArB,CAA0B,CAA1B,EAA6B0yD,QAA7B,EAAuCD,OAAvC,EAAgDC,QAAhD;AACA;AACAd,oBAAiB,CAAjB,EAAqB5xD,GAArB,CAA0ByyD,UAAU,CAApC,EAAuCC,QAAvC,EAAiDD,OAAjD,EAA0DC,QAA1D;AACA;AACAd,oBAAiB,CAAjB,EAAqB5xD,GAArB,CAA0ByyD,OAA1B,EAAmCC,QAAnC,EAA6CD,OAA7C,EAAsDC,QAAtD;AACA;AACAd,oBAAiB,CAAjB,EAAqB5xD,GAArB,CAA0ByyD,UAAU,CAApC,EAAuC,CAAvC,EAA0CA,OAA1C,EAAmDC,QAAnD;AACA;AACAd,oBAAiB,CAAjB,EAAqB5xD,GAArB,CAA0ByyD,OAA1B,EAAmC,CAAnC,EAAsCA,OAAtC,EAA+CC,QAA/C;;AAEA1B,mBAAel/D,CAAf,IAAoB,GAApB;AACAk/D,mBAAetyD,CAAf,IAAoB,GAApB;AAEA;;AAED,OAAK8yB,OAAO5C,GAAP,KAAe,IAApB,EAA2B;;AAE1B,QAAI+jC,OAAO,EAAE17C,WAAWve,aAAb,EAA4Bse,WAAWte,aAAvC,EAAsDwe,QAAQpd,UAA9D,EAAX;;AAEA03B,WAAO5C,GAAP,GAAa,IAAIvU,iBAAJ,CAAuB22C,eAAel/D,CAAtC,EAAyCk/D,eAAetyD,CAAxD,EAA2Di0D,IAA3D,CAAb;AACAnhC,WAAO5C,GAAP,CAAWlU,OAAX,CAAmBrD,IAAnB,GAA0Bi3C,MAAMj3C,IAAN,GAAa,YAAvC;;AAEAm7C,iBAAah1B,sBAAb;AAEA;;AAED,OAAKhM,OAAOohC,iBAAZ,EAAgC;;AAE/BphC,WAAO/gB,MAAP,CAAe69C,KAAf;AAEA;;AAED,OAAInB,YAAY37B,OAAO5C,GAAvB;AACA,OAAIikC,eAAerhC,OAAOxjB,MAA1B;;AAEAmjD,uBAAoBx7C,qBAApB,CAA2C24C,MAAMl6C,WAAjD;AACAo+C,gBAAa/lD,QAAb,CAAsB9L,IAAtB,CAA4BwwD,mBAA5B;;AAEA,OAAKxB,YAAL,EAAoB;;AAEnB4C,gBAAY,CAAZ;;AAEA;AACA;;AAEAM,iBAAa/mD,eAAb,CAA8B,CAAEqlD,oBAAoBr/D,CAApD,EAAuD,CAAEq/D,oBAAoBzyD,CAA7E,EAAgF,CAAEyyD,oBAAoB/qD,CAAtG;AAEA,IATD,MASO;;AAENmsD,gBAAY,CAAZ;;AAEArB,gBAAYv7C,qBAAZ,CAAmC24C,MAAM/7D,MAAN,CAAa6hB,WAAhD;AACAo+C,iBAAavqD,MAAb,CAAqBipD,WAArB;AACAsB,iBAAa50C,iBAAb;;AAEA;;AAEAi1C,iBAAa7yD,GAAb,CACC,GADD,EACM,GADN,EACW,GADX,EACgB,GADhB,EAEC,GAFD,EAEM,GAFN,EAEW,GAFX,EAEgB,GAFhB,EAGC,GAHD,EAGM,GAHN,EAGW,GAHX,EAGgB,GAHhB,EAIC,GAJD,EAIM,GAJN,EAIW,GAJX,EAIgB,GAJhB;;AAOA6yD,iBAAanxD,QAAb,CAAuB8wD,aAAar+C,gBAApC;AACA0+C,iBAAanxD,QAAb,CAAuB8wD,aAAap1B,kBAApC;AAEA;;AAEDwzB,aAAUkC,eAAV,CAA2B3F,SAA3B;AACAyD,aAAUnZ,KAAV;;AAEA;AACA;;AAEA,QAAM,IAAI7X,OAAO,CAAjB,EAAoBA,OAAO2yB,SAA3B,EAAsC3yB,MAAtC,EAAgD;;AAE/C,QAAK+vB,YAAL,EAAoB;;AAEnBuB,iBAAYvwD,IAAZ,CAAkB6xD,aAAa/lD,QAA/B;AACAykD,iBAAYrwD,GAAZ,CAAiB6wD,eAAgB9xB,IAAhB,CAAjB;AACA4yB,kBAAarqD,EAAb,CAAgBxH,IAAhB,CAAsBgxD,QAAS/xB,IAAT,CAAtB;AACA4yB,kBAAavqD,MAAb,CAAqBipD,WAArB;AACAsB,kBAAa50C,iBAAb;;AAEA,SAAIm1C,eAAenB,gBAAiBhyB,IAAjB,CAAnB;AACAuyB,YAAO13C,QAAP,CAAiBs4C,YAAjB;AAEA;;AAED;;AAEAhC,sBAAkB1oD,gBAAlB,CAAoCmqD,aAAar+C,gBAAjD,EAAmEq+C,aAAap1B,kBAAhF;AACA0zB,aAAS7tC,aAAT,CAAwB8tC,iBAAxB;;AAEA;;AAEAiC,iBAAc5b,KAAd,EAAqBljC,MAArB,EAA6Bs+C,YAA7B,EAA2C7C,YAA3C;AAEA;AAED;;AAEDvyC,QAAMurB,WAAN,GAAoB,KAApB;AAEA,EArKD;;AAuKA,UAASsqB,gBAAT,CAA2Bt2C,MAA3B,EAAmCggB,QAAnC,EAA6CgzB,YAA7C,EAA2DuD,kBAA3D,EAA+E7gC,gBAA/E,EAAiGC,eAAjG,EAAmH;;AAElH,MAAI/U,WAAWZ,OAAOY,QAAtB;;AAEA,MAAI41C,SAAS,IAAb;;AAEA,MAAIC,mBAAmB7B,eAAvB;AACA,MAAI8B,iBAAiB12C,OAAO22C,mBAA5B;;AAEA,MAAK3D,YAAL,EAAoB;;AAEnByD,sBAAmB5B,kBAAnB;AACA6B,oBAAiB12C,OAAO42C,sBAAxB;AAEA;;AAED,MAAK,CAAEF,cAAP,EAAwB;;AAEvB,OAAIxB,cAAc,KAAlB;;AAEA,OAAKl1B,SAASmC,YAAd,EAA6B;;AAE5B,QAAKvhB,YAAYA,SAASG,gBAA1B,EAA6C;;AAE5Cm0C,mBAAct0C,SAAS0qB,eAAT,IAA4B1qB,SAAS0qB,eAAT,CAAyBx7B,QAArD,IAAiE8Q,SAAS0qB,eAAT,CAAyBx7B,QAAzB,CAAkC7Z,MAAlC,GAA2C,CAA1H;AAEA,KAJD,MAIO,IAAK2qB,YAAYA,SAASC,UAA1B,EAAuC;;AAE7Cq0C,mBAAct0C,SAASuhB,YAAT,IAAyBvhB,SAASuhB,YAAT,CAAsBlsC,MAAtB,GAA+B,CAAtE;AAEA;AAED;;AAED,OAAK+pB,OAAO2vC,aAAP,IAAwB3vB,SAAS2R,QAAT,KAAsB,KAAnD,EAA2D;;AAE1DvtC,YAAQC,IAAR,CAAc,8EAAd,EAA8F2b,MAA9F;AAEA;;AAED,OAAIm1C,cAAcn1C,OAAO2vC,aAAP,IAAwB3vB,SAAS2R,QAAnD;;AAEA,OAAIklB,eAAe,CAAnB;;AAEA,OAAK3B,WAAL,EAAmB2B,gBAAgBpC,aAAhB;AACnB,OAAKU,WAAL,EAAmB0B,gBAAgBnC,aAAhB;;AAEnB8B,YAASC,iBAAkBI,YAAlB,CAAT;AAEA,GAjCD,MAiCO;;AAENL,YAASE,cAAT;AAEA;;AAED,MAAKzC,UAAU9V,oBAAV,IACHne,SAASmQ,WAAT,KAAyB,IADtB,IAEHnQ,SAASiQ,cAAT,CAAwBh6C,MAAxB,KAAmC,CAFrC,EAEyC;;AAExC;AACA;;AAEA,OAAI6gE,OAAON,OAAOv1D,IAAlB;AAAA,OAAwB81D,OAAO/2B,SAAS/+B,IAAxC;;AAEA,OAAI+1D,sBAAsBlC,eAAgBgC,IAAhB,CAA1B;;AAEA,OAAKE,wBAAwBriE,SAA7B,EAAyC;;AAExCqiE,0BAAsB,EAAtB;AACAlC,mBAAgBgC,IAAhB,IAAyBE,mBAAzB;AAEA;;AAED,OAAIC,iBAAiBD,oBAAqBD,IAArB,CAArB;;AAEA,OAAKE,mBAAmBtiE,SAAxB,EAAoC;;AAEnCsiE,qBAAiBT,OAAO1yD,KAAP,EAAjB;AACAkzD,wBAAqBD,IAArB,IAA8BE,cAA9B;AAEA;;AAEDT,YAASS,cAAT;AAEA;;AAEDT,SAAO15B,OAAP,GAAiBkD,SAASlD,OAA1B;AACA05B,SAAOjlB,SAAP,GAAmBvR,SAASuR,SAA5B;;AAEAilB,SAAOnnB,IAAP,GAAgBrP,SAASoQ,UAAT,IAAuB,IAAzB,GAAkCpQ,SAASoQ,UAA3C,GAAwDA,WAAYpQ,SAASqP,IAArB,CAAtE;;AAEAmnB,SAAOrmB,WAAP,GAAqBnQ,SAASmQ,WAA9B;AACAqmB,SAAOvmB,cAAP,GAAwBjQ,SAASiQ,cAAjC;AACAumB,SAAOtmB,gBAAP,GAA0BlQ,SAASkQ,gBAAnC;;AAEAsmB,SAAOhlB,kBAAP,GAA4BxR,SAASwR,kBAArC;AACAglB,SAAOnlB,SAAP,GAAmBrR,SAASqR,SAA5B;;AAEA,MAAK2hB,gBAAgBwD,OAAOzC,sBAA5B,EAAqD;;AAEpDyC,UAAO/+B,iBAAP,CAAyBzzB,IAAzB,CAA+BuyD,kBAA/B;AACAC,UAAO9+B,YAAP,GAAsBhC,gBAAtB;AACA8gC,UAAO7+B,WAAP,GAAqBhC,eAArB;AAEA;;AAED,SAAO6gC,MAAP;AAEA;;AAED,UAASH,YAAT,CAAuBr2C,MAAvB,EAA+BzI,MAA/B,EAAuCs+C,YAAvC,EAAqD7C,YAArD,EAAoE;;AAEnE,MAAKhzC,OAAO8c,OAAP,KAAmB,KAAxB,EAAgC;;AAEhC,MAAIA,UAAU9c,OAAOkc,MAAP,CAAcD,IAAd,CAAoB1kB,OAAO2kB,MAA3B,CAAd;;AAEA,MAAKY,YAAa9c,OAAOqmB,MAAP,IAAiBrmB,OAAOksB,MAAxB,IAAkClsB,OAAOisB,QAAtD,CAAL,EAAwE;;AAEvE,OAAKjsB,OAAO+c,UAAP,KAAuB,CAAE/c,OAAOid,aAAT,IAA0Bk3B,SAAS5sC,gBAAT,CAA2BvH,MAA3B,CAAjD,CAAL,EAA8F;;AAE7FA,WAAO2c,eAAP,CAAuBjxB,gBAAvB,CAAyCmqD,aAAap1B,kBAAtD,EAA0EzgB,OAAOvI,WAAjF;;AAEA,QAAImJ,WAAWszC,SAASpgD,MAAT,CAAiBkM,MAAjB,CAAf;AACA,QAAIggB,WAAWhgB,OAAOggB,QAAtB;;AAEA,QAAKvQ,MAAMC,OAAN,CAAesQ,QAAf,CAAL,EAAiC;;AAEhC,SAAIgE,SAASpjB,SAASojB,MAAtB;;AAEA,UAAM,IAAIqE,IAAI,CAAR,EAAWC,KAAKtE,OAAO/tC,MAA7B,EAAqCoyC,IAAIC,EAAzC,EAA6CD,GAA7C,EAAoD;;AAEnD,UAAIpE,QAAQD,OAAQqE,CAAR,CAAZ;AACA,UAAI6uB,gBAAgBl3B,SAAUiE,MAAMtC,aAAhB,CAApB;;AAEA,UAAKu1B,iBAAiBA,cAAcp6B,OAApC,EAA8C;;AAE7C,WAAIs4B,gBAAgBkB,iBAAkBt2C,MAAlB,EAA0Bk3C,aAA1B,EAAyClE,YAAzC,EAAuDwB,mBAAvD,EAA4EqB,aAAa9jD,IAAzF,EAA+F8jD,aAAa7jD,GAA5G,CAApB;AACAiiD,iBAAU9Y,kBAAV,CAA8B0a,YAA9B,EAA4C,IAA5C,EAAkDj1C,QAAlD,EAA4Dw0C,aAA5D,EAA2Ep1C,MAA3E,EAAmFikB,KAAnF;AAEA;AAED;AAED,KAlBD,MAkBO,IAAKjE,SAASlD,OAAd,EAAwB;;AAE9B,SAAIs4B,gBAAgBkB,iBAAkBt2C,MAAlB,EAA0BggB,QAA1B,EAAoCgzB,YAApC,EAAkDwB,mBAAlD,EAAuEqB,aAAa9jD,IAApF,EAA0F8jD,aAAa7jD,GAAvG,CAApB;AACAiiD,eAAU9Y,kBAAV,CAA8B0a,YAA9B,EAA4C,IAA5C,EAAkDj1C,QAAlD,EAA4Dw0C,aAA5D,EAA2Ep1C,MAA3E,EAAmF,IAAnF;AAEA;AAED;AAED;;AAED,MAAIsc,WAAWtc,OAAOsc,QAAtB;;AAEA,OAAM,IAAIhlC,IAAI,CAAR,EAAWC,IAAI+kC,SAASrmC,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnD++D,gBAAc/5B,SAAUhlC,CAAV,CAAd,EAA6BigB,MAA7B,EAAqCs+C,YAArC,EAAmD7C,YAAnD;AAEA;AAED;AAED;;AAED;;;;AAIA,SAASmE,aAAT,CAAwBr7C,MAAxB,EAAgC5B,OAAhC,EAAyCC,KAAzC,EAAgDC,KAAhD,EAAuDC,SAAvD,EAAkEC,SAAlE,EAA6EC,MAA7E,EAAqF/jB,IAArF,EAA2FgkB,UAA3F,EAAwG;;AAEvGR,SAAQ3jB,IAAR,CAAc,IAAd,EAAoBylB,MAApB,EAA4B5B,OAA5B,EAAqCC,KAArC,EAA4CC,KAA5C,EAAmDC,SAAnD,EAA8DC,SAA9D,EAAyEC,MAAzE,EAAiF/jB,IAAjF,EAAuFgkB,UAAvF;;AAEA,MAAKwxB,WAAL,GAAmB,IAAnB;AAEA;;AAEDmrB,cAAc9hE,SAAd,GAA0BC,OAAOgmB,MAAP,CAAetB,QAAQ3kB,SAAvB,CAA1B;AACA8hE,cAAc9hE,SAAd,CAAwB0O,WAAxB,GAAsCozD,aAAtC;AACAA,cAAc9hE,SAAd,CAAwB+hE,eAAxB,GAA0C,IAA1C;;AAEA;;;;;AAKA,SAASC,mBAAT,CAA8Btd,QAA9B,EAAwCrhB,EAAxC,EAA4CshB,KAA5C,EAAmDp+B,QAAnD,EAA6DoyC,YAA7D,EAA4E;;AAE3E,KAAIsJ,YAAJ,EAAkBC,aAAlB;AACA,KAAI3V,OAAJ,EAAa5gC,UAAb,EAAyBkO,QAAzB;;AAEA,KAAInR,OAAJ;;AAEA;;AAEA,KAAIy5C,iBAAiB,IAAI7tD,OAAJ,EAArB;AACA,KAAI8tD,iBAAiB,IAAIrlD,UAAJ,EAArB;AACA,KAAIslD,cAAc,IAAI/tD,OAAJ,EAAlB;;AAEA,UAAS80C,IAAT,GAAgB;;AAEf,MAAI39B,WAAW,IAAI0Y,YAAJ,CAAkB,CAChC,CAAE,GAD8B,EACzB,CAAE,GADuB,EAClB,CADkB,EACf,CADe,EAE9B,GAF8B,EAEzB,CAAE,GAFuB,EAElB,CAFkB,EAEf,CAFe,EAG9B,GAH8B,EAGzB,GAHyB,EAGpB,CAHoB,EAGjB,CAHiB,EAIhC,CAAE,GAJ8B,EAIzB,GAJyB,EAIpB,CAJoB,EAIjB,CAJiB,CAAlB,CAAf;;AAOA,MAAIyI,QAAQ,IAAIvI,WAAJ,CAAiB,CAC5B,CAD4B,EACzB,CADyB,EACtB,CADsB,EAE5B,CAF4B,EAEzB,CAFyB,EAEtB,CAFsB,CAAjB,CAAZ;;AAKA49B,iBAAe5+B,GAAGG,YAAH,EAAf;AACA0+B,kBAAgB7+B,GAAGG,YAAH,EAAhB;;AAEAH,KAAGU,UAAH,CAAeV,GAAG0nB,YAAlB,EAAgCkX,YAAhC;AACA5+B,KAAGW,UAAH,CAAeX,GAAG0nB,YAAlB,EAAgCt/B,QAAhC,EAA0C4X,GAAGQ,WAA7C;;AAEAR,KAAGU,UAAH,CAAeV,GAAGynB,oBAAlB,EAAwCoX,aAAxC;AACA7+B,KAAGW,UAAH,CAAeX,GAAGynB,oBAAlB,EAAwCle,KAAxC,EAA+CvJ,GAAGQ,WAAlD;;AAEA0oB,YAAUuJ,eAAV;;AAEAnqC,eAAa;AACZlR,aAAU4oB,GAAG8wB,iBAAH,CAAsB5H,OAAtB,EAA+B,UAA/B,CADE;AAEZ3kC,OAAIyb,GAAG8wB,iBAAH,CAAsB5H,OAAtB,EAA+B,IAA/B;AAFQ,GAAb;;AAKA1yB,aAAW;AACVyoC,aAAUj/B,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,UAAhC,CADA;AAEVgW,YAASl/B,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,SAAhC,CAFC;;AAIVloC,aAAUgf,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,UAAhC,CAJA;AAKVp6C,WAAQkxB,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,QAAhC,CALE;AAMV9yC,UAAO4pB,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,OAAhC,CANG;;AAQVpxB,UAAOkI,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,OAAhC,CARG;AASV3vB,QAAKyG,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,KAAhC,CATK;AAUV5vB,YAAS0G,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,SAAhC,CAVC;;AAYVjlB,oBAAiBjE,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,iBAAhC,CAZP;AAaVpqC,qBAAkBkhB,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,kBAAhC,CAbR;;AAeViW,YAASn/B,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,SAAhC,CAfC;AAgBVvtB,eAAYqE,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,YAAhC,CAhBF;AAiBVttB,YAASoE,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,SAAhC,CAjBC;AAkBVrtB,WAAQmE,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,QAAhC,CAlBE;AAmBVptB,aAAUkE,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,UAAhC,CAnBA;AAoBVkW,aAAUp/B,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,UAAhC,CApBA;;AAsBVlR,cAAWhY,GAAG6uB,kBAAH,CAAuB3F,OAAvB,EAAgC,WAAhC;AAtBD,GAAX;;AAyBA,MAAI9lC,SAASE,SAASC,eAAT,CAA0B,8BAA1B,EAA0D,QAA1D,CAAb;AACAH,SAAOI,KAAP,GAAe,CAAf;AACAJ,SAAOK,MAAP,GAAgB,CAAhB;;AAEA,MAAIC,UAAUN,OAAOO,UAAP,CAAmB,IAAnB,CAAd;AACAD,UAAQ27C,SAAR,GAAoB,OAApB;AACA37C,UAAQ47C,QAAR,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B;;AAEAj6C,YAAU,IAAIo5C,aAAJ,CAAmBr7C,MAAnB,CAAV;AAEA;;AAED,MAAKy+B,MAAL,GAAc,UAAW0d,OAAX,EAAoBxd,KAApB,EAA2BljC,MAA3B,EAAoC;;AAEjD,MAAK0gD,QAAQhiE,MAAR,KAAmB,CAAxB,EAA4B;;AAE5B;;AAEA,MAAK2rD,YAAYjtD,SAAjB,EAA6B;;AAE5B8pD;AAEA;;AAEDzE,QAAMke,UAAN,CAAkBtW,OAAlB;;AAEA5H,QAAMme,cAAN;AACAne,QAAMoe,eAAN,CAAuBp3C,WAAWlR,QAAlC;AACAkqC,QAAMoe,eAAN,CAAuBp3C,WAAW/D,EAAlC;AACA+8B,QAAMqe,uBAAN;;AAEAre,QAAMhe,OAAN,CAAetD,GAAG4/B,SAAlB;AACAte,QAAMle,MAAN,CAAcpD,GAAG+8B,KAAjB;;AAEA/8B,KAAGU,UAAH,CAAeV,GAAG0nB,YAAlB,EAAgCkX,YAAhC;AACA5+B,KAAG6/B,mBAAH,CAAwBv3C,WAAWlR,QAAnC,EAA6C,CAA7C,EAAgD4oB,GAAGa,KAAnD,EAA0D,KAA1D,EAAiE,IAAI,CAArE,EAAwE,CAAxE;AACAb,KAAG6/B,mBAAH,CAAwBv3C,WAAW/D,EAAnC,EAAuC,CAAvC,EAA0Cyb,GAAGa,KAA7C,EAAoD,KAApD,EAA2D,IAAI,CAA/D,EAAkE,CAAlE;;AAEAb,KAAGU,UAAH,CAAeV,GAAGynB,oBAAlB,EAAwCoX,aAAxC;;AAEA7+B,KAAG6rB,gBAAH,CAAqBr1B,SAAS1X,gBAA9B,EAAgD,KAAhD,EAAuDD,OAAOC,gBAAP,CAAwBnS,QAA/E;;AAEA20C,QAAMwe,aAAN,CAAqB9/B,GAAG+/B,QAAxB;AACA//B,KAAG8qB,SAAH,CAAct0B,SAAS+C,GAAvB,EAA4B,CAA5B;;AAEA,MAAIymC,aAAa,CAAjB;AACA,MAAIC,eAAe,CAAnB;AACA,MAAIvkC,MAAMqmB,MAAMrmB,GAAhB;;AAEA,MAAKA,GAAL,EAAW;;AAEVsE,MAAGmrB,SAAH,CAAc30B,SAASsF,QAAvB,EAAiCJ,IAAI5D,KAAJ,CAAUtb,CAA3C,EAA8Ckf,IAAI5D,KAAJ,CAAUnX,CAAxD,EAA2D+a,IAAI5D,KAAJ,CAAU9rB,CAArE;;AAEA,OAAK0vB,IAAIwkC,KAAT,EAAiB;;AAEhBlgC,OAAG2qB,SAAH,CAAcn0B,SAASoF,OAAvB,EAAgCF,IAAIriB,IAApC;AACA2mB,OAAG2qB,SAAH,CAAcn0B,SAASqF,MAAvB,EAA+BH,IAAIpiB,GAAnC;;AAEA0mB,OAAG8qB,SAAH,CAAct0B,SAAS2oC,OAAvB,EAAgC,CAAhC;AACAa,iBAAa,CAAb;AACAC,mBAAe,CAAf;AAEA,IATD,MASO,IAAKvkC,IAAI67B,SAAT,EAAqB;;AAE3Bv3B,OAAG2qB,SAAH,CAAcn0B,SAASmF,UAAvB,EAAmCD,IAAIykC,OAAvC;;AAEAngC,OAAG8qB,SAAH,CAAct0B,SAAS2oC,OAAvB,EAAgC,CAAhC;AACAa,iBAAa,CAAb;AACAC,mBAAe,CAAf;AAEA;AAED,GAvBD,MAuBO;;AAENjgC,MAAG8qB,SAAH,CAAct0B,SAAS2oC,OAAvB,EAAgC,CAAhC;AACAa,gBAAa,CAAb;AACAC,kBAAe,CAAf;AAEA;;AAGD;;AAEA,OAAM,IAAIrhE,IAAI,CAAR,EAAWC,IAAI0gE,QAAQhiE,MAA7B,EAAqCqB,IAAIC,CAAzC,EAA4CD,GAA5C,EAAmD;;AAElD,OAAIqwB,SAASswC,QAAS3gE,CAAT,CAAb;;AAEAqwB,UAAOgV,eAAP,CAAuBjxB,gBAAvB,CAAyC6L,OAAOkpB,kBAAhD,EAAoE9Y,OAAOlQ,WAA3E;AACAkQ,UAAOle,CAAP,GAAW,CAAEke,OAAOgV,eAAP,CAAuBt3B,QAAvB,CAAiC,EAAjC,CAAb;AAEA;;AAED4yD,UAAQ/wB,IAAR,CAAc8pB,iBAAd;;AAEA;;AAEA,MAAIliD,QAAQ,EAAZ;AACA,MAAItH,SAAS,EAAb;;AAEA,OAAM,IAAIlQ,IAAI,CAAR,EAAWC,IAAI0gE,QAAQhiE,MAA7B,EAAqCqB,IAAIC,CAAzC,EAA4CD,GAA5C,EAAmD;;AAElD,OAAIqwB,SAASswC,QAAS3gE,CAAT,CAAb;AACA,OAAI0oC,WAAWrY,OAAOqY,QAAtB;;AAEA,OAAKA,SAASlD,OAAT,KAAqB,KAA1B,EAAkC;;AAElCnV,UAAO0V,cAAP,CAAuB0c,QAAvB,EAAiCU,KAAjC,EAAwCljC,MAAxC,EAAgD5iB,SAAhD,EAA2DqrC,QAA3D,EAAqErrC,SAArE;;AAEA+jC,MAAG2qB,SAAH,CAAcn0B,SAASwhB,SAAvB,EAAkC1Q,SAAS0Q,SAA3C;AACAhY,MAAG6rB,gBAAH,CAAqBr1B,SAASyN,eAA9B,EAA+C,KAA/C,EAAsDhV,OAAOgV,eAAP,CAAuBt3B,QAA7E;;AAEAsiB,UAAOlQ,WAAP,CAAmBtG,SAAnB,CAA8BqmD,cAA9B,EAA8CC,cAA9C,EAA8DC,WAA9D;;AAEA5oD,SAAO,CAAP,IAAa4oD,YAAYviE,CAAzB;AACA2Z,SAAO,CAAP,IAAa4oD,YAAY31D,CAAzB;;AAEAyF,UAAQ,CAAR,IAAcmgB,OAAOngB,MAAP,CAAcrS,CAAd,GAAkB,GAAhC;AACAqS,UAAQ,CAAR,IAAcmgB,OAAOngB,MAAP,CAAczF,CAAd,GAAkB,GAAhC;;AAEA,OAAI81D,UAAU,CAAd;;AAEA,OAAKpd,MAAMrmB,GAAN,IAAa4L,SAAS5L,GAA3B,EAAiC;;AAEhCyjC,cAAUc,YAAV;AAEA;;AAED,OAAKD,eAAeb,OAApB,EAA8B;;AAE7Bn/B,OAAG8qB,SAAH,CAAct0B,SAAS2oC,OAAvB,EAAgCA,OAAhC;AACAa,iBAAab,OAAb;AAEA;;AAED,OAAK73B,SAAS/N,GAAT,KAAiB,IAAtB,EAA6B;;AAE5ByG,OAAGgrB,SAAH,CAAcx0B,SAASyoC,QAAvB,EAAiC33B,SAAS/N,GAAT,CAAahrB,MAAb,CAAoB9R,CAArD,EAAwD6qC,SAAS/N,GAAT,CAAahrB,MAAb,CAAoBlF,CAA5E;AACA22B,OAAGgrB,SAAH,CAAcx0B,SAAS0oC,OAAvB,EAAgC53B,SAAS/N,GAAT,CAAanX,MAAb,CAAoB3lB,CAApD,EAAuD6qC,SAAS/N,GAAT,CAAanX,MAAb,CAAoB/Y,CAA3E;AAEA,IALD,MAKO;;AAEN22B,OAAGgrB,SAAH,CAAcx0B,SAASyoC,QAAvB,EAAiC,CAAjC,EAAoC,CAApC;AACAj/B,OAAGgrB,SAAH,CAAcx0B,SAAS0oC,OAAvB,EAAgC,CAAhC,EAAmC,CAAnC;AAEA;;AAEDl/B,MAAG2qB,SAAH,CAAcn0B,SAAS8C,OAAvB,EAAgCgO,SAAShO,OAAzC;AACA0G,MAAGmrB,SAAH,CAAc30B,SAASsB,KAAvB,EAA8BwP,SAASxP,KAAT,CAAetb,CAA7C,EAAgD8qB,SAASxP,KAAT,CAAenX,CAA/D,EAAkE2mB,SAASxP,KAAT,CAAe9rB,CAAjF;;AAEAg0B,MAAG2qB,SAAH,CAAcn0B,SAASxV,QAAvB,EAAiCsmB,SAAStmB,QAA1C;AACAgf,MAAGirB,UAAH,CAAez0B,SAAS1nB,MAAxB,EAAgCA,MAAhC;AACAkxB,MAAGirB,UAAH,CAAez0B,SAASpgB,KAAxB,EAA+BA,KAA/B;;AAEAkrC,SAAM8e,WAAN,CAAmB94B,SAASoP,QAA5B,EAAsCpP,SAAS0P,aAA/C,EAA8D1P,SAASwP,QAAvE,EAAiFxP,SAASyP,QAA1F,EAAoGzP,SAAS6P,kBAA7G,EAAiI7P,SAAS2P,aAA1I,EAAyJ3P,SAAS4P,aAAlK,EAAiL5P,SAAS2Q,kBAA1L;AACAqJ,SAAMrhB,OAAN,CAAczB,KAAd,CAAoBw+B,OAApB,CAA6B11B,SAAS+P,SAAtC;AACAiK,SAAMrhB,OAAN,CAAczB,KAAd,CAAoB6hC,OAApB,CAA6B/4B,SAASgQ,UAAtC;AACAgK,SAAMrhB,OAAN,CAAcnI,KAAd,CAAoBuoC,OAApB,CAA6B/4B,SAASqQ,UAAtC;;AAEAz0B,YAAS8oC,YAAT,CAAuB1kB,SAAS/N,GAAT,IAAgBlU,OAAvC,EAAgD,CAAhD;;AAEA2a,MAAG8nB,YAAH,CAAiB9nB,GAAGqoB,SAApB,EAA+B,CAA/B,EAAkCroB,GAAGiB,cAArC,EAAqD,CAArD;;AAEAhS,UAAO2V,aAAP,CAAsByc,QAAtB,EAAgCU,KAAhC,EAAuCljC,MAAvC,EAA+C5iB,SAA/C,EAA0DqrC,QAA1D,EAAoErrC,SAApE;AAEA;;AAED;;AAEAqlD,QAAMle,MAAN,CAAcpD,GAAG4/B,SAAjB;;AAEAte,QAAMsH,KAAN;AAEA,EAhKD;;AAkKA,UAAS6J,aAAT,GAAyB;;AAExB,MAAIvJ,UAAUlpB,GAAGyyB,aAAH,EAAd;;AAEA,MAAI/0B,eAAesC,GAAGsvB,YAAH,CAAiBtvB,GAAG6jB,aAApB,CAAnB;AACA,MAAIlmB,iBAAiBqC,GAAGsvB,YAAH,CAAiBtvB,GAAG+jB,eAApB,CAArB;;AAEA/jB,KAAGuvB,YAAH,CAAiB7xB,YAAjB,EAA+B,CAE9B,eAAe43B,aAAarnB,SAA5B,GAAwC,SAFV,EAI9B,yBAAyB,gBAJK,EAM9B,+BAN8B,EAO9B,gCAP8B,EAQ9B,yBAR8B,EAS9B,sBAT8B,EAU9B,qBAV8B,EAW9B,wBAX8B,EAY9B,uBAZ8B,EAc9B,0BAd8B,EAe9B,oBAf8B,EAiB9B,mBAjB8B,EAkB9B,yBAlB8B,EAoB9B,eApB8B,EAsB9B,iCAtB8B,EAwB9B,wDAxB8B,EA0B9B,wBA1B8B,EA2B9B,iGA3B8B,EA4B9B,iGA5B8B,EA8B9B,mBA9B8B,EAgC9B,6DAhC8B,EAiC9B,oCAjC8B,EAmC9B,+CAnC8B,EAqC9B,6BArC8B,EAuC9B,GAvC8B,EAyC7BkhB,IAzC6B,CAyCvB,IAzCuB,CAA/B;;AA2CAnvB,KAAGuvB,YAAH,CAAiB5xB,cAAjB,EAAiC,CAEhC,eAAe23B,aAAarnB,SAA5B,GAAwC,SAFR,EAIhC,yBAAyB,gBAJO,EAMhC,qBANgC,EAOhC,wBAPgC,EAQhC,wBARgC,EAUhC,sBAVgC,EAWhC,wBAXgC,EAYhC,2BAZgC,EAahC,wBAbgC,EAchC,uBAdgC,EAehC,0BAfgC,EAiBhC,mBAjBgC,EAkBhC,yBAlBgC,EAoBhC,eApBgC,EAsBhC,wCAtBgC,EAwBhC,mEAxBgC,EA0BhC,6CA1BgC,EA4BhC,uBA5BgC,EA8BhC,0BA9BgC,EAgChC,yBAhCgC,EAkChC,yDAlCgC,EAoChC,YApCgC,EAsChC,iCAtCgC,EAuChC,gFAvCgC,EAwChC,oDAxCgC,EA0ChC,KA1CgC,EA4ChC,oEA5CgC,EA8ChC,IA9CgC,EAgDhC,GAhDgC,EAkD/BkhB,IAlD+B,CAkDzB,IAlDyB,CAAjC;;AAoDAnvB,KAAGwvB,aAAH,CAAkB9xB,YAAlB;AACAsC,KAAGwvB,aAAH,CAAkB7xB,cAAlB;;AAEAqC,KAAG+zB,YAAH,CAAiB7K,OAAjB,EAA0BxrB,YAA1B;AACAsC,KAAG+zB,YAAH,CAAiB7K,OAAjB,EAA0BvrB,cAA1B;;AAEAqC,KAAGi0B,WAAH,CAAgB/K,OAAhB;;AAEA,SAAOA,OAAP;AAEA;;AAED,UAASoP,iBAAT,CAA4BvsD,CAA5B,EAA+BC,CAA/B,EAAmC;;AAElC,MAAKD,EAAEy4B,WAAF,KAAkBx4B,EAAEw4B,WAAzB,EAAuC;;AAEtC,UAAOz4B,EAAEy4B,WAAF,GAAgBx4B,EAAEw4B,WAAzB;AAEA,GAJD,MAIO,IAAKz4B,EAAEgF,CAAF,KAAQ/E,EAAE+E,CAAf,EAAmB;;AAEzB,UAAO/E,EAAE+E,CAAF,GAAMhF,EAAEgF,CAAf;AAEA,GAJM,MAIA;;AAEN,UAAO/E,EAAEg6B,EAAF,GAAOj6B,EAAEi6B,EAAhB;AAEA;AAED;AAED;;AAED;;;;AAIA,SAASs6B,UAAT,CAAqBtgC,EAArB,EAAyB0Z,UAAzB,EAAqC6mB,KAArC,EAA6C;;AAE5C,UAASC,WAAT,GAAuB;;AAEtB,MAAIC,SAAS,KAAb;;AAEA,MAAI3oC,QAAQ,IAAItT,OAAJ,EAAZ;AACA,MAAIk8C,mBAAmB,IAAvB;AACA,MAAIC,oBAAoB,IAAIn8C,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB,CAAtB,CAAxB;;AAEA,SAAO;;AAEN67C,YAAS,UAAWO,SAAX,EAAuB;;AAE/B,QAAKF,qBAAqBE,SAArB,IAAkC,CAAEH,MAAzC,EAAkD;;AAEjDzgC,QAAG4gC,SAAH,CAAcA,SAAd,EAAyBA,SAAzB,EAAoCA,SAApC,EAA+CA,SAA/C;AACAF,wBAAmBE,SAAnB;AAEA;AAED,IAXK;;AAaNC,cAAW,UAAWC,IAAX,EAAkB;;AAE5BL,aAASK,IAAT;AAEA,IAjBK;;AAmBN5e,aAAU,UAAW1lC,CAAX,EAAcmE,CAAd,EAAiB3U,CAAjB,EAAoBD,CAApB,EAAuBksC,kBAAvB,EAA4C;;AAErD,QAAKA,uBAAuB,IAA5B,EAAmC;;AAElCz7B,UAAKzQ,CAAL,CAAQ4U,KAAK5U,CAAL,CAAQC,KAAKD,CAAL;AAEhB;;AAED+rB,UAAMntB,GAAN,CAAW6R,CAAX,EAAcmE,CAAd,EAAiB3U,CAAjB,EAAoBD,CAApB;;AAEA,QAAK40D,kBAAkBtyD,MAAlB,CAA0BypB,KAA1B,MAAsC,KAA3C,EAAmD;;AAElDkI,QAAGwhB,UAAH,CAAehlC,CAAf,EAAkBmE,CAAlB,EAAqB3U,CAArB,EAAwBD,CAAxB;AACA40D,uBAAkBr1D,IAAlB,CAAwBwsB,KAAxB;AAEA;AAED,IApCK;;AAsCN8wB,UAAO,YAAY;;AAElB6X,aAAS,KAAT;;AAEAC,uBAAmB,IAAnB;AACAC,sBAAkBh2D,GAAlB,CAAuB,CAAE,CAAzB,EAA4B,CAA5B,EAA+B,CAA/B,EAAkC,CAAlC,EALkB,CAKqB;AAEvC;;AA7CK,GAAP;AAiDA;;AAED,UAASo2D,WAAT,GAAuB;;AAEtB,MAAIN,SAAS,KAAb;;AAEA,MAAIO,mBAAmB,IAAvB;AACA,MAAIC,mBAAmB,IAAvB;AACA,MAAIC,oBAAoB,IAAxB;;AAEA,SAAO;;AAENlE,YAAS,UAAW3lB,SAAX,EAAuB;;AAE/B,QAAKA,SAAL,EAAiB;;AAEhBjU,YAAQpD,GAAGmhC,UAAX;AAEA,KAJD,MAIO;;AAEN79B,aAAStD,GAAGmhC,UAAZ;AAEA;AAED,IAdK;;AAgBNd,YAAS,UAAWe,SAAX,EAAuB;;AAE/B,QAAKJ,qBAAqBI,SAArB,IAAkC,CAAEX,MAAzC,EAAkD;;AAEjDzgC,QAAGohC,SAAH,CAAcA,SAAd;AACAJ,wBAAmBI,SAAnB;AAEA;AAED,IAzBK;;AA2BNC,YAAS,UAAWjqB,SAAX,EAAuB;;AAE/B,QAAK6pB,qBAAqB7pB,SAA1B,EAAsC;;AAErC,SAAKA,SAAL,EAAiB;;AAEhB,cAASA,SAAT;;AAEC,YAAK11C,UAAL;;AAECs+B,WAAGoX,SAAH,CAAcpX,GAAGshC,KAAjB;AACA;;AAED,YAAK3/D,WAAL;;AAECq+B,WAAGoX,SAAH,CAAcpX,GAAGuhC,MAAjB;AACA;;AAED,YAAK3/D,SAAL;;AAECo+B,WAAGoX,SAAH,CAAcpX,GAAGwhC,IAAjB;AACA;;AAED,YAAK3/D,cAAL;;AAECm+B,WAAGoX,SAAH,CAAcpX,GAAGyhC,MAAjB;AACA;;AAED,YAAK3/D,UAAL;;AAECk+B,WAAGoX,SAAH,CAAcpX,GAAG0hC,KAAjB;AACA;;AAED,YAAK3/D,iBAAL;;AAECi+B,WAAGoX,SAAH,CAAcpX,GAAG2hC,MAAjB;AACA;;AAED,YAAK3/D,YAAL;;AAECg+B,WAAGoX,SAAH,CAAcpX,GAAG4hC,OAAjB;AACA;;AAED,YAAK3/D,aAAL;;AAEC+9B,WAAGoX,SAAH,CAAcpX,GAAG6hC,QAAjB;AACA;;AAED;;AAEC7hC,WAAGoX,SAAH,CAAcpX,GAAGyhC,MAAjB;;AA5CF;AAgDA,MAlDD,MAkDO;;AAENzhC,SAAGoX,SAAH,CAAcpX,GAAGyhC,MAAjB;AAEA;;AAEDR,wBAAmB7pB,SAAnB;AAEA;AAED,IA3FK;;AA6FNypB,cAAW,UAAWC,IAAX,EAAkB;;AAE5BL,aAASK,IAAT;AAEA,IAjGK;;AAmGN5e,aAAU,UAAW1jB,KAAX,EAAmB;;AAE5B,QAAK0iC,sBAAsB1iC,KAA3B,EAAmC;;AAElCwB,QAAG8hC,UAAH,CAAetjC,KAAf;AACA0iC,yBAAoB1iC,KAApB;AAEA;AAED,IA5GK;;AA8GNoqB,UAAO,YAAY;;AAElB6X,aAAS,KAAT;;AAEAO,uBAAmB,IAAnB;AACAC,uBAAmB,IAAnB;AACAC,wBAAoB,IAApB;AAEA;;AAtHK,GAAP;AA0HA;;AAED,UAASa,aAAT,GAAyB;;AAExB,MAAItB,SAAS,KAAb;;AAEA,MAAIuB,qBAAqB,IAAzB;AACA,MAAIC,qBAAqB,IAAzB;AACA,MAAIC,oBAAoB,IAAxB;AACA,MAAIC,yBAAyB,IAA7B;AACA,MAAIC,qBAAqB,IAAzB;AACA,MAAIC,sBAAsB,IAA1B;AACA,MAAIC,sBAAsB,IAA1B;AACA,MAAIC,sBAAsB,IAA1B;;AAEA,SAAO;;AAENvF,YAAS,UAAWwF,WAAX,EAAyB;;AAEjC,QAAKA,WAAL,EAAmB;;AAElBp/B,YAAQpD,GAAGyiC,YAAX;AAEA,KAJD,MAIO;;AAENn/B,aAAStD,GAAGyiC,YAAZ;AAEA;AAED,IAdK;;AAgBNpC,YAAS,UAAWqC,WAAX,EAAyB;;AAEjC,QAAKV,uBAAuBU,WAAvB,IAAsC,CAAEjC,MAA7C,EAAsD;;AAErDzgC,QAAG0iC,WAAH,CAAgBA,WAAhB;AACAV,0BAAqBU,WAArB;AAEA;AAED,IAzBK;;AA2BNrB,YAAS,UAAWsB,WAAX,EAAwBC,UAAxB,EAAoCF,WAApC,EAAkD;;AAE1D,QAAKT,uBAAuBU,WAAvB,IACAT,sBAAuBU,UADvB,IAEAT,2BAA2BO,WAFhC,EAE8C;;AAE7C1iC,QAAG2iC,WAAH,CAAgBA,WAAhB,EAA6BC,UAA7B,EAAyCF,WAAzC;;AAEAT,0BAAqBU,WAArB;AACAT,yBAAoBU,UAApB;AACAT,8BAAyBO,WAAzB;AAEA;AAED,IAzCK;;AA2CNG,UAAO,UAAWC,WAAX,EAAwBC,YAAxB,EAAsCC,YAAtC,EAAqD;;AAE3D,QAAKZ,uBAAwBU,WAAxB,IACAT,wBAAwBU,YADxB,IAEAT,wBAAwBU,YAF7B,EAE4C;;AAE3ChjC,QAAGijC,SAAH,CAAcH,WAAd,EAA2BC,YAA3B,EAAyCC,YAAzC;;AAEAZ,0BAAqBU,WAArB;AACAT,2BAAsBU,YAAtB;AACAT,2BAAsBU,YAAtB;AAEA;AAED,IAzDK;;AA2DNnC,cAAW,UAAWC,IAAX,EAAkB;;AAE5BL,aAASK,IAAT;AAEA,IA/DK;;AAiEN5e,aAAU,UAAWghB,OAAX,EAAqB;;AAE9B,QAAKX,wBAAwBW,OAA7B,EAAuC;;AAEtCljC,QAAGmjC,YAAH,CAAiBD,OAAjB;AACAX,2BAAsBW,OAAtB;AAEA;AAED,IA1EK;;AA4ENta,UAAO,YAAY;;AAElB6X,aAAS,KAAT;;AAEAuB,yBAAqB,IAArB;AACAC,yBAAqB,IAArB;AACAC,wBAAoB,IAApB;AACAC,6BAAyB,IAAzB;AACAC,yBAAqB,IAArB;AACAC,0BAAsB,IAAtB;AACAC,0BAAsB,IAAtB;AACAC,0BAAsB,IAAtB;AAEA;;AAzFK,GAAP;AA6FA;;AAED;;AAEA,KAAIa,cAAc,IAAI5C,WAAJ,EAAlB;AACA,KAAIl7C,cAAc,IAAIy7C,WAAJ,EAAlB;AACA,KAAIx7C,gBAAgB,IAAIw8C,aAAJ,EAApB;;AAEA,KAAIsB,sBAAsBrjC,GAAGtX,YAAH,CAAiBsX,GAAG4kB,kBAApB,CAA1B;AACA,KAAI0e,gBAAgB,IAAI5hC,UAAJ,CAAgB2hC,mBAAhB,CAApB;AACA,KAAIE,oBAAoB,IAAI7hC,UAAJ,CAAgB2hC,mBAAhB,CAAxB;AACA,KAAIG,oBAAoB,IAAI9hC,UAAJ,CAAgB2hC,mBAAhB,CAAxB;;AAEA,KAAI/N,eAAe,EAAnB;;AAEA,KAAImO,2BAA2B,IAA/B;;AAEA,KAAIC,iBAAiB,IAArB;;AAEA,KAAIC,kBAAkB,IAAtB;AACA,KAAIC,uBAAuB,IAA3B;AACA,KAAIC,kBAAkB,IAAtB;AACA,KAAIC,kBAAkB,IAAtB;AACA,KAAIC,4BAA4B,IAAhC;AACA,KAAIC,uBAAuB,IAA3B;AACA,KAAIC,uBAAuB,IAA3B;AACA,KAAIC,2BAA2B,KAA/B;;AAEA,KAAIC,mBAAmB,IAAvB;AACA,KAAIC,kBAAkB,IAAtB;;AAEA,KAAIC,mBAAmB,IAAvB;;AAEA,KAAIC,6BAA6B,IAAjC;AACA,KAAIC,4BAA4B,IAAhC;;AAEA,KAAIpgB,cAAcnkB,GAAGtX,YAAH,CAAiBsX,GAAGwkC,gCAApB,CAAlB;;AAEA,KAAIC,qBAAqB,KAAzB;AACA,KAAI/hD,UAAU,CAAd;AACA,KAAIgiD,YAAY1kC,GAAGtX,YAAH,CAAiBsX,GAAG2kC,OAApB,CAAhB;;AAEA,KAAKD,UAAUxmE,OAAV,CAAmB,OAAnB,MAAiC,CAAE,CAAxC,EAA4C;;AAE3CwkB,YAAUkV,WAAY,kBAAkBC,IAAlB,CAAwB6sC,SAAxB,EAAqC,CAArC,CAAZ,CAAV;AACAD,uBAAuB/hD,WAAW,GAAlC;AAEA,EALD,MAKO,IAAKgiD,UAAUxmE,OAAV,CAAmB,WAAnB,MAAqC,CAAE,CAA5C,EAAgD;;AAEtDwkB,YAAUkV,WAAY,uBAAuBC,IAAvB,CAA6B6sC,SAA7B,EAA0C,CAA1C,CAAZ,CAAV;AACAD,uBAAuB/hD,WAAW,GAAlC;AAEA;;AAED,KAAIkiD,qBAAqB,IAAzB;AACA,KAAIC,uBAAuB,EAA3B;;AAEA,KAAIC,iBAAiB,IAAItgD,OAAJ,EAArB;AACA,KAAIugD,kBAAkB,IAAIvgD,OAAJ,EAAtB;;AAEA,UAASwgD,aAAT,CAAwBlnE,IAAxB,EAA8BZ,MAA9B,EAAsCiY,KAAtC,EAA8C;;AAE7C,MAAI6Q,OAAO,IAAI0b,UAAJ,CAAgB,CAAhB,CAAX,CAF6C,CAEb;AAChC,MAAIrc,UAAU2a,GAAGglC,aAAH,EAAd;;AAEAhlC,KAAGilC,WAAH,CAAgBnnE,IAAhB,EAAsBunB,OAAtB;AACA2a,KAAGklC,aAAH,CAAkBpnE,IAAlB,EAAwBkiC,GAAGmlC,kBAA3B,EAA+CnlC,GAAGolC,OAAlD;AACAplC,KAAGklC,aAAH,CAAkBpnE,IAAlB,EAAwBkiC,GAAGqlC,kBAA3B,EAA+CrlC,GAAGolC,OAAlD;;AAEA,OAAM,IAAIxmE,IAAI,CAAd,EAAiBA,IAAIuW,KAArB,EAA4BvW,GAA5B,EAAmC;;AAElCohC,MAAGslC,UAAH,CAAepoE,SAAS0B,CAAxB,EAA2B,CAA3B,EAA8BohC,GAAGulC,IAAjC,EAAuC,CAAvC,EAA0C,CAA1C,EAA6C,CAA7C,EAAgDvlC,GAAGulC,IAAnD,EAAyDvlC,GAAG2B,aAA5D,EAA2E3b,IAA3E;AAEA;;AAED,SAAOX,OAAP;AAEA;;AAED,KAAImgD,gBAAgB,EAApB;AACAA,eAAexlC,GAAGylC,UAAlB,IAAiCT,cAAehlC,GAAGylC,UAAlB,EAA8BzlC,GAAGylC,UAAjC,EAA6C,CAA7C,CAAjC;AACAD,eAAexlC,GAAG0lC,gBAAlB,IAAuCV,cAAehlC,GAAG0lC,gBAAlB,EAAoC1lC,GAAG2lC,2BAAvC,EAAoE,CAApE,CAAvC;;AAEA;;AAEAvC,aAAYlhB,QAAZ,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B,CAA5B,EAA+B,CAA/B;AACA58B,aAAY48B,QAAZ,CAAsB,CAAtB;AACA38B,eAAc28B,QAAd,CAAwB,CAAxB;;AAEA9e,QAAQpD,GAAGmhC,UAAX;AACA77C,aAAY+7C,OAAZ,CAAqBx/D,cAArB;;AAEA+jE,cAAc,KAAd;AACAC,aAAazmE,YAAb;AACAgkC,QAAQpD,GAAG4/B,SAAX;;AAEAx8B,QAAQpD,GAAG+8B,KAAX;AACAqD,aAAa//D,cAAb;;AAEA;;AAEA,UAASo/D,cAAT,GAA0B;;AAEzB,OAAM,IAAI7gE,IAAI,CAAR,EAAWC,IAAIykE,cAAc/lE,MAAnC,EAA2CqB,IAAIC,CAA/C,EAAkDD,GAAlD,EAAyD;;AAExD0kE,iBAAe1kE,CAAf,IAAqB,CAArB;AAEA;AAED;;AAED,UAAS8gE,eAAT,CAA0BhxD,SAA1B,EAAsC;;AAErCo3D,4BAA2Bp3D,SAA3B,EAAsC,CAAtC;AAEA;;AAED,UAASo3D,yBAAT,CAAoCp3D,SAApC,EAA+Cq3D,gBAA/C,EAAkE;;AAEjEzC,gBAAe50D,SAAf,IAA6B,CAA7B;;AAEA,MAAK60D,kBAAmB70D,SAAnB,MAAmC,CAAxC,EAA4C;;AAE3CsxB,MAAGgmC,uBAAH,CAA4Bt3D,SAA5B;AACA60D,qBAAmB70D,SAAnB,IAAiC,CAAjC;AAEA;;AAED,MAAK80D,kBAAmB90D,SAAnB,MAAmCq3D,gBAAxC,EAA2D;;AAE1D,OAAI3iB,YAAY1J,WAAW58C,GAAX,CAAgB,wBAAhB,CAAhB;;AAEAsmD,aAAU6iB,wBAAV,CAAoCv3D,SAApC,EAA+Cq3D,gBAA/C;AACAvC,qBAAmB90D,SAAnB,IAAiCq3D,gBAAjC;AAEA;AAED;;AAED,UAASpG,uBAAT,GAAmC;;AAElC,OAAM,IAAI/gE,IAAI,CAAR,EAAWC,IAAI0kE,kBAAkBhmE,MAAvC,EAA+CqB,MAAMC,CAArD,EAAwD,EAAGD,CAA3D,EAA+D;;AAE9D,OAAK2kE,kBAAmB3kE,CAAnB,MAA2B0kE,cAAe1kE,CAAf,CAAhC,EAAqD;;AAEpDohC,OAAGkmC,wBAAH,CAA6BtnE,CAA7B;AACA2kE,sBAAmB3kE,CAAnB,IAAyB,CAAzB;AAEA;AAED;AAED;;AAED,UAASwkC,MAAT,CAAiB4C,EAAjB,EAAsB;;AAErB,MAAKsvB,aAActvB,EAAd,MAAuB,IAA5B,EAAmC;;AAElChG,MAAGoD,MAAH,CAAW4C,EAAX;AACAsvB,gBAActvB,EAAd,IAAqB,IAArB;AAEA;AAED;;AAED,UAAS1C,OAAT,CAAkB0C,EAAlB,EAAuB;;AAEtB,MAAKsvB,aAActvB,EAAd,MAAuB,KAA5B,EAAoC;;AAEnChG,MAAGsD,OAAH,CAAY0C,EAAZ;AACAsvB,gBAActvB,EAAd,IAAqB,KAArB;AAEA;AAED;;AAED,UAASmgC,2BAAT,GAAuC;;AAEtC,MAAK1C,6BAA6B,IAAlC,EAAyC;;AAExCA,8BAA2B,EAA3B;;AAEA,OAAK/pB,WAAW58C,GAAX,CAAgB,gCAAhB,KACA48C,WAAW58C,GAAX,CAAgB,+BAAhB,CADA,IAEA48C,WAAW58C,GAAX,CAAgB,+BAAhB,CAFA,IAGA48C,WAAW58C,GAAX,CAAgB,+BAAhB,CAHL,EAGyD;;AAExD,QAAIspE,UAAUpmC,GAAGtX,YAAH,CAAiBsX,GAAGqmC,0BAApB,CAAd;;AAEA,SAAM,IAAIznE,IAAI,CAAd,EAAiBA,IAAIwnE,QAAQ7oE,MAA7B,EAAqCqB,GAArC,EAA4C;;AAE3C6kE,8BAAyBtlE,IAAzB,CAA+BioE,QAASxnE,CAAT,CAA/B;AAEA;AAED;AAED;;AAED,SAAO6kE,wBAAP;AAEA;;AAED,UAASjE,UAAT,CAAqBtW,OAArB,EAA+B;;AAE9B,MAAKwa,mBAAmBxa,OAAxB,EAAkC;;AAEjClpB,MAAGw/B,UAAH,CAAetW,OAAf;;AAEAwa,oBAAiBxa,OAAjB;;AAEA,UAAO,IAAP;AAEA;;AAED,SAAO,KAAP;AAEA;;AAED,UAASkX,WAAT,CAAsB1pB,QAAtB,EAAgCM,aAAhC,EAA+CF,QAA/C,EAAyDC,QAAzD,EAAmEI,kBAAnE,EAAuFF,aAAvF,EAAsGC,aAAtG,EAAqHe,kBAArH,EAA0I;;AAEzI,MAAKvB,aAAat2C,UAAlB,EAA+B;;AAE9BgjC,UAAQpD,GAAG+8B,KAAX;AAEA,GAJD,MAIO;;AAENz5B,WAAStD,GAAG+8B,KAAZ;AAEA;;AAED,MAAKrmB,aAAaj2C,cAAlB,EAAmC;;AAElC,OAAKi2C,aAAaitB,eAAb,IAAgC1rB,uBAAuBisB,wBAA5D,EAAuF;;AAEtF,YAASxtB,QAAT;;AAEC,UAAKp2C,gBAAL;;AAEC,UAAK23C,kBAAL,EAA0B;;AAEzBjY,UAAGsmC,qBAAH,CAA0BtmC,GAAGumC,QAA7B,EAAuCvmC,GAAGumC,QAA1C;AACAvmC,UAAGwmC,iBAAH,CAAsBxmC,GAAGymC,GAAzB,EAA8BzmC,GAAGymC,GAAjC,EAAsCzmC,GAAGymC,GAAzC,EAA8CzmC,GAAGymC,GAAjD;AAEA,OALD,MAKO;;AAENzmC,UAAGgX,aAAH,CAAkBhX,GAAGumC,QAArB;AACAvmC,UAAG0mC,SAAH,CAAc1mC,GAAG2mC,SAAjB,EAA4B3mC,GAAGymC,GAA/B;AAEA;AACD;;AAED,UAAKlmE,mBAAL;;AAEC,UAAK03C,kBAAL,EAA0B;;AAEzBjY,UAAGsmC,qBAAH,CAA0BtmC,GAAGumC,QAA7B,EAAuCvmC,GAAGumC,QAA1C;AACAvmC,UAAGwmC,iBAAH,CAAsBxmC,GAAG4mC,IAAzB,EAA+B5mC,GAAG4mC,IAAlC,EAAwC5mC,GAAG6mC,mBAA3C,EAAgE7mC,GAAG8mC,mBAAnE;AAEA,OALD,MAKO;;AAEN9mC,UAAGgX,aAAH,CAAkBhX,GAAGumC,QAArB;AACAvmC,UAAG0mC,SAAH,CAAc1mC,GAAG4mC,IAAjB,EAAuB5mC,GAAG6mC,mBAA1B;AAEA;AACD;;AAED,UAAKrmE,gBAAL;;AAEC,UAAKy3C,kBAAL,EAA0B;;AAEzBjY,UAAGsmC,qBAAH,CAA0BtmC,GAAGumC,QAA7B,EAAuCvmC,GAAGumC,QAA1C;AACAvmC,UAAGwmC,iBAAH,CAAsBxmC,GAAG4mC,IAAzB,EAA+B5mC,GAAG+mC,SAAlC,EAA6C/mC,GAAG4mC,IAAhD,EAAsD5mC,GAAG2mC,SAAzD;AAEA,OALD,MAKO;;AAEN3mC,UAAGgX,aAAH,CAAkBhX,GAAGumC,QAArB;AACAvmC,UAAG0mC,SAAH,CAAc1mC,GAAG4mC,IAAjB,EAAuB5mC,GAAG+mC,SAA1B;AAEA;AACD;;AAED;;AAEC,UAAK9uB,kBAAL,EAA0B;;AAEzBjY,UAAGsmC,qBAAH,CAA0BtmC,GAAGumC,QAA7B,EAAuCvmC,GAAGumC,QAA1C;AACAvmC,UAAGwmC,iBAAH,CAAsBxmC,GAAGymC,GAAzB,EAA8BzmC,GAAG8mC,mBAAjC,EAAsD9mC,GAAGymC,GAAzD,EAA8DzmC,GAAG8mC,mBAAjE;AAEA,OALD,MAKO;;AAEN9mC,UAAGsmC,qBAAH,CAA0BtmC,GAAGumC,QAA7B,EAAuCvmC,GAAGumC,QAA1C;AACAvmC,UAAGwmC,iBAAH,CAAsBxmC,GAAG2mC,SAAzB,EAAoC3mC,GAAG8mC,mBAAvC,EAA4D9mC,GAAGymC,GAA/D,EAAoEzmC,GAAG8mC,mBAAvE;AAEA;;AA3DH;AA+DA;;AAEDlD,0BAAuB,IAAvB;AACAC,qBAAkB,IAAlB;AACAC,qBAAkB,IAAlB;AACAC,+BAA4B,IAA5B;AACAC,0BAAuB,IAAvB;AACAC,0BAAuB,IAAvB;AAEA,GA5ED,MA4EO;;AAEN9sB,wBAAqBA,sBAAsBH,aAA3C;AACAC,mBAAgBA,iBAAiBH,QAAjC;AACAI,mBAAgBA,iBAAiBH,QAAjC;;AAEA,OAAKC,kBAAkB4sB,oBAAlB,IAA0CzsB,uBAAuB4sB,yBAAtE,EAAkG;;AAEjG/jC,OAAGsmC,qBAAH,CAA0B/F,MAAMyG,OAAN,CAAehwB,aAAf,CAA1B,EAA0DupB,MAAMyG,OAAN,CAAe7vB,kBAAf,CAA1D;;AAEAysB,2BAAuB5sB,aAAvB;AACA+sB,gCAA4B5sB,kBAA5B;AAEA;;AAED,OAAKL,aAAa+sB,eAAb,IAAgC9sB,aAAa+sB,eAA7C,IAAgE7sB,kBAAkB+sB,oBAAlF,IAA0G9sB,kBAAkB+sB,oBAAjI,EAAwJ;;AAEvJjkC,OAAGwmC,iBAAH,CAAsBjG,MAAMyG,OAAN,CAAelwB,QAAf,CAAtB,EAAiDypB,MAAMyG,OAAN,CAAejwB,QAAf,CAAjD,EAA4EwpB,MAAMyG,OAAN,CAAe/vB,aAAf,CAA5E,EAA4GspB,MAAMyG,OAAN,CAAe9vB,aAAf,CAA5G;;AAEA2sB,sBAAkB/sB,QAAlB;AACAgtB,sBAAkB/sB,QAAlB;AACAitB,2BAAuB/sB,aAAvB;AACAgtB,2BAAuB/sB,aAAvB;AAEA;AAED;;AAEDysB,oBAAkBjtB,QAAlB;AACAwtB,6BAA2BjsB,kBAA3B;AAEA;;AAED,UAASgvB,WAAT,CAAsB3/B,QAAtB,EAAgC4/B,WAAhC,EAA8C;;AAE7C5/B,WAASqP,IAAT,KAAkB72C,UAAlB,GACGwjC,QAAStD,GAAG4/B,SAAZ,CADH,GAEGx8B,OAAQpD,GAAG4/B,SAAX,CAFH;;AAIA,MAAIzM,YAAc7rB,SAASqP,IAAT,KAAkB92C,QAApC;AACA,MAAKqnE,WAAL,EAAmB/T,YAAY,CAAEA,SAAd;;AAEnByS,eAAczS,SAAd;;AAEA7rB,WAASuP,WAAT,KAAyB,IAAzB,GACGupB,YAAa94B,SAASoP,QAAtB,EAAgCpP,SAAS0P,aAAzC,EAAwD1P,SAASwP,QAAjE,EAA2ExP,SAASyP,QAApF,EAA8FzP,SAAS6P,kBAAvG,EAA2H7P,SAAS2P,aAApI,EAAmJ3P,SAAS4P,aAA5J,EAA2K5P,SAAS2Q,kBAApL,CADH,GAEGmoB,YAAahgE,UAAb,CAFH;;AAIAklB,cAAY+7C,OAAZ,CAAqB/5B,SAAS8P,SAA9B;AACA9xB,cAAY03C,OAAZ,CAAqB11B,SAAS+P,SAA9B;AACA/xB,cAAY+6C,OAAZ,CAAqB/4B,SAASgQ,UAA9B;AACA8rB,cAAY/C,OAAZ,CAAqB/4B,SAASqQ,UAA9B;;AAEAwvB,mBAAkB7/B,SAASsQ,aAA3B,EAA0CtQ,SAASuQ,mBAAnD,EAAwEvQ,SAASwQ,kBAAjF;AAEA;;AAED;;AAEA,UAAS8tB,YAAT,CAAuBzS,SAAvB,EAAmC;;AAElC,MAAKgR,qBAAqBhR,SAA1B,EAAsC;;AAErC,OAAKA,SAAL,EAAiB;;AAEhBnzB,OAAGonC,SAAH,CAAcpnC,GAAGqnC,EAAjB;AAEA,IAJD,MAIO;;AAENrnC,OAAGonC,SAAH,CAAcpnC,GAAGsnC,GAAjB;AAEA;;AAEDnD,sBAAmBhR,SAAnB;AAEA;AAED;;AAED,UAAS0S,WAAT,CAAsB0B,QAAtB,EAAiC;;AAEhC,MAAKA,aAAapoE,YAAlB,EAAiC;;AAEhCikC,UAAQpD,GAAG4/B,SAAX;;AAEA,OAAK2H,aAAanD,eAAlB,EAAoC;;AAEnC,QAAKmD,aAAanoE,YAAlB,EAAiC;;AAEhC4gC,QAAGunC,QAAH,CAAavnC,GAAGwnC,IAAhB;AAEA,KAJD,MAIO,IAAKD,aAAaloE,aAAlB,EAAkC;;AAExC2gC,QAAGunC,QAAH,CAAavnC,GAAGynC,KAAhB;AAEA,KAJM,MAIA;;AAENznC,QAAGunC,QAAH,CAAavnC,GAAG0nC,cAAhB;AAEA;AAED;AAED,GAtBD,MAsBO;;AAENpkC,WAAStD,GAAG4/B,SAAZ;AAEA;;AAEDwE,oBAAkBmD,QAAlB;AAEA;;AAED,UAASI,YAAT,CAAuBnkD,KAAvB,EAA+B;;AAE9B,MAAKA,UAAU6gD,gBAAf,EAAkC;;AAEjC,OAAKI,kBAAL,EAA0BzkC,GAAG4nC,SAAH,CAAcpkD,KAAd;;AAE1B6gD,sBAAmB7gD,KAAnB;AAEA;AAED;;AAED,UAAS2jD,gBAAT,CAA2BvvB,aAA3B,EAA0CiwB,MAA1C,EAAkDva,KAAlD,EAA0D;;AAEzD,MAAK1V,aAAL,EAAqB;;AAEpBxU,UAAQpD,GAAG8nC,mBAAX;;AAEA,OAAKxD,+BAA+BuD,MAA/B,IAAyCtD,8BAA8BjX,KAA5E,EAAoF;;AAEnFttB,OAAG4X,aAAH,CAAkBiwB,MAAlB,EAA0Bva,KAA1B;;AAEAgX,iCAA6BuD,MAA7B;AACAtD,gCAA4BjX,KAA5B;AAEA;AAED,GAbD,MAaO;;AAENhqB,WAAStD,GAAG8nC,mBAAZ;AAEA;AAED;;AAED,UAAS7K,cAAT,CAAyB93C,WAAzB,EAAuC;;AAEtC,MAAKA,WAAL,EAAmB;;AAElBie,UAAQpD,GAAG+nC,YAAX;AAEA,GAJD,MAIO;;AAENzkC,WAAStD,GAAG+nC,YAAZ;AAEA;AAED;;AAED;;AAEA,UAASjI,aAAT,CAAwBkI,SAAxB,EAAoC;;AAEnC,MAAKA,cAAc/rE,SAAnB,EAA+B+rE,YAAYhoC,GAAG+/B,QAAH,GAAc5b,WAAd,GAA4B,CAAxC;;AAE/B,MAAKygB,uBAAuBoD,SAA5B,EAAwC;;AAEvChoC,MAAG8/B,aAAH,CAAkBkI,SAAlB;AACApD,wBAAqBoD,SAArB;AAEA;AAED;;AAED,UAAS/C,WAAT,CAAsBgD,SAAtB,EAAiCC,YAAjC,EAAgD;;AAE/C,MAAKtD,uBAAuB,IAA5B,EAAmC;;AAElC9E;AAEA;;AAED,MAAIqI,eAAetD,qBAAsBD,kBAAtB,CAAnB;;AAEA,MAAKuD,iBAAiBlsE,SAAtB,EAAkC;;AAEjCksE,kBAAe,EAAErqE,MAAM7B,SAAR,EAAmBopB,SAASppB,SAA5B,EAAf;AACA4oE,wBAAsBD,kBAAtB,IAA6CuD,YAA7C;AAEA;;AAED,MAAKA,aAAarqE,IAAb,KAAsBmqE,SAAtB,IAAmCE,aAAa9iD,OAAb,KAAyB6iD,YAAjE,EAAgF;;AAE/EloC,MAAGilC,WAAH,CAAgBgD,SAAhB,EAA2BC,gBAAgB1C,cAAeyC,SAAf,CAA3C;;AAEAE,gBAAarqE,IAAb,GAAoBmqE,SAApB;AACAE,gBAAa9iD,OAAb,GAAuB6iD,YAAvB;AAEA;AAED;;AAED,UAASE,oBAAT,GAAgC;;AAE/B,MAAI;;AAEHpoC,MAAGooC,oBAAH,CAAwBC,KAAxB,CAA+BroC,EAA/B,EAAmC1iC,SAAnC;AAEA,GAJD,CAIE,OAAQ6R,KAAR,EAAgB;;AAEjBzD,WAAQyD,KAAR,CAAe,mBAAf,EAAoCA,KAApC;AAEA;AAED;;AAED,UAASm2D,UAAT,GAAsB;;AAErB,MAAI;;AAEHtlC,MAAGslC,UAAH,CAAc+C,KAAd,CAAqBroC,EAArB,EAAyB1iC,SAAzB;AAEA,GAJD,CAIE,OAAQ6R,KAAR,EAAgB;;AAEjBzD,WAAQyD,KAAR,CAAe,mBAAf,EAAoCA,KAApC;AAEA;AAED;;AAED;;AAEA,UAAS+V,OAAT,CAAkBA,OAAlB,EAA4B;;AAE3B,MAAK4/C,eAAez2D,MAAf,CAAuB6W,OAAvB,MAAqC,KAA1C,EAAkD;;AAEjD8a,MAAG9a,OAAH,CAAYA,QAAQzoB,CAApB,EAAuByoB,QAAQ7b,CAA/B,EAAkC6b,QAAQnU,CAA1C,EAA6CmU,QAAQzZ,CAArD;AACAq5D,kBAAex5D,IAAf,CAAqB4Z,OAArB;AAEA;AAED;;AAED,UAASE,QAAT,CAAmBA,QAAnB,EAA8B;;AAE7B,MAAK2/C,gBAAgB12D,MAAhB,CAAwB+W,QAAxB,MAAuC,KAA5C,EAAoD;;AAEnD4a,MAAG5a,QAAH,CAAaA,SAAS3oB,CAAtB,EAAyB2oB,SAAS/b,CAAlC,EAAqC+b,SAASrU,CAA9C,EAAiDqU,SAAS3Z,CAA1D;AACAs5D,mBAAgBz5D,IAAhB,CAAsB8Z,QAAtB;AAEA;AAED;;AAED;;AAEA,UAASwjC,KAAT,GAAiB;;AAEhB,OAAM,IAAIhqD,IAAI,CAAd,EAAiBA,IAAI2kE,kBAAkBhmE,MAAvC,EAA+CqB,GAA/C,EAAsD;;AAErD,OAAK2kE,kBAAmB3kE,CAAnB,MAA2B,CAAhC,EAAoC;;AAEnCohC,OAAGkmC,wBAAH,CAA6BtnE,CAA7B;AACA2kE,sBAAmB3kE,CAAnB,IAAyB,CAAzB;AAEA;AAED;;AAED02D,iBAAe,EAAf;;AAEAmO,6BAA2B,IAA3B;;AAEAmB,uBAAqB,IAArB;AACAC,yBAAuB,EAAvB;;AAEAnB,mBAAiB,IAAjB;;AAEAC,oBAAkB,IAAlB;;AAEAQ,qBAAmB,IAAnB;AACAC,oBAAkB,IAAlB;;AAEAhB,cAAYxa,KAAZ;AACAtjC,cAAYsjC,KAAZ;AACArjC,gBAAcqjC,KAAd;AAEA;;AAED,QAAO;;AAEN3oB,WAAS;AACRnI,UAAOsrC,WADC;AAER5kC,UAAOlZ,WAFC;AAGR49C,YAAS39C;AAHD,GAFH;;AAQNk6C,kBAAgBA,cARV;AASNC,mBAAiBA,eATX;AAUNoG,6BAA2BA,yBAVrB;AAWNnG,2BAAyBA,uBAXnB;AAYNv8B,UAAQA,MAZF;AAaNE,WAASA,OAbH;AAcN6iC,+BAA6BA,2BAdvB;;AAgBN3G,cAAYA,UAhBN;;AAkBNY,eAAaA,WAlBP;AAmBN6G,eAAaA,WAnBP;;AAqBNrB,gBAAcA,YArBR;AAsBNC,eAAaA,WAtBP;;AAwBN8B,gBAAcA,YAxBR;AAyBNR,oBAAkBA,gBAzBZ;;AA2BNlK,kBAAgBA,cA3BV;;AA6BN6C,iBAAeA,aA7BT;AA8BNmF,eAAaA,WA9BP;AA+BNmD,wBAAsBA,oBA/BhB;AAgCN9C,cAAYA,UAhCN;;AAkCNpgD,WAASA,OAlCH;AAmCNE,YAAUA,QAnCJ;;AAqCNwjC,SAAOA;;AArCD,EAAP;AAyCA;;AAED;;;;AAIA,SAAS0f,aAAT,CAAwBzL,GAAxB,EAA6BnjB,UAA7B,EAAyC4H,KAAzC,EAAgDplB,UAAhD,EAA4Do5B,YAA5D,EAA0EiL,KAA1E,EAAiFxd,IAAjF,EAAwF;;AAEvF,KAAIwlB,YAAc,OAAOC,sBAAP,KAAkC,WAAlC,IAAiD3L,eAAe2L,sBAAlF,CAFuF,CAEqB;AAC5G,KAAIC,iBAAiB,EAArB;AACA,KAAIC,OAAJ;;AAEA;;AAEA,UAASC,cAAT,CAAyBpnD,KAAzB,EAAgCqnD,OAAhC,EAA0C;;AAEzC,MAAKrnD,MAAMiC,KAAN,GAAcolD,OAAd,IAAyBrnD,MAAMkC,MAAN,GAAemlD,OAA7C,EAAuD;;AAEtD,OAAK,UAAUrnD,KAAf,EAAuB;;AAEtB7V,YAAQC,IAAR,CAAc,2DAA2D4V,MAAMiC,KAAjE,GAAyE,GAAzE,GAA+EjC,MAAMkC,MAArF,GAA8F,IAA5G;AACA;AAEA;;AAED;AACA;;AAEA,OAAIrN,QAAQwyD,UAAU1sE,KAAKyM,GAAL,CAAU4Y,MAAMiC,KAAhB,EAAuBjC,MAAMkC,MAA7B,CAAtB;;AAEA,OAAIL,SAASE,SAASC,eAAT,CAA0B,8BAA1B,EAA0D,QAA1D,CAAb;AACAH,UAAOI,KAAP,GAAetnB,KAAKK,KAAL,CAAYglB,MAAMiC,KAAN,GAAcpN,KAA1B,CAAf;AACAgN,UAAOK,MAAP,GAAgBvnB,KAAKK,KAAL,CAAYglB,MAAMkC,MAAN,GAAerN,KAA3B,CAAhB;;AAEA,OAAIsN,UAAUN,OAAOO,UAAP,CAAmB,IAAnB,CAAd;AACAD,WAAQI,SAAR,CAAmBvC,KAAnB,EAA0B,CAA1B,EAA6B,CAA7B,EAAgCA,MAAMiC,KAAtC,EAA6CjC,MAAMkC,MAAnD,EAA2D,CAA3D,EAA8D,CAA9D,EAAiEL,OAAOI,KAAxE,EAA+EJ,OAAOK,MAAtF;;AAEA/X,WAAQC,IAAR,CAAc,4CAA4C4V,MAAMiC,KAAlD,GAA0D,GAA1D,GAAgEjC,MAAMkC,MAAtE,GAA+E,gBAA/E,GAAkGL,OAAOI,KAAzG,GAAiH,GAAjH,GAAuHJ,OAAOK,MAA5I,EAAoJlC,KAApJ;;AAEA,UAAO6B,MAAP;AAEA;;AAED,SAAO7B,KAAP;AAEA;;AAED,UAASpX,YAAT,CAAuBoX,KAAvB,EAA+B;;AAE9B,SAAO3Z,MAAMuC,YAAN,CAAoBoX,MAAMiC,KAA1B,KAAqC5b,MAAMuC,YAAN,CAAoBoX,MAAMkC,MAA1B,CAA5C;AAEA;;AAED,UAASolD,cAAT,CAAyBtnD,KAAzB,EAAiC;;AAEhC,MAAKA,iBAAiBunD,gBAAjB,IAAqCvnD,iBAAiB8B,iBAAtD,IAA2E9B,iBAAiBwnD,WAAjG,EAA+G;;AAE9G,OAAKL,YAAYzsE,SAAjB,EAA6BysE,UAAUplD,SAASC,eAAT,CAA0B,8BAA1B,EAA0D,QAA1D,CAAV;;AAE7BmlD,WAAQllD,KAAR,GAAgB5b,MAAM4C,eAAN,CAAuB+W,MAAMiC,KAA7B,CAAhB;AACAklD,WAAQjlD,MAAR,GAAiB7b,MAAM4C,eAAN,CAAuB+W,MAAMkC,MAA7B,CAAjB;;AAEA,OAAIC,UAAUglD,QAAQ/kD,UAAR,CAAoB,IAApB,CAAd;AACAD,WAAQI,SAAR,CAAmBvC,KAAnB,EAA0B,CAA1B,EAA6B,CAA7B,EAAgCmnD,QAAQllD,KAAxC,EAA+CklD,QAAQjlD,MAAvD;;AAEA/X,WAAQC,IAAR,CAAc,qDAAqD4V,MAAMiC,KAA3D,GAAmE,GAAnE,GAAyEjC,MAAMkC,MAA/E,GAAwF,gBAAxF,GAA2GilD,QAAQllD,KAAnH,GAA2H,GAA3H,GAAiIklD,QAAQjlD,MAAvJ,EAA+JlC,KAA/J;;AAEA,UAAOmnD,OAAP;AAEA;;AAED,SAAOnnD,KAAP;AAEA;;AAED,UAASynD,sBAAT,CAAiC3jD,OAAjC,EAA2C;;AAE1C,SAASA,QAAQ5D,KAAR,KAAkBte,mBAAlB,IAAyCkiB,QAAQ3D,KAAR,KAAkBve,mBAA7D,IACJkiB,QAAQzD,SAAR,KAAsBve,aAAtB,IAAuCgiB,QAAQzD,SAAR,KAAsBpe,YADhE;AAGA;;AAED,UAASylE,2BAAT,CAAsC5jD,OAAtC,EAA+Clb,YAA/C,EAA8D;;AAE7D,SAAOkb,QAAQ/C,eAAR,IAA2BnY,YAA3B,IACNkb,QAAQzD,SAAR,KAAsBve,aADhB,IACiCgiB,QAAQzD,SAAR,KAAsBpe,YAD9D;AAGA;;AAED,UAAS0lE,cAAT,CAAyBhsE,MAAzB,EAAiCmoB,OAAjC,EAA0C7B,KAA1C,EAAiDC,MAAjD,EAA0D;;AAEzDo5C,MAAIqM,cAAJ,CAAoBhsE,MAApB;;AAEA,MAAIisE,oBAAoBjtC,WAAWp/B,GAAX,CAAgBuoB,OAAhB,CAAxB;;AAEA;AACA8jD,oBAAkBC,aAAlB,GAAkCltE,KAAKoO,GAAL,CAAUpO,KAAKyM,GAAL,CAAU6a,KAAV,EAAiBC,MAAjB,CAAV,IAAwCvnB,KAAKmtE,KAA/E;AAEA;;AAED;;AAEA,UAASC,cAAT,CAAyB73D,CAAzB,EAA6B;;AAE5B,MAAKA,MAAMpO,aAAN,IAAuBoO,MAAMnO,0BAA7B,IAA2DmO,MAAMlO,yBAAtE,EAAkG;;AAEjG,UAAOs5D,IAAIuI,OAAX;AAEA;;AAED,SAAOvI,IAAI0M,MAAX;AAEA;;AAED;;AAEA,UAASC,gBAAT,CAA2B/qE,KAA3B,EAAmC;;AAElC,MAAI4mB,UAAU5mB,MAAMvB,MAApB;;AAEAmoB,UAAQhnB,mBAAR,CAA6B,SAA7B,EAAwCmrE,gBAAxC;;AAEAC,oBAAmBpkD,OAAnB;;AAEA,MAAKA,QAAQqkD,cAAb,EAA8B;;AAE7B,UAAOjB,eAAgBpjD,QAAQ2gB,EAAxB,CAAP;AAEA;;AAED+c,OAAKuE,MAAL,CAAYpkC,QAAZ;AAEA;;AAED,UAASymD,qBAAT,CAAgClrE,KAAhC,EAAwC;;AAEvC,MAAImrE,eAAenrE,MAAMvB,MAAzB;;AAEA0sE,eAAavrE,mBAAb,CAAkC,SAAlC,EAA6CsrE,qBAA7C;;AAEAE,yBAAwBD,YAAxB;;AAEA7mB,OAAKuE,MAAL,CAAYpkC,QAAZ;AAEA;;AAED;;AAEA,UAASumD,iBAAT,CAA4BpkD,OAA5B,EAAsC;;AAErC,MAAI8jD,oBAAoBjtC,WAAWp/B,GAAX,CAAgBuoB,OAAhB,CAAxB;;AAEA,MAAKA,QAAQ9D,KAAR,IAAiB4nD,kBAAkBW,yBAAxC,EAAoE;;AAEnE;;AAEAjN,OAAIkN,aAAJ,CAAmBZ,kBAAkBW,yBAArC;AAEA,GAND,MAMO;;AAEN;;AAEA,OAAKX,kBAAkBa,WAAlB,KAAkC/tE,SAAvC,EAAmD;;AAEnD4gE,OAAIkN,aAAJ,CAAmBZ,kBAAkBc,cAArC;AAEA;;AAED;AACA/tC,aAAWiG,MAAX,CAAmB9c,OAAnB;AAEA;;AAED,UAASwkD,sBAAT,CAAiCD,YAAjC,EAAgD;;AAE/C,MAAIM,yBAAyBhuC,WAAWp/B,GAAX,CAAgB8sE,YAAhB,CAA7B;AACA,MAAIT,oBAAoBjtC,WAAWp/B,GAAX,CAAgB8sE,aAAavkD,OAA7B,CAAxB;;AAEA,MAAK,CAAEukD,YAAP,EAAsB;;AAEtB,MAAKT,kBAAkBc,cAAlB,KAAqChuE,SAA1C,EAAsD;;AAErD4gE,OAAIkN,aAAJ,CAAmBZ,kBAAkBc,cAArC;AAEA;;AAED,MAAKL,aAAapkD,YAAlB,EAAiC;;AAEhCokD,gBAAapkD,YAAb,CAA0BnB,OAA1B;AAEA;;AAED,MAAKulD,aAAa9jD,uBAAlB,EAA4C;;AAE3C,QAAM,IAAIlnB,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9Bi+D,QAAIsN,iBAAJ,CAAuBD,uBAAuBE,kBAAvB,CAA2CxrE,CAA3C,CAAvB;AACA,QAAKsrE,uBAAuBG,kBAA5B,EAAiDxN,IAAIyN,kBAAJ,CAAwBJ,uBAAuBG,kBAAvB,CAA2CzrE,CAA3C,CAAxB;AAEjD;AAED,GATD,MASO;;AAENi+D,OAAIsN,iBAAJ,CAAuBD,uBAAuBE,kBAA9C;AACA,OAAKF,uBAAuBG,kBAA5B,EAAiDxN,IAAIyN,kBAAJ,CAAwBJ,uBAAuBG,kBAA/C;AAEjD;;AAEDnuC,aAAWiG,MAAX,CAAmBynC,aAAavkD,OAAhC;AACA6W,aAAWiG,MAAX,CAAmBynC,YAAnB;AAEA;;AAED;;;AAIA,UAAS5d,YAAT,CAAuB3mC,OAAvB,EAAgCklD,IAAhC,EAAuC;;AAEtC,MAAIpB,oBAAoBjtC,WAAWp/B,GAAX,CAAgBuoB,OAAhB,CAAxB;;AAEA,MAAKA,QAAQqkD,cAAb,EAA8Bc,mBAAoBnlD,OAApB;;AAE9B,MAAKA,QAAQ3C,OAAR,GAAkB,CAAlB,IAAuBymD,kBAAkBsB,SAAlB,KAAgCplD,QAAQ3C,OAApE,EAA8E;;AAE7E,OAAInB,QAAQ8D,QAAQ9D,KAApB;;AAEA,OAAKA,UAAUtlB,SAAf,EAA2B;;AAE1ByP,YAAQC,IAAR,CAAc,uEAAd,EAAuF0Z,OAAvF;AAEA,IAJD,MAIO,IAAK9D,MAAMmpD,QAAN,KAAmB,KAAxB,EAAgC;;AAEtCh/D,YAAQC,IAAR,CAAc,wEAAd,EAAwF0Z,OAAxF;AAEA,IAJM,MAIA;;AAENslD,kBAAexB,iBAAf,EAAkC9jD,OAAlC,EAA2CklD,IAA3C;AACA;AAEA;AAED;;AAEDjpB,QAAMwe,aAAN,CAAqBjD,IAAIkD,QAAJ,GAAewK,IAApC;AACAjpB,QAAM2jB,WAAN,CAAmBpI,IAAI4I,UAAvB,EAAmC0D,kBAAkBc,cAArD;AAEA;;AAED,UAAS/d,cAAT,CAAyB7mC,OAAzB,EAAkCklD,IAAlC,EAAyC;;AAExC,MAAIpB,oBAAoBjtC,WAAWp/B,GAAX,CAAgBuoB,OAAhB,CAAxB;;AAEA,MAAKA,QAAQ9D,KAAR,CAAchkB,MAAd,KAAyB,CAA9B,EAAkC;;AAEjC,OAAK8nB,QAAQ3C,OAAR,GAAkB,CAAlB,IAAuBymD,kBAAkBsB,SAAlB,KAAgCplD,QAAQ3C,OAApE,EAA8E;;AAE7E,QAAK,CAAEymD,kBAAkBW,yBAAzB,EAAqD;;AAEpDzkD,aAAQxnB,gBAAR,CAA0B,SAA1B,EAAqC2rE,gBAArC;;AAEAL,uBAAkBW,yBAAlB,GAA8CjN,IAAImI,aAAJ,EAA9C;;AAEAjiB,UAAKuE,MAAL,CAAYpkC,QAAZ;AAEA;;AAEDo+B,UAAMwe,aAAN,CAAqBjD,IAAIkD,QAAJ,GAAewK,IAApC;AACAjpB,UAAM2jB,WAAN,CAAmBpI,IAAI6I,gBAAvB,EAAyCyD,kBAAkBW,yBAA3D;;AAEAjN,QAAI+N,WAAJ,CAAiB/N,IAAIgO,mBAArB,EAA0CxlD,QAAQ7C,KAAlD;;AAEA,QAAIsoD,eAAiBzlD,WAAWA,QAAQ0lD,mBAAxC;AACA,QAAI9kD,gBAAkBZ,QAAQ9D,KAAR,CAAe,CAAf,KAAsB8D,QAAQ9D,KAAR,CAAe,CAAf,EAAmB0E,aAA/D;;AAEA,QAAI+kD,YAAY,EAAhB;;AAEA,SAAM,IAAIpsE,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B,SAAK,CAAEksE,YAAF,IAAkB,CAAE7kD,aAAzB,EAAyC;;AAExC+kD,gBAAWpsE,CAAX,IAAiB+pE,eAAgBtjD,QAAQ9D,KAAR,CAAe3iB,CAAf,CAAhB,EAAoC02D,aAAa7Q,cAAjD,CAAjB;AAEA,MAJD,MAIO;;AAENumB,gBAAWpsE,CAAX,IAAiBqnB,gBAAgBZ,QAAQ9D,KAAR,CAAe3iB,CAAf,EAAmB2iB,KAAnC,GAA2C8D,QAAQ9D,KAAR,CAAe3iB,CAAf,CAA5D;AAEA;AAED;;AAED,QAAI2iB,QAAQypD,UAAW,CAAX,CAAZ;AAAA,QACCC,oBAAoB9gE,aAAcoX,KAAd,CADrB;AAAA,QAEC2pD,WAAW3K,MAAMyG,OAAN,CAAe3hD,QAAQxD,MAAvB,CAFZ;AAAA,QAGCspD,SAAS5K,MAAMyG,OAAN,CAAe3hD,QAAQvnB,IAAvB,CAHV;;AAKAstE,yBAAsBvO,IAAI6I,gBAA1B,EAA4CrgD,OAA5C,EAAqD4lD,iBAArD;;AAEA,SAAM,IAAIrsE,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B,SAAK,CAAEksE,YAAP,EAAsB;;AAErB,UAAK7kD,aAAL,EAAqB;;AAEpBq7B,aAAMgkB,UAAN,CAAkBzI,IAAI8I,2BAAJ,GAAkC/mE,CAApD,EAAuD,CAAvD,EAA0DssE,QAA1D,EAAoEF,UAAWpsE,CAAX,EAAe4kB,KAAnF,EAA0FwnD,UAAWpsE,CAAX,EAAe6kB,MAAzG,EAAiH,CAAjH,EAAoHynD,QAApH,EAA8HC,MAA9H,EAAsIH,UAAWpsE,CAAX,EAAeonB,IAArJ;AAEA,OAJD,MAIO;;AAENs7B,aAAMgkB,UAAN,CAAkBzI,IAAI8I,2BAAJ,GAAkC/mE,CAApD,EAAuD,CAAvD,EAA0DssE,QAA1D,EAAoEA,QAApE,EAA8EC,MAA9E,EAAsFH,UAAWpsE,CAAX,CAAtF;AAEA;AAED,MAZD,MAYO;;AAEN,UAAIysE,MAAJ;AAAA,UAAYnpD,UAAU8oD,UAAWpsE,CAAX,EAAesjB,OAArC;;AAEA,WAAM,IAAI2H,IAAI,CAAR,EAAW2gB,KAAKtoB,QAAQ3kB,MAA9B,EAAsCssB,IAAI2gB,EAA1C,EAA8C3gB,GAA9C,EAAqD;;AAEpDwhD,gBAASnpD,QAAS2H,CAAT,CAAT;;AAEA,WAAKxE,QAAQxD,MAAR,KAAmBpd,UAAnB,IAAiC4gB,QAAQxD,MAAR,KAAmBrd,SAAzD,EAAqE;;AAEpE,YAAK88C,MAAM6kB,2BAAN,GAAoCjoE,OAApC,CAA6CgtE,QAA7C,IAA0D,CAAE,CAAjE,EAAqE;;AAEpE5pB,eAAM8mB,oBAAN,CAA4BvL,IAAI8I,2BAAJ,GAAkC/mE,CAA9D,EAAiEirB,CAAjE,EAAoEqhD,QAApE,EAA8EG,OAAO7nD,KAArF,EAA4F6nD,OAAO5nD,MAAnG,EAA2G,CAA3G,EAA8G4nD,OAAOrlD,IAArH;AAEA,SAJD,MAIO;;AAENta,iBAAQC,IAAR,CAAc,iGAAd;AAEA;AAED,QAZD,MAYO;;AAEN21C,cAAMgkB,UAAN,CAAkBzI,IAAI8I,2BAAJ,GAAkC/mE,CAApD,EAAuDirB,CAAvD,EAA0DqhD,QAA1D,EAAoEG,OAAO7nD,KAA3E,EAAkF6nD,OAAO5nD,MAAzF,EAAiG,CAAjG,EAAoGynD,QAApG,EAA8GC,MAA9G,EAAsHE,OAAOrlD,IAA7H;AAEA;AAED;AAED;AAED;;AAED,QAAK,CAAE8kD,YAAP,EAAsB;;AAErB3B,uBAAkBC,aAAlB,GAAkC,CAAlC;AAEA,KAJD,MAIO;;AAEND,uBAAkBC,aAAlB,GAAkClnD,QAAQ3kB,MAAR,GAAiB,CAAnD;AAEA;;AAED,QAAK0rE,4BAA6B5jD,OAA7B,EAAsC4lD,iBAAtC,CAAL,EAAiE;;AAEhE;AACA/B,oBAAgBrM,IAAI6I,gBAApB,EAAsCrgD,OAAtC,EAA+C9D,MAAMiC,KAArD,EAA4DjC,MAAMkC,MAAlE;AAEA;;AAED0lD,sBAAkBsB,SAAlB,GAA8BplD,QAAQ3C,OAAtC;;AAEA,QAAK2C,QAAQ1C,QAAb,EAAwB0C,QAAQ1C,QAAR,CAAkB0C,OAAlB;AAExB,IA9GD,MA8GO;;AAENi8B,UAAMwe,aAAN,CAAqBjD,IAAIkD,QAAJ,GAAewK,IAApC;AACAjpB,UAAM2jB,WAAN,CAAmBpI,IAAI6I,gBAAvB,EAAyCyD,kBAAkBW,yBAA3D;AAEA;AAED;AAED;;AAED,UAASwB,qBAAT,CAAgCjmD,OAAhC,EAAyCklD,IAAzC,EAAgD;;AAE/CjpB,QAAMwe,aAAN,CAAqBjD,IAAIkD,QAAJ,GAAewK,IAApC;AACAjpB,QAAM2jB,WAAN,CAAmBpI,IAAI6I,gBAAvB,EAAyCxpC,WAAWp/B,GAAX,CAAgBuoB,OAAhB,EAA0B4kD,cAAnE;AAEA;;AAED,UAASmB,oBAAT,CAA+BG,WAA/B,EAA4ClmD,OAA5C,EAAqD4lD,iBAArD,EAAyE;;AAExE,MAAI7nB,SAAJ;;AAEA,MAAK6nB,iBAAL,EAAyB;;AAExBpO,OAAIqI,aAAJ,CAAmBqG,WAAnB,EAAgC1O,IAAI2O,cAApC,EAAoDjL,MAAMyG,OAAN,CAAe3hD,QAAQ5D,KAAvB,CAApD;AACAo7C,OAAIqI,aAAJ,CAAmBqG,WAAnB,EAAgC1O,IAAI4O,cAApC,EAAoDlL,MAAMyG,OAAN,CAAe3hD,QAAQ3D,KAAvB,CAApD;;AAEAm7C,OAAIqI,aAAJ,CAAmBqG,WAAnB,EAAgC1O,IAAIwI,kBAApC,EAAwD9E,MAAMyG,OAAN,CAAe3hD,QAAQ1D,SAAvB,CAAxD;AACAk7C,OAAIqI,aAAJ,CAAmBqG,WAAnB,EAAgC1O,IAAIsI,kBAApC,EAAwD5E,MAAMyG,OAAN,CAAe3hD,QAAQzD,SAAvB,CAAxD;AAEA,GARD,MAQO;;AAENi7C,OAAIqI,aAAJ,CAAmBqG,WAAnB,EAAgC1O,IAAI2O,cAApC,EAAoD3O,IAAI6O,aAAxD;AACA7O,OAAIqI,aAAJ,CAAmBqG,WAAnB,EAAgC1O,IAAI4O,cAApC,EAAoD5O,IAAI6O,aAAxD;;AAEA,OAAKrmD,QAAQ5D,KAAR,KAAkBte,mBAAlB,IAAyCkiB,QAAQ3D,KAAR,KAAkBve,mBAAhE,EAAsF;;AAErFuI,YAAQC,IAAR,CAAc,+HAAd,EAA+I0Z,OAA/I;AAEA;;AAEDw3C,OAAIqI,aAAJ,CAAmBqG,WAAnB,EAAgC1O,IAAIwI,kBAApC,EAAwDiE,eAAgBjkD,QAAQ1D,SAAxB,CAAxD;AACAk7C,OAAIqI,aAAJ,CAAmBqG,WAAnB,EAAgC1O,IAAIsI,kBAApC,EAAwDmE,eAAgBjkD,QAAQzD,SAAxB,CAAxD;;AAEA,OAAKyD,QAAQzD,SAAR,KAAsBve,aAAtB,IAAuCgiB,QAAQzD,SAAR,KAAsBpe,YAAlE,EAAiF;;AAEhFkI,YAAQC,IAAR,CAAc,iIAAd,EAAiJ0Z,OAAjJ;AAEA;AAED;;AAED+9B,cAAY1J,WAAW58C,GAAX,CAAgB,gCAAhB,CAAZ;;AAEA,MAAKsmD,SAAL,EAAiB;;AAEhB,OAAK/9B,QAAQvnB,IAAR,KAAiBmG,SAAjB,IAA8By1C,WAAW58C,GAAX,CAAgB,0BAAhB,MAAiD,IAApF,EAA2F;AAC3F,OAAKuoB,QAAQvnB,IAAR,KAAiBoG,aAAjB,IAAkCw1C,WAAW58C,GAAX,CAAgB,+BAAhB,MAAsD,IAA7F,EAAoG;;AAEpG,OAAKuoB,QAAQvD,UAAR,GAAqB,CAArB,IAA0Boa,WAAWp/B,GAAX,CAAgBuoB,OAAhB,EAA0BsmD,mBAAzD,EAA+E;;AAE9E9O,QAAI+O,aAAJ,CAAmBL,WAAnB,EAAgCnoB,UAAUyoB,0BAA1C,EAAsE3vE,KAAKwM,GAAL,CAAU2c,QAAQvD,UAAlB,EAA8BwzC,aAAa7R,gBAAb,EAA9B,CAAtE;AACAvnB,eAAWp/B,GAAX,CAAgBuoB,OAAhB,EAA0BsmD,mBAA1B,GAAgDtmD,QAAQvD,UAAxD;AAEA;AAED;AAED;;AAED,UAAS6oD,aAAT,CAAwBxB,iBAAxB,EAA2C9jD,OAA3C,EAAoDklD,IAApD,EAA2D;;AAE1D,MAAKpB,kBAAkBa,WAAlB,KAAkC/tE,SAAvC,EAAmD;;AAElDktE,qBAAkBa,WAAlB,GAAgC,IAAhC;;AAEA3kD,WAAQxnB,gBAAR,CAA0B,SAA1B,EAAqC2rE,gBAArC;;AAEAL,qBAAkBc,cAAlB,GAAmCpN,IAAImI,aAAJ,EAAnC;;AAEAjiB,QAAKuE,MAAL,CAAYpkC,QAAZ;AAEA;;AAEDo+B,QAAMwe,aAAN,CAAqBjD,IAAIkD,QAAJ,GAAewK,IAApC;AACAjpB,QAAM2jB,WAAN,CAAmBpI,IAAI4I,UAAvB,EAAmC0D,kBAAkBc,cAArD;;AAEApN,MAAI+N,WAAJ,CAAiB/N,IAAIgO,mBAArB,EAA0CxlD,QAAQ7C,KAAlD;AACAq6C,MAAI+N,WAAJ,CAAiB/N,IAAIiP,8BAArB,EAAqDzmD,QAAQ9C,gBAA7D;AACAs6C,MAAI+N,WAAJ,CAAiB/N,IAAIkP,gBAArB,EAAuC1mD,QAAQ5C,eAA/C;;AAEA,MAAIlB,QAAQonD,eAAgBtjD,QAAQ9D,KAAxB,EAA+B+zC,aAAa/Q,cAA5C,CAAZ;;AAEA,MAAKykB,uBAAwB3jD,OAAxB,KAAqClb,aAAcoX,KAAd,MAA0B,KAApE,EAA4E;;AAE3EA,WAAQsnD,eAAgBtnD,KAAhB,CAAR;AAEA;;AAED,MAAI0pD,oBAAoB9gE,aAAcoX,KAAd,CAAxB;AAAA,MACC2pD,WAAW3K,MAAMyG,OAAN,CAAe3hD,QAAQxD,MAAvB,CADZ;AAAA,MAECspD,SAAS5K,MAAMyG,OAAN,CAAe3hD,QAAQvnB,IAAvB,CAFV;;AAIAstE,uBAAsBvO,IAAI4I,UAA1B,EAAsCpgD,OAAtC,EAA+C4lD,iBAA/C;;AAEA,MAAII,MAAJ;AAAA,MAAYnpD,UAAUmD,QAAQnD,OAA9B;;AAEA,MAAKmD,QAAQ2mD,cAAb,EAA8B;;AAE7B;;AAEA,OAAIC,iBAAiBpP,IAAIqP,eAAzB;;AAEA,OAAK7mD,QAAQvnB,IAAR,KAAiBmG,SAAtB,EAAkC;;AAEjC,QAAK,CAAEskE,SAAP,EAAmB,MAAM,IAAIr9D,KAAJ,CAAW,gDAAX,CAAN;AACnB+gE,qBAAiBpP,IAAIsP,kBAArB;AAEA,IALD,MAKO,IAAK5D,SAAL,EAAiB;;AAEvB;AACA0D,qBAAiBpP,IAAIuP,iBAArB;AAEA;;AAED,OAAK/mD,QAAQxD,MAAR,KAAmBhd,WAAnB,IAAkConE,mBAAmBpP,IAAIqP,eAA9D,EAAgF;;AAE/E;AACA;AACA;AACA,QAAK7mD,QAAQvnB,IAAR,KAAiBgG,iBAAjB,IAAsCuhB,QAAQvnB,IAAR,KAAiBkG,eAA5D,EAA8E;;AAE7E0H,aAAQC,IAAR,CAAc,6FAAd;;AAEA0Z,aAAQvnB,IAAR,GAAegG,iBAAf;AACAqnE,cAAS5K,MAAMyG,OAAN,CAAe3hD,QAAQvnB,IAAvB,CAAT;AAEA;AAED;;AAED;AACA;AACA,OAAKunB,QAAQxD,MAAR,KAAmB/c,kBAAxB,EAA6C;;AAE5CmnE,qBAAiBpP,IAAIwP,aAArB;;AAEA;AACA;AACA;AACA,QAAKhnD,QAAQvnB,IAAR,KAAiBwG,kBAAtB,EAA2C;;AAE1CoH,aAAQC,IAAR,CAAc,kFAAd;;AAEA0Z,aAAQvnB,IAAR,GAAewG,kBAAf;AACA6mE,cAAS5K,MAAMyG,OAAN,CAAe3hD,QAAQvnB,IAAvB,CAAT;AAEA;AAED;;AAEDwjD,SAAMgkB,UAAN,CAAkBzI,IAAI4I,UAAtB,EAAkC,CAAlC,EAAqCwG,cAArC,EAAqD1qD,MAAMiC,KAA3D,EAAkEjC,MAAMkC,MAAxE,EAAgF,CAAhF,EAAmFynD,QAAnF,EAA6FC,MAA7F,EAAqG,IAArG;AAEA,GAxDD,MAwDO,IAAK9lD,QAAQY,aAAb,EAA6B;;AAEnC;AACA;AACA;;AAEA,OAAK/D,QAAQ3kB,MAAR,GAAiB,CAAjB,IAAsB0tE,iBAA3B,EAA+C;;AAE9C,SAAM,IAAIrsE,IAAI,CAAR,EAAWooB,KAAK9E,QAAQ3kB,MAA9B,EAAsCqB,IAAIooB,EAA1C,EAA8CpoB,GAA9C,EAAqD;;AAEpDysE,cAASnpD,QAAStjB,CAAT,CAAT;AACA0iD,WAAMgkB,UAAN,CAAkBzI,IAAI4I,UAAtB,EAAkC7mE,CAAlC,EAAqCssE,QAArC,EAA+CG,OAAO7nD,KAAtD,EAA6D6nD,OAAO5nD,MAApE,EAA4E,CAA5E,EAA+EynD,QAA/E,EAAyFC,MAAzF,EAAiGE,OAAOrlD,IAAxG;AAEA;;AAEDX,YAAQ/C,eAAR,GAA0B,KAA1B;AACA6mD,sBAAkBC,aAAlB,GAAkClnD,QAAQ3kB,MAAR,GAAiB,CAAnD;AAEA,IAZD,MAYO;;AAEN+jD,UAAMgkB,UAAN,CAAkBzI,IAAI4I,UAAtB,EAAkC,CAAlC,EAAqCyF,QAArC,EAA+C3pD,MAAMiC,KAArD,EAA4DjC,MAAMkC,MAAlE,EAA0E,CAA1E,EAA6EynD,QAA7E,EAAuFC,MAAvF,EAA+F5pD,MAAMyE,IAArG;AACAmjD,sBAAkBC,aAAlB,GAAkC,CAAlC;AAEA;AAED,GAzBM,MAyBA,IAAK/jD,QAAQ0lD,mBAAb,EAAmC;;AAEzC,QAAM,IAAInsE,IAAI,CAAR,EAAWooB,KAAK9E,QAAQ3kB,MAA9B,EAAsCqB,IAAIooB,EAA1C,EAA8CpoB,GAA9C,EAAqD;;AAEpDysE,aAASnpD,QAAStjB,CAAT,CAAT;;AAEA,QAAKymB,QAAQxD,MAAR,KAAmBpd,UAAnB,IAAiC4gB,QAAQxD,MAAR,KAAmBrd,SAAzD,EAAqE;;AAEpE,SAAK88C,MAAM6kB,2BAAN,GAAoCjoE,OAApC,CAA6CgtE,QAA7C,IAA0D,CAAE,CAAjE,EAAqE;;AAEpE5pB,YAAM8mB,oBAAN,CAA4BvL,IAAI4I,UAAhC,EAA4C7mE,CAA5C,EAA+CssE,QAA/C,EAAyDG,OAAO7nD,KAAhE,EAAuE6nD,OAAO5nD,MAA9E,EAAsF,CAAtF,EAAyF4nD,OAAOrlD,IAAhG;AAEA,MAJD,MAIO;;AAENta,cAAQC,IAAR,CAAc,gGAAd;AAEA;AAED,KAZD,MAYO;;AAEN21C,WAAMgkB,UAAN,CAAkBzI,IAAI4I,UAAtB,EAAkC7mE,CAAlC,EAAqCssE,QAArC,EAA+CG,OAAO7nD,KAAtD,EAA6D6nD,OAAO5nD,MAApE,EAA4E,CAA5E,EAA+EynD,QAA/E,EAAyFC,MAAzF,EAAiGE,OAAOrlD,IAAxG;AAEA;AAED;;AAEDmjD,qBAAkBC,aAAlB,GAAkClnD,QAAQ3kB,MAAR,GAAiB,CAAnD;AAEA,GA5BM,MA4BA;;AAEN;;AAEA;AACA;AACA;;AAEA,OAAK2kB,QAAQ3kB,MAAR,GAAiB,CAAjB,IAAsB0tE,iBAA3B,EAA+C;;AAE9C,SAAM,IAAIrsE,IAAI,CAAR,EAAWooB,KAAK9E,QAAQ3kB,MAA9B,EAAsCqB,IAAIooB,EAA1C,EAA8CpoB,GAA9C,EAAqD;;AAEpDysE,cAASnpD,QAAStjB,CAAT,CAAT;AACA0iD,WAAMgkB,UAAN,CAAkBzI,IAAI4I,UAAtB,EAAkC7mE,CAAlC,EAAqCssE,QAArC,EAA+CA,QAA/C,EAAyDC,MAAzD,EAAiEE,MAAjE;AAEA;;AAEDhmD,YAAQ/C,eAAR,GAA0B,KAA1B;AACA6mD,sBAAkBC,aAAlB,GAAkClnD,QAAQ3kB,MAAR,GAAiB,CAAnD;AAEA,IAZD,MAYO;;AAEN+jD,UAAMgkB,UAAN,CAAkBzI,IAAI4I,UAAtB,EAAkC,CAAlC,EAAqCyF,QAArC,EAA+CA,QAA/C,EAAyDC,MAAzD,EAAiE5pD,KAAjE;AACA4nD,sBAAkBC,aAAlB,GAAkC,CAAlC;AAEA;AAED;;AAED,MAAKH,4BAA6B5jD,OAA7B,EAAsC4lD,iBAAtC,CAAL,EAAiE;;AAEhE/B,kBAAgBrM,IAAI4I,UAApB,EAAgCpgD,OAAhC,EAAyC9D,MAAMiC,KAA/C,EAAsDjC,MAAMkC,MAA5D;AAEA;;AAED0lD,oBAAkBsB,SAAlB,GAA8BplD,QAAQ3C,OAAtC;;AAEA,MAAK2C,QAAQ1C,QAAb,EAAwB0C,QAAQ1C,QAAR,CAAkB0C,OAAlB;AAExB;;AAED;;AAEA;AACA,UAASinD,uBAAT,CAAkCC,WAAlC,EAA+C3C,YAA/C,EAA6D4C,UAA7D,EAAyEC,aAAzE,EAAyF;;AAExF,MAAIvB,WAAW3K,MAAMyG,OAAN,CAAe4C,aAAavkD,OAAb,CAAqBxD,MAApC,CAAf;AACA,MAAIspD,SAAS5K,MAAMyG,OAAN,CAAe4C,aAAavkD,OAAb,CAAqBvnB,IAApC,CAAb;AACAwjD,QAAMgkB,UAAN,CAAkBmH,aAAlB,EAAiC,CAAjC,EAAoCvB,QAApC,EAA8CtB,aAAapmD,KAA3D,EAAkEomD,aAAanmD,MAA/E,EAAuF,CAAvF,EAA0FynD,QAA1F,EAAoGC,MAApG,EAA4G,IAA5G;AACAtO,MAAI6P,eAAJ,CAAqB7P,IAAI8P,WAAzB,EAAsCJ,WAAtC;AACA1P,MAAI+P,oBAAJ,CAA0B/P,IAAI8P,WAA9B,EAA2CH,UAA3C,EAAuDC,aAAvD,EAAsEvwC,WAAWp/B,GAAX,CAAgB8sE,aAAavkD,OAA7B,EAAuC4kD,cAA7G,EAA6H,CAA7H;AACApN,MAAI6P,eAAJ,CAAqB7P,IAAI8P,WAAzB,EAAsC,IAAtC;AAEA;;AAED;AACA,UAASE,wBAAT,CAAmCC,YAAnC,EAAiDlD,YAAjD,EAAgE;;AAE/D/M,MAAIkQ,gBAAJ,CAAsBlQ,IAAImQ,YAA1B,EAAwCF,YAAxC;;AAEA,MAAKlD,aAAatkD,WAAb,IAA4B,CAAEskD,aAAarkD,aAAhD,EAAgE;;AAE/Ds3C,OAAIoQ,mBAAJ,CAAyBpQ,IAAImQ,YAA7B,EAA2CnQ,IAAIuP,iBAA/C,EAAkExC,aAAapmD,KAA/E,EAAsFomD,aAAanmD,MAAnG;AACAo5C,OAAIqQ,uBAAJ,CAA6BrQ,IAAI8P,WAAjC,EAA8C9P,IAAIsQ,gBAAlD,EAAoEtQ,IAAImQ,YAAxE,EAAsFF,YAAtF;AAEA,GALD,MAKO,IAAKlD,aAAatkD,WAAb,IAA4BskD,aAAarkD,aAA9C,EAA8D;;AAEpEs3C,OAAIoQ,mBAAJ,CAAyBpQ,IAAImQ,YAA7B,EAA2CnQ,IAAIwP,aAA/C,EAA8DzC,aAAapmD,KAA3E,EAAkFomD,aAAanmD,MAA/F;AACAo5C,OAAIqQ,uBAAJ,CAA6BrQ,IAAI8P,WAAjC,EAA8C9P,IAAIuQ,wBAAlD,EAA4EvQ,IAAImQ,YAAhF,EAA8FF,YAA9F;AAEA,GALM,MAKA;;AAEN;AACAjQ,OAAIoQ,mBAAJ,CAAyBpQ,IAAImQ,YAA7B,EAA2CnQ,IAAIwQ,KAA/C,EAAsDzD,aAAapmD,KAAnE,EAA0EomD,aAAanmD,MAAvF;AAEA;;AAEDo5C,MAAIkQ,gBAAJ,CAAsBlQ,IAAImQ,YAA1B,EAAwC,IAAxC;AAEA;;AAED;AACA,UAASM,iBAAT,CAA4Bf,WAA5B,EAAyC3C,YAAzC,EAAwD;;AAEvD,MAAI2D,SAAW3D,gBAAgBA,aAAa9jD,uBAA5C;AACA,MAAKynD,MAAL,EAAc,MAAM,IAAIriE,KAAJ,CAAW,yDAAX,CAAN;;AAEd2xD,MAAI6P,eAAJ,CAAqB7P,IAAI8P,WAAzB,EAAsCJ,WAAtC;;AAEA,MAAK,EAAI3C,aAAapkD,YAAb,IAA6BokD,aAAapkD,YAAb,CAA0BwmD,cAA3D,CAAL,EAAmF;;AAElF,SAAM,IAAI9gE,KAAJ,CAAW,qEAAX,CAAN;AAEA;;AAED;AACA,MAAK,CAAEgxB,WAAWp/B,GAAX,CAAgB8sE,aAAapkD,YAA7B,EAA4CykD,cAA9C,IACHL,aAAapkD,YAAb,CAA0BjE,KAA1B,CAAgCiC,KAAhC,KAA0ComD,aAAapmD,KADpD,IAEHomD,aAAapkD,YAAb,CAA0BjE,KAA1B,CAAgCkC,MAAhC,KAA2CmmD,aAAanmD,MAF1D,EAEmE;;AAElEmmD,gBAAapkD,YAAb,CAA0BjE,KAA1B,CAAgCiC,KAAhC,GAAwComD,aAAapmD,KAArD;AACAomD,gBAAapkD,YAAb,CAA0BjE,KAA1B,CAAgCkC,MAAhC,GAAyCmmD,aAAanmD,MAAtD;AACAmmD,gBAAapkD,YAAb,CAA0B8tB,WAA1B,GAAwC,IAAxC;AAEA;;AAED0Y,eAAc4d,aAAapkD,YAA3B,EAAyC,CAAzC;;AAEA,MAAIgoD,oBAAoBtxC,WAAWp/B,GAAX,CAAgB8sE,aAAapkD,YAA7B,EAA4CykD,cAApE;;AAEA,MAAKL,aAAapkD,YAAb,CAA0B3D,MAA1B,KAAqChd,WAA1C,EAAwD;;AAEvDg4D,OAAI+P,oBAAJ,CAA0B/P,IAAI8P,WAA9B,EAA2C9P,IAAIsQ,gBAA/C,EAAiEtQ,IAAI4I,UAArE,EAAiF+H,iBAAjF,EAAoG,CAApG;AAEA,GAJD,MAIO,IAAK5D,aAAapkD,YAAb,CAA0B3D,MAA1B,KAAqC/c,kBAA1C,EAA+D;;AAErE+3D,OAAI+P,oBAAJ,CAA0B/P,IAAI8P,WAA9B,EAA2C9P,IAAIuQ,wBAA/C,EAAyEvQ,IAAI4I,UAA7E,EAAyF+H,iBAAzF,EAA4G,CAA5G;AAEA,GAJM,MAIA;;AAEN,SAAM,IAAItiE,KAAJ,CAAW,6BAAX,CAAN;AAEA;AAED;;AAED;AACA,UAASuiE,sBAAT,CAAiC7D,YAAjC,EAAgD;;AAE/C,MAAIM,yBAAyBhuC,WAAWp/B,GAAX,CAAgB8sE,YAAhB,CAA7B;;AAEA,MAAI2D,SAAW3D,aAAa9jD,uBAAb,KAAyC,IAAxD;;AAEA,MAAK8jD,aAAapkD,YAAlB,EAAiC;;AAEhC,OAAK+nD,MAAL,EAAc,MAAM,IAAIriE,KAAJ,CAAW,0DAAX,CAAN;;AAEdoiE,qBAAmBpD,uBAAuBE,kBAA1C,EAA8DR,YAA9D;AAEA,GAND,MAMO;;AAEN,OAAK2D,MAAL,EAAc;;AAEbrD,2BAAuBG,kBAAvB,GAA4C,EAA5C;;AAEA,SAAM,IAAIzrE,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9Bi+D,SAAI6P,eAAJ,CAAqB7P,IAAI8P,WAAzB,EAAsCzC,uBAAuBE,kBAAvB,CAA2CxrE,CAA3C,CAAtC;AACAsrE,4BAAuBG,kBAAvB,CAA2CzrE,CAA3C,IAAiDi+D,IAAI6Q,kBAAJ,EAAjD;AACAb,8BAA0B3C,uBAAuBG,kBAAvB,CAA2CzrE,CAA3C,CAA1B,EAA0EgrE,YAA1E;AAEA;AAED,IAZD,MAYO;;AAEN/M,QAAI6P,eAAJ,CAAqB7P,IAAI8P,WAAzB,EAAsCzC,uBAAuBE,kBAA7D;AACAF,2BAAuBG,kBAAvB,GAA4CxN,IAAI6Q,kBAAJ,EAA5C;AACAb,6BAA0B3C,uBAAuBG,kBAAjD,EAAqET,YAArE;AAEA;AAED;;AAED/M,MAAI6P,eAAJ,CAAqB7P,IAAI8P,WAAzB,EAAsC,IAAtC;AAEA;;AAED;AACA,UAASgB,iBAAT,CAA4B/D,YAA5B,EAA2C;;AAE1C,MAAIM,yBAAyBhuC,WAAWp/B,GAAX,CAAgB8sE,YAAhB,CAA7B;AACA,MAAIT,oBAAoBjtC,WAAWp/B,GAAX,CAAgB8sE,aAAavkD,OAA7B,CAAxB;;AAEAukD,eAAa/rE,gBAAb,CAA+B,SAA/B,EAA0C8rE,qBAA1C;;AAEAR,oBAAkBc,cAAlB,GAAmCpN,IAAImI,aAAJ,EAAnC;;AAEAjiB,OAAKuE,MAAL,CAAYpkC,QAAZ;;AAEA,MAAIqqD,SAAW3D,aAAa9jD,uBAAb,KAAyC,IAAxD;AACA,MAAI8nD,qBAAqBzjE,aAAcy/D,YAAd,CAAzB;;AAEA;;AAEA,MAAK2D,MAAL,EAAc;;AAEbrD,0BAAuBE,kBAAvB,GAA4C,EAA5C;;AAEA,QAAM,IAAIxrE,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9BsrE,2BAAuBE,kBAAvB,CAA2CxrE,CAA3C,IAAiDi+D,IAAIgR,iBAAJ,EAAjD;AAEA;AAED,GAVD,MAUO;;AAEN3D,0BAAuBE,kBAAvB,GAA4CvN,IAAIgR,iBAAJ,EAA5C;AAEA;;AAED;;AAEA,MAAKN,MAAL,EAAc;;AAEbjsB,SAAM2jB,WAAN,CAAmBpI,IAAI6I,gBAAvB,EAAyCyD,kBAAkBc,cAA3D;AACAmB,wBAAsBvO,IAAI6I,gBAA1B,EAA4CkE,aAAavkD,OAAzD,EAAkEuoD,kBAAlE;;AAEA,QAAM,IAAIhvE,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B0tE,4BAAyBpC,uBAAuBE,kBAAvB,CAA2CxrE,CAA3C,CAAzB,EAAyEgrE,YAAzE,EAAuF/M,IAAIiR,iBAA3F,EAA8GjR,IAAI8I,2BAAJ,GAAkC/mE,CAAhJ;AAEA;;AAED,OAAKqqE,4BAA6BW,aAAavkD,OAA1C,EAAmDuoD,kBAAnD,CAAL,EAA+E;;AAE9E1E,mBAAgBrM,IAAI6I,gBAApB,EAAsCkE,aAAavkD,OAAnD,EAA4DukD,aAAapmD,KAAzE,EAAgFomD,aAAanmD,MAA7F;AAEA;;AAED69B,SAAM2jB,WAAN,CAAmBpI,IAAI6I,gBAAvB,EAAyC,IAAzC;AAEA,GAnBD,MAmBO;;AAENpkB,SAAM2jB,WAAN,CAAmBpI,IAAI4I,UAAvB,EAAmC0D,kBAAkBc,cAArD;AACAmB,wBAAsBvO,IAAI4I,UAA1B,EAAsCmE,aAAavkD,OAAnD,EAA4DuoD,kBAA5D;AACAtB,2BAAyBpC,uBAAuBE,kBAAhD,EAAoER,YAApE,EAAkF/M,IAAIiR,iBAAtF,EAAyGjR,IAAI4I,UAA7G;;AAEA,OAAKwD,4BAA6BW,aAAavkD,OAA1C,EAAmDuoD,kBAAnD,CAAL,EAA+E;;AAE9E1E,mBAAgBrM,IAAI4I,UAApB,EAAgCmE,aAAavkD,OAA7C,EAAsDukD,aAAapmD,KAAnE,EAA0EomD,aAAanmD,MAAvF;AAEA;;AAED69B,SAAM2jB,WAAN,CAAmBpI,IAAI4I,UAAvB,EAAmC,IAAnC;AAEA;;AAED;;AAEA,MAAKmE,aAAatkD,WAAlB,EAAgC;;AAE/BmoD,0BAAwB7D,YAAxB;AAEA;AAED;;AAED,UAASmE,wBAAT,CAAmCnE,YAAnC,EAAkD;;AAEjD,MAAIvkD,UAAUukD,aAAavkD,OAA3B;AACA,MAAIuoD,qBAAqBzjE,aAAcy/D,YAAd,CAAzB;;AAEA,MAAKX,4BAA6B5jD,OAA7B,EAAsCuoD,kBAAtC,CAAL,EAAkE;;AAEjE,OAAI1wE,SAAS0sE,aAAa9jD,uBAAb,GAAuC+2C,IAAI6I,gBAA3C,GAA8D7I,IAAI4I,UAA/E;AACA,OAAIyC,eAAehsC,WAAWp/B,GAAX,CAAgBuoB,OAAhB,EAA0B4kD,cAA7C;;AAEA3oB,SAAM2jB,WAAN,CAAmB/nE,MAAnB,EAA2BgrE,YAA3B;AACAgB,kBAAgBhsE,MAAhB,EAAwBmoB,OAAxB,EAAiCukD,aAAapmD,KAA9C,EAAqDomD,aAAanmD,MAAlE;AACA69B,SAAM2jB,WAAN,CAAmB/nE,MAAnB,EAA2B,IAA3B;AAEA;AAED;;AAED,UAASstE,kBAAT,CAA6BnlD,OAA7B,EAAuC;;AAEtC,MAAI2gB,KAAK3gB,QAAQ2gB,EAAjB;AACA,MAAItG,QAAQqjB,KAAKlB,MAAL,CAAYniB,KAAxB;;AAEA;;AAEA,MAAK+oC,eAAgBziC,EAAhB,MAAyBtG,KAA9B,EAAsC;;AAErC+oC,kBAAgBziC,EAAhB,IAAuBtG,KAAvB;AACAra,WAAQjK,MAAR;AAEA;AAED;;AAED,MAAK4wC,YAAL,GAAoBA,YAApB;AACA,MAAKE,cAAL,GAAsBA,cAAtB;AACA,MAAKof,qBAAL,GAA6BA,qBAA7B;AACA,MAAKqC,iBAAL,GAAyBA,iBAAzB;AACA,MAAKI,wBAAL,GAAgCA,wBAAhC;AAEA;;AAED;;;;AAIA,SAASC,UAAT,CAAqBhuC,EAArB,EAAyB0Z,UAAzB,EAAsC;;AAErC,UAASstB,OAAT,CAAkBvtD,CAAlB,EAAsB;;AAErB,MAAI2pC,SAAJ;;AAEA,MAAK3pC,MAAMvW,cAAX,EAA4B,OAAO88B,GAAGiuC,MAAV;AAC5B,MAAKx0D,MAAMtW,mBAAX,EAAiC,OAAO68B,GAAG0rC,aAAV;AACjC,MAAKjyD,MAAMrW,sBAAX,EAAoC,OAAO48B,GAAGkuC,eAAV;;AAEpC,MAAKz0D,MAAMpW,aAAX,EAA2B,OAAO28B,GAAGolC,OAAV;AAC3B,MAAK3rD,MAAMnW,0BAAX,EAAwC,OAAO08B,GAAGmuC,sBAAV;AACxC,MAAK10D,MAAMlW,yBAAX,EAAuC,OAAOy8B,GAAGouC,qBAAV;;AAEvC,MAAK30D,MAAMjW,YAAX,EAA0B,OAAOw8B,GAAGupC,MAAV;AAC1B,MAAK9vD,MAAMhW,yBAAX,EAAuC,OAAOu8B,GAAGquC,qBAAV;AACvC,MAAK50D,MAAM/V,wBAAX,EAAsC,OAAOs8B,GAAGsuC,oBAAV;;AAEtC,MAAK70D,MAAM9V,gBAAX,EAA8B,OAAOq8B,GAAG2B,aAAV;AAC9B,MAAKloB,MAAMtV,qBAAX,EAAmC,OAAO67B,GAAGuuC,sBAAV;AACnC,MAAK90D,MAAMrV,qBAAX,EAAmC,OAAO47B,GAAGwuC,sBAAV;AACnC,MAAK/0D,MAAMpV,oBAAX,EAAkC,OAAO27B,GAAGyuC,oBAAV;;AAElC,MAAKh1D,MAAM7V,QAAX,EAAsB,OAAOo8B,GAAGyB,IAAV;AACtB,MAAKhoB,MAAM5V,SAAX,EAAuB,OAAOm8B,GAAGmB,KAAV;AACvB,MAAK1nB,MAAM3V,iBAAX,EAA+B,OAAOk8B,GAAGiB,cAAV;AAC/B,MAAKxnB,MAAM1V,OAAX,EAAqB,OAAOi8B,GAAGuB,GAAV;AACrB,MAAK9nB,MAAMzV,eAAX,EAA6B,OAAOg8B,GAAGqB,YAAV;AAC7B,MAAK5nB,MAAMxV,SAAX,EAAuB,OAAO+7B,GAAGa,KAAV;;AAEvB,MAAKpnB,MAAMvV,aAAX,EAA2B;;AAE1Bk/C,eAAY1J,WAAW58C,GAAX,CAAgB,wBAAhB,CAAZ;;AAEA,OAAKsmD,cAAc,IAAnB,EAA0B,OAAOA,UAAUsrB,cAAjB;AAE1B;;AAED,MAAKj1D,MAAMlV,WAAX,EAAyB,OAAOy7B,GAAG2uC,KAAV;AACzB,MAAKl1D,MAAMjV,SAAX,EAAuB,OAAOw7B,GAAG4uC,GAAV;AACvB,MAAKn1D,MAAMhV,UAAX,EAAwB,OAAOu7B,GAAGulC,IAAV;AACxB,MAAK9rD,MAAM/U,eAAX,EAA6B,OAAOs7B,GAAG6uC,SAAV;AAC7B,MAAKp1D,MAAM9U,oBAAX,EAAkC,OAAOq7B,GAAG8uC,eAAV;AAClC,MAAKr1D,MAAM5U,WAAX,EAAyB,OAAOm7B,GAAGksC,eAAV;AACzB,MAAKzyD,MAAM3U,kBAAX,EAAgC,OAAOk7B,GAAGqsC,aAAV;;AAEhC,MAAK5yD,MAAM/Y,WAAX,EAAyB,OAAOs/B,GAAGumC,QAAV;AACzB,MAAK9sD,MAAM9Y,gBAAX,EAA8B,OAAOq/B,GAAG+uC,aAAV;AAC9B,MAAKt1D,MAAM7Y,uBAAX,EAAqC,OAAOo/B,GAAGgvC,qBAAV;;AAErC,MAAKv1D,MAAM1Y,UAAX,EAAwB,OAAOi/B,GAAG4mC,IAAV;AACxB,MAAKntD,MAAMzY,SAAX,EAAuB,OAAOg/B,GAAGymC,GAAV;AACvB,MAAKhtD,MAAMxY,cAAX,EAA4B,OAAO++B,GAAG+mC,SAAV;AAC5B,MAAKttD,MAAMvY,sBAAX,EAAoC,OAAO8+B,GAAG6mC,mBAAV;AACpC,MAAKptD,MAAMtY,cAAX,EAA4B,OAAO6+B,GAAG2mC,SAAV;AAC5B,MAAKltD,MAAMrY,sBAAX,EAAoC,OAAO4+B,GAAG8mC,mBAAV;AACpC,MAAKrtD,MAAMpY,cAAX,EAA4B,OAAO2+B,GAAGivC,SAAV;AAC5B,MAAKx1D,MAAMnY,sBAAX,EAAoC,OAAO0+B,GAAGkvC,mBAAV;;AAEpC,MAAKz1D,MAAMlY,cAAX,EAA4B,OAAOy+B,GAAGmvC,SAAV;AAC5B,MAAK11D,MAAMjY,sBAAX,EAAoC,OAAOw+B,GAAGovC,mBAAV;AACpC,MAAK31D,MAAMhY,sBAAX,EAAoC,OAAOu+B,GAAGqvC,kBAAV;;AAEpC,MAAK51D,MAAM1U,oBAAN,IAA8B0U,MAAMzU,qBAApC,IACJyU,MAAMxU,qBADF,IAC2BwU,MAAMvU,qBADtC,EAC8D;;AAE7Dk+C,eAAY1J,WAAW58C,GAAX,CAAgB,+BAAhB,CAAZ;;AAEA,OAAKsmD,cAAc,IAAnB,EAA0B;;AAEzB,QAAK3pC,MAAM1U,oBAAX,EAAkC,OAAOq+C,UAAUksB,4BAAjB;AAClC,QAAK71D,MAAMzU,qBAAX,EAAmC,OAAOo+C,UAAUmsB,6BAAjB;AACnC,QAAK91D,MAAMxU,qBAAX,EAAmC,OAAOm+C,UAAUosB,6BAAjB;AACnC,QAAK/1D,MAAMvU,qBAAX,EAAmC,OAAOk+C,UAAUqsB,6BAAjB;AAEnC;AAED;;AAED,MAAKh2D,MAAMtU,uBAAN,IAAiCsU,MAAMrU,uBAAvC,IACJqU,MAAMpU,wBADF,IAC8BoU,MAAMnU,wBADzC,EACoE;;AAEnE89C,eAAY1J,WAAW58C,GAAX,CAAgB,gCAAhB,CAAZ;;AAEA,OAAKsmD,cAAc,IAAnB,EAA0B;;AAEzB,QAAK3pC,MAAMtU,uBAAX,EAAqC,OAAOi+C,UAAUssB,+BAAjB;AACrC,QAAKj2D,MAAMrU,uBAAX,EAAqC,OAAOg+C,UAAUusB,+BAAjB;AACrC,QAAKl2D,MAAMpU,wBAAX,EAAsC,OAAO+9C,UAAUwsB,gCAAjB;AACtC,QAAKn2D,MAAMnU,wBAAX,EAAsC,OAAO89C,UAAUysB,gCAAjB;AAEtC;AAED;;AAED,MAAKp2D,MAAMlU,eAAX,EAA6B;;AAE5B69C,eAAY1J,WAAW58C,GAAX,CAAgB,+BAAhB,CAAZ;;AAEA,OAAKsmD,cAAc,IAAnB,EAA0B,OAAOA,UAAU0sB,yBAAjB;AAE1B;;AAED,MAAKr2D,MAAMjU,oBAAN,IAA8BiU,MAAMhU,oBAApC,IAA4DgU,MAAM/T,oBAAlE,IACJ+T,MAAM9T,oBADF,IAC0B8T,MAAM7T,oBADhC,IACwD6T,MAAM5T,oBAD9D,IAEJ4T,MAAM3T,oBAFF,IAE0B2T,MAAM1T,oBAFhC,IAEwD0T,MAAMzT,qBAF9D,IAGJyT,MAAMxT,qBAHF,IAG2BwT,MAAMvT,qBAHjC,IAG0DuT,MAAMtT,sBAHhE,IAIJsT,MAAMrT,sBAJF,IAI4BqT,MAAMpT,sBAJvC,EAIgE;;AAE/D+8C,eAAY1J,WAAW58C,GAAX,CAAgB,+BAAhB,CAAZ;;AAEA,OAAKsmD,cAAc,IAAnB,EAA0B;;AAEzB,WAAO3pC,CAAP;AAEA;AAED;;AAED,MAAKA,MAAM5Y,WAAN,IAAqB4Y,MAAM3Y,WAAhC,EAA8C;;AAE7CsiD,eAAY1J,WAAW58C,GAAX,CAAgB,kBAAhB,CAAZ;;AAEA,OAAKsmD,cAAc,IAAnB,EAA0B;;AAEzB,QAAK3pC,MAAM5Y,WAAX,EAAyB,OAAOuiD,UAAU2sB,OAAjB;AACzB,QAAKt2D,MAAM3Y,WAAX,EAAyB,OAAOsiD,UAAU4sB,OAAjB;AAEzB;AAED;;AAED,MAAKv2D,MAAMnV,kBAAX,EAAgC;;AAE/B8+C,eAAY1J,WAAW58C,GAAX,CAAgB,qBAAhB,CAAZ;;AAEA,OAAKsmD,cAAc,IAAnB,EAA0B,OAAOA,UAAU6sB,uBAAjB;AAE1B;;AAED,SAAO,CAAP;AAEA;;AAED,QAAO,EAAEjJ,SAASA,OAAX,EAAP;AAEA;;AAED;;;;;;;AAOA,SAASkJ,iBAAT,CAA4BC,GAA5B,EAAiCC,MAAjC,EAAyC/2D,IAAzC,EAA+CC,GAA/C,EAAqD;;AAEpDwuB,QAAOnqC,IAAP,CAAa,IAAb;;AAEA,MAAKG,IAAL,GAAY,mBAAZ;;AAEA,MAAKqyE,GAAL,GAAWA,QAAQl0E,SAAR,GAAoBk0E,GAApB,GAA0B,EAArC;AACA,MAAKloC,IAAL,GAAY,CAAZ;;AAEA,MAAK5uB,IAAL,GAAYA,SAASpd,SAAT,GAAqBod,IAArB,GAA4B,GAAxC;AACA,MAAKC,GAAL,GAAWA,QAAQrd,SAAR,GAAoBqd,GAApB,GAA0B,IAArC;AACA,MAAK+2D,KAAL,GAAa,EAAb;;AAEA,MAAKD,MAAL,GAAcA,WAAWn0E,SAAX,GAAuBm0E,MAAvB,GAAgC,CAA9C;AACA,MAAKloC,IAAL,GAAY,IAAZ;;AAEA,MAAKooC,SAAL,GAAiB,EAAjB,CAhBoD,CAgB/B;AACrB,MAAKC,UAAL,GAAkB,CAAlB,CAjBoD,CAiB/B;;AAErB,MAAKpoC,sBAAL;AAEA;;AAED+nC,kBAAkBvzE,SAAlB,GAA8BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAeklB,OAAOnrC,SAAtB,CAAf,EAAkD;;AAE/E0O,cAAa6kE,iBAFkE;;AAI/EM,sBAAqB,IAJ0D;;AAM/EllE,OAAM,UAAW9N,MAAX,EAAmBoqC,SAAnB,EAA+B;;AAEpCE,SAAOnrC,SAAP,CAAiB2O,IAAjB,CAAsB3N,IAAtB,CAA4B,IAA5B,EAAkCH,MAAlC,EAA0CoqC,SAA1C;;AAEA,OAAKuoC,GAAL,GAAW3yE,OAAO2yE,GAAlB;AACA,OAAKloC,IAAL,GAAYzqC,OAAOyqC,IAAnB;;AAEA,OAAK5uB,IAAL,GAAY7b,OAAO6b,IAAnB;AACA,OAAKC,GAAL,GAAW9b,OAAO8b,GAAlB;AACA,OAAK+2D,KAAL,GAAa7yE,OAAO6yE,KAApB;;AAEA,OAAKD,MAAL,GAAc5yE,OAAO4yE,MAArB;AACA,OAAKloC,IAAL,GAAY1qC,OAAO0qC,IAAP,KAAgB,IAAhB,GAAuB,IAAvB,GAA8BtrC,OAAOK,MAAP,CAAe,EAAf,EAAmBO,OAAO0qC,IAA1B,CAA1C;;AAEA,OAAKooC,SAAL,GAAiB9yE,OAAO8yE,SAAxB;AACA,OAAKC,UAAL,GAAkB/yE,OAAO+yE,UAAzB;;AAEA,SAAO,IAAP;AAEA,EAzB8E;;AA2B/E;;;;;;;;AAQAE,iBAAgB,UAAWC,WAAX,EAAyB;;AAExC;AACA,MAAIC,eAAe,MAAM,KAAKC,aAAL,EAAN,GAA6BF,WAAhD;;AAEA,OAAKP,GAAL,GAAWvoE,MAAMG,OAAN,GAAgB,CAAhB,GAAoB7L,KAAK20E,IAAL,CAAWF,YAAX,CAA/B;AACA,OAAKxoC,sBAAL;AAEA,EA3C8E;;AA6C/E;;;AAGA2oC,iBAAgB,YAAY;;AAE3B,MAAIH,eAAez0E,KAAK60E,GAAL,CAAUnpE,MAAMC,OAAN,GAAgB,GAAhB,GAAsB,KAAKsoE,GAArC,CAAnB;;AAEA,SAAO,MAAM,KAAKS,aAAL,EAAN,GAA6BD,YAApC;AAEA,EAtD8E;;AAwD/EK,kBAAiB,YAAY;;AAE5B,SAAOppE,MAAMG,OAAN,GAAgB,CAAhB,GAAoB7L,KAAK20E,IAAL,CAC1B30E,KAAK60E,GAAL,CAAUnpE,MAAMC,OAAN,GAAgB,GAAhB,GAAsB,KAAKsoE,GAArC,IAA6C,KAAKloC,IADxB,CAA3B;AAGA,EA7D8E;;AA+D/EgpC,eAAc,YAAY;;AAEzB;AACA,SAAO,KAAKX,SAAL,GAAiBp0E,KAAKwM,GAAL,CAAU,KAAK0nE,MAAf,EAAuB,CAAvB,CAAxB;AAEA,EApE8E;;AAsE/EQ,gBAAe,YAAY;;AAE1B;AACA,SAAO,KAAKN,SAAL,GAAiBp0E,KAAKyM,GAAL,CAAU,KAAKynE,MAAf,EAAuB,CAAvB,CAAxB;AAEA,EA3E8E;;AA6E/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA/nC,gBAAe,UAAWC,SAAX,EAAsBC,UAAtB,EAAkC9rC,CAAlC,EAAqC4M,CAArC,EAAwCma,KAAxC,EAA+CC,MAA/C,EAAwD;;AAEtE,OAAK2sD,MAAL,GAAc9nC,YAAYC,UAA1B;;AAEA,MAAK,KAAKL,IAAL,KAAc,IAAnB,EAA0B;;AAEzB,QAAKA,IAAL,GAAY;AACXM,aAAS,IADE;AAEXF,eAAW,CAFA;AAGXC,gBAAY,CAHD;AAIXE,aAAS,CAJE;AAKXC,aAAS,CALE;AAMXllB,WAAO,CANI;AAOXC,YAAQ;AAPG,IAAZ;AAUA;;AAED,OAAKykB,IAAL,CAAUM,OAAV,GAAoB,IAApB;AACA,OAAKN,IAAL,CAAUI,SAAV,GAAsBA,SAAtB;AACA,OAAKJ,IAAL,CAAUK,UAAV,GAAuBA,UAAvB;AACA,OAAKL,IAAL,CAAUO,OAAV,GAAoBhsC,CAApB;AACA,OAAKyrC,IAAL,CAAUQ,OAAV,GAAoBr/B,CAApB;AACA,OAAK6+B,IAAL,CAAU1kB,KAAV,GAAkBA,KAAlB;AACA,OAAK0kB,IAAL,CAAUzkB,MAAV,GAAmBA,MAAnB;;AAEA,OAAK0kB,sBAAL;AAEA,EA5I8E;;AA8I/EQ,kBAAiB,YAAY;;AAE5B,MAAK,KAAKT,IAAL,KAAc,IAAnB,EAA0B;;AAEzB,QAAKA,IAAL,CAAUM,OAAV,GAAoB,KAApB;AAEA;;AAED,OAAKL,sBAAL;AAEA,EAxJ8E;;AA0J/EA,yBAAwB,YAAY;;AAEnC,MAAI9uB,OAAO,KAAKA,IAAhB;AAAA,MACCF,MAAME,OAAOnd,KAAK60E,GAAL,CACZnpE,MAAMC,OAAN,GAAgB,GAAhB,GAAsB,KAAKsoE,GADf,CAAP,GAC8B,KAAKloC,IAF1C;AAAA,MAGCxkB,SAAS,IAAItK,GAHd;AAAA,MAICqK,QAAQ,KAAK4sD,MAAL,GAAc3sD,MAJvB;AAAA,MAKCxK,OAAO,CAAE,GAAF,GAAQuK,KALhB;AAAA,MAMC0kB,OAAO,KAAKA,IANb;;AAQA,MAAK,KAAKA,IAAL,KAAc,IAAd,IAAsB,KAAKA,IAAL,CAAUM,OAArC,EAA+C;;AAE9C,OAAIF,YAAYJ,KAAKI,SAArB;AAAA,OACCC,aAAaL,KAAKK,UADnB;;AAGAtvB,WAAQivB,KAAKO,OAAL,GAAejlB,KAAf,GAAuB8kB,SAA/B;AACAnvB,UAAO+uB,KAAKQ,OAAL,GAAejlB,MAAf,GAAwB8kB,UAA/B;AACA/kB,YAAS0kB,KAAK1kB,KAAL,GAAa8kB,SAAtB;AACA7kB,aAAUykB,KAAKzkB,MAAL,GAAc8kB,UAAxB;AAEA;;AAED,MAAI2oC,OAAO,KAAKX,UAAhB;AACA,MAAKW,SAAS,CAAd,EAAkBj4D,QAAQI,OAAO63D,IAAP,GAAc,KAAKD,YAAL,EAAtB;;AAElB,OAAKnyD,gBAAL,CAAsB9F,eAAtB,CAAuCC,IAAvC,EAA6CA,OAAOuK,KAApD,EAA2DrK,GAA3D,EAAgEA,MAAMsK,MAAtE,EAA8EpK,IAA9E,EAAoF,KAAKC,GAAzF;AAEA,EArL8E;;AAuL/EyJ,SAAQ,UAAWC,IAAX,EAAkB;;AAEzB,MAAIgD,OAAO0d,SAAS/mC,SAAT,CAAmBomB,MAAnB,CAA0BplB,IAA1B,CAAgC,IAAhC,EAAsCqlB,IAAtC,CAAX;;AAEAgD,OAAKsB,MAAL,CAAY6oD,GAAZ,GAAkB,KAAKA,GAAvB;AACAnqD,OAAKsB,MAAL,CAAY2gB,IAAZ,GAAmB,KAAKA,IAAxB;;AAEAjiB,OAAKsB,MAAL,CAAYjO,IAAZ,GAAmB,KAAKA,IAAxB;AACA2M,OAAKsB,MAAL,CAAYhO,GAAZ,GAAkB,KAAKA,GAAvB;AACA0M,OAAKsB,MAAL,CAAY+oD,KAAZ,GAAoB,KAAKA,KAAzB;;AAEArqD,OAAKsB,MAAL,CAAY8oD,MAAZ,GAAqB,KAAKA,MAA1B;;AAEA,MAAK,KAAKloC,IAAL,KAAc,IAAnB,EAA0BliB,KAAKsB,MAAL,CAAY4gB,IAAZ,GAAmBtrC,OAAOK,MAAP,CAAe,EAAf,EAAmB,KAAKirC,IAAxB,CAAnB;;AAE1BliB,OAAKsB,MAAL,CAAYgpD,SAAZ,GAAwB,KAAKA,SAA7B;AACAtqD,OAAKsB,MAAL,CAAYipD,UAAZ,GAAyB,KAAKA,UAA9B;;AAEA,SAAOvqD,IAAP;AAEA;;AA3M8E,CAAlD,CAA9B;;AA+MA;;;;AAIA,SAASmrD,WAAT,CAAsBzyE,KAAtB,EAA8B;;AAE7BwxE,mBAAkBvyE,IAAlB,CAAwB,IAAxB;;AAEA,MAAKyzE,OAAL,GAAe1yE,SAAS,EAAxB;AAEA;;AAEDyyE,YAAYx0E,SAAZ,GAAwBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAestD,kBAAkBvzE,SAAjC,CAAf,EAA6D;;AAEpF0O,cAAa8lE,WAFuE;;AAIpFE,gBAAe;;AAJqE,CAA7D,CAAxB;;AAQA;;;;AAIA,SAASC,YAAT,CAAuBjwB,QAAvB,EAAkC;;AAEjC,KAAIt5B,QAAQ,IAAZ;;AAEA,KAAIwpD,SAAS,IAAb;AACA,KAAIC,YAAY,IAAhB;;AAEA,KAAIC,aAAa,IAAjB;;AAEA,KAAIC,iBAAiB,IAAIxiE,OAAJ,EAArB;AACA,KAAIyiE,wBAAwB,IAAIziE,OAAJ,EAA5B;;AAEA,KAAK,OAAO0iE,MAAP,KAAkB,WAAlB,IAAiC,iBAAiBA,MAAvD,EAAgE;;AAE/DJ,cAAY,IAAII,OAAOC,WAAX,EAAZ;AACAD,SAAO/zE,gBAAP,CAAyB,wBAAzB,EAAmDi0E,wBAAnD,EAA6E,KAA7E;AAEA;;AAED,KAAI/pC,qBAAqB,IAAI74B,OAAJ,EAAzB;AACA,KAAI6iE,iBAAiB,IAAIr4D,UAAJ,EAArB;AACA,KAAIs4D,eAAe,IAAI/gE,OAAJ,EAAnB;;AAEA,KAAIghE,UAAU,IAAI/B,iBAAJ,EAAd;AACA+B,SAAQC,MAAR,GAAiB,IAAI1tD,OAAJ,CAAa,GAAb,EAAkB,GAAlB,EAAuB,GAAvB,EAA4B,GAA5B,CAAjB;AACAytD,SAAQzuC,MAAR,CAAeJ,MAAf,CAAuB,CAAvB;;AAEA,KAAI+uC,UAAU,IAAIjC,iBAAJ,EAAd;AACAiC,SAAQD,MAAR,GAAiB,IAAI1tD,OAAJ,CAAa,GAAb,EAAkB,GAAlB,EAAuB,GAAvB,EAA4B,GAA5B,CAAjB;AACA2tD,SAAQ3uC,MAAR,CAAeJ,MAAf,CAAuB,CAAvB;;AAEA,KAAIgvC,WAAW,IAAIjB,WAAJ,CAAiB,CAAEc,OAAF,EAAWE,OAAX,CAAjB,CAAf;AACAC,UAAS5uC,MAAT,CAAgBJ,MAAhB,CAAwB,CAAxB;AACAgvC,UAAS5uC,MAAT,CAAgBJ,MAAhB,CAAwB,CAAxB;;AAEA;;AAEA,UAASivC,YAAT,GAAwB;;AAEvB,SAAOd,WAAW,IAAX,IAAmBA,OAAOc,YAAP,KAAwB,IAAlD;AAEA;;AAED,KAAIC,WAAJ,EAAiBC,iBAAjB;;AAEA,UAAST,wBAAT,GAAoC;;AAEnC,MAAKO,cAAL,EAAsB;;AAErB,OAAIG,gBAAgBjB,OAAOkB,gBAAP,CAAyB,MAAzB,CAApB;AACA,OAAIC,cAAcF,cAAcE,WAAhC;AACA,OAAIC,eAAeH,cAAcG,YAAjC;;AAEAJ,uBAAoBlxB,SAASuxB,aAAT,EAApB;AACAN,iBAAcjxB,SAAS15B,OAAT,EAAd;;AAEA05B,YAASwxB,oBAAT,CAA+BH,cAAc,CAA7C,EAAgDC,YAAhD,EAA8D,CAA9D;;AAEAG,aAAUlmD,KAAV;AAEA,GAbD,MAaO,IAAK7E,MAAMygB,OAAX,EAAqB;;AAE3B6Y,YAASwxB,oBAAT,CAA+BP,YAAY9uD,KAA3C,EAAkD8uD,YAAY7uD,MAA9D,EAAsE8uD,iBAAtE;;AAEAO,aAAUlzC,IAAV;AAEA;AAED;;AAED;;AAEA,MAAK4I,OAAL,GAAe,KAAf;AACA,MAAKuqC,UAAL,GAAkB,GAAlB;;AAEA,MAAKC,SAAL,GAAiB,YAAY;;AAE5B,SAAOzB,MAAP;AAEA,EAJD;;AAMA,MAAK0B,SAAL,GAAiB,UAAW52E,KAAX,EAAmB;;AAEnC,MAAKA,UAAUJ,SAAf,EAA2Bs1E,SAASl1E,KAAT;;AAE3By2E,YAAUhzC,UAAV,CAAsBzjC,KAAtB;AAEA,EAND;;AAQA,MAAK62E,aAAL,GAAqB,UAAW5rD,MAAX,EAAoB;;AAExC,MAAKA,WAAWrrB,SAAhB,EAA4Bw1E,aAAanqD,MAAb;AAE5B,EAJD;;AAMA,MAAK6rD,SAAL,GAAiB,UAAWt0D,MAAX,EAAoB;;AAEpC,MAAK0yD,WAAW,IAAhB,EAAuB,OAAO1yD,MAAP;;AAEvB0yD,SAAO6B,SAAP,GAAmBv0D,OAAOxF,IAA1B;AACAk4D,SAAO8B,QAAP,GAAkBx0D,OAAOvF,GAAzB;;AAEAi4D,SAAO+B,YAAP,CAAqB9B,SAArB;;AAEA;;AAEA,MAAI+B,kBAAkBhC,OAAOgC,eAA7B;;AAEA,MAAKA,eAAL,EAAuB;;AAEtB7B,kBAAepjE,SAAf,CAA0BilE,gBAAgBC,0BAA1C;AAEA,GAJD,MAIO;;AAEN9B,kBAAej7D,eAAf,CAAgC,CAAhC,EAAmCsR,MAAMgrD,UAAzC,EAAqD,CAArD;AAEA;;AAGD,MAAIU,OAAOjC,UAAUiC,IAArB;AACA,MAAIC,aAAajC,eAAe,IAAf,GAAsBA,UAAtB,GAAmC5yD,MAApD;;AAEA;AACA60D,aAAW/6D,MAAX,CAAkBrN,IAAlB,CAAwBomE,cAAxB;AACAgC,aAAW/6D,MAAX,CAAkBF,SAAlB,CAA6Bi7D,WAAWt8D,QAAxC,EAAkDs8D,WAAWr8D,UAA7D,EAAyEq8D,WAAWt9D,KAApF;;AAEA,MAAKq9D,KAAKE,WAAL,KAAqB,IAA1B,EAAiC;;AAEhC5B,kBAAezjE,SAAf,CAA0BmlE,KAAKE,WAA/B;AACAD,cAAWr8D,UAAX,CAAsBhL,QAAtB,CAAgC0lE,cAAhC;AAEA;;AAED,MAAK0B,KAAKr8D,QAAL,KAAkB,IAAvB,EAA8B;;AAE7B26D,kBAAeh5D,qBAAf,CAAsC24D,cAAtC;AACAM,gBAAa1jE,SAAb,CAAwBmlE,KAAKr8D,QAA7B;AACA46D,gBAAa9zD,eAAb,CAA8B6zD,cAA9B;AACA2B,cAAWt8D,QAAX,CAAoB5L,GAApB,CAAyBwmE,YAAzB;AAEA;;AAED0B,aAAWnrD,iBAAX;;AAEA,MAAKgpD,OAAOc,YAAP,KAAwB,KAA7B,EAAqC,OAAOxzD,MAAP;;AAErC;;AAEAozD,UAAQ54D,IAAR,GAAewF,OAAOxF,IAAtB;AACA84D,UAAQ94D,IAAR,GAAewF,OAAOxF,IAAtB;;AAEA44D,UAAQ34D,GAAR,GAAcuF,OAAOvF,GAArB;AACA64D,UAAQ74D,GAAR,GAAcuF,OAAOvF,GAArB;;AAEA84D,WAASrzD,WAAT,CAAqBzT,IAArB,CAA2BuT,OAAOE,WAAlC;AACAqzD,WAASrqC,kBAAT,CAA4Bz8B,IAA5B,CAAkCuT,OAAOkpB,kBAAzC;;AAEAkqC,UAAQlqC,kBAAR,CAA2Bz5B,SAA3B,CAAsCkjE,UAAUoC,cAAhD;AACAzB,UAAQpqC,kBAAR,CAA2Bz5B,SAA3B,CAAsCkjE,UAAUqC,eAAhD;;AAEA;;AAEAlC,wBAAsBh8D,UAAtB,CAAkC+7D,cAAlC;;AAEAO,UAAQlqC,kBAAR,CAA2B17B,QAA3B,CAAqCslE,qBAArC;AACAQ,UAAQpqC,kBAAR,CAA2B17B,QAA3B,CAAqCslE,qBAArC;;AAEA,MAAIhuC,SAAS+vC,WAAW/vC,MAAxB;;AAEA,MAAKA,WAAW,IAAhB,EAAuB;;AAEtBoE,sBAAmBpyB,UAAnB,CAA+BguB,OAAO5kB,WAAtC;;AAEAkzD,WAAQlqC,kBAAR,CAA2B17B,QAA3B,CAAqC07B,kBAArC;AACAoqC,WAAQpqC,kBAAR,CAA2B17B,QAA3B,CAAqC07B,kBAArC;AAEA;;AAED;;AAEAkqC,UAAQlzD,WAAR,CAAoBpJ,UAApB,CAAgCs8D,QAAQlqC,kBAAxC;AACAoqC,UAAQpzD,WAAR,CAAoBpJ,UAApB,CAAgCw8D,QAAQpqC,kBAAxC;;AAEAkqC,UAAQnzD,gBAAR,CAAyBxQ,SAAzB,CAAoCkjE,UAAUsC,oBAA9C;AACA3B,UAAQrzD,gBAAR,CAAyBxQ,SAAzB,CAAoCkjE,UAAUuC,qBAA9C;;AAEA;AACA;;AAEA3B,WAAStzD,gBAAT,CAA0BxT,IAA1B,CAAgC2mE,QAAQnzD,gBAAxC;;AAEA;;AAEA,MAAI0kB,SAAS+tC,OAAOyC,SAAP,EAAb;;AAEA,MAAKxwC,OAAOjmC,MAAZ,EAAqB;;AAEpB,OAAI02E,QAAQzwC,OAAQ,CAAR,CAAZ;;AAEA,OAAKywC,MAAMC,UAAN,KAAqB,IAArB,IAA6BD,MAAMC,UAAN,CAAiB32E,MAAjB,KAA4B,CAA9D,EAAkE;;AAEjE00E,YAAQC,MAAR,CAAe5jE,SAAf,CAA0B2lE,MAAMC,UAAhC;AAEA;;AAED,OAAKD,MAAME,WAAN,KAAsB,IAAtB,IAA8BF,MAAME,WAAN,CAAkB52E,MAAlB,KAA6B,CAAhE,EAAoE;;AAEnE40E,YAAQD,MAAR,CAAe5jE,SAAf,CAA0B2lE,MAAME,WAAhC;AAEA;AAED;;AAED,SAAO/B,QAAP;AAEA,EAxHD;;AA0HA,MAAKgC,iBAAL,GAAyB,YAAY;;AAEpC,SAAO1C,cAAP;AAEA,EAJD;;AAMA,MAAKW,YAAL,GAAoBA,YAApB;;AAEA;;AAEA,KAAIS,YAAY,IAAIzzC,cAAJ,EAAhB;;AAEA,MAAKQ,gBAAL,GAAwB,UAAWhiB,QAAX,EAAsB;;AAE7Ci1D,YAAUjzC,gBAAV,CAA4BhiB,QAA5B;AAEA,EAJD;;AAMA,MAAKw2D,WAAL,GAAmB,YAAY;;AAE9B,MAAKhC,cAAL,EAAsBd,OAAO8C,WAAP;AAEtB,EAJD;;AAMA,MAAKhwD,OAAL,GAAe,YAAY;;AAE1B,MAAK,OAAOutD,MAAP,KAAkB,WAAvB,EAAqC;;AAEpCA,UAAOvzE,mBAAP,CAA4B,wBAA5B,EAAsDyzE,wBAAtD;AAEA;AAED,EARD;AAUA;;AAED;;;;AAIA,SAASwC,YAAT,CAAuBjzB,QAAvB,EAAkC;;AAEjC,KAAIrhB,KAAKqhB,SAAS39B,OAAlB;;AAEA,KAAI6tD,SAAS,IAAb;AACA,KAAIgD,UAAU,IAAd;;AAEA,KAAIC,aAAa,IAAjB;;AAEA,KAAIf,OAAO,IAAX;;AAEA,UAASpB,YAAT,GAAwB;;AAEvB,SAAOkC,YAAY,IAAZ,IAAoBC,eAAe,IAA1C;AAEA;;AAED;;AAEA,KAAIvC,UAAU,IAAI/B,iBAAJ,EAAd;AACA+B,SAAQzuC,MAAR,CAAeJ,MAAf,CAAuB,CAAvB;AACA6uC,SAAQ7sD,QAAR,GAAmB,IAAIZ,OAAJ,EAAnB;;AAEA,KAAI2tD,UAAU,IAAIjC,iBAAJ,EAAd;AACAiC,SAAQ3uC,MAAR,CAAeJ,MAAf,CAAuB,CAAvB;AACA+uC,SAAQ/sD,QAAR,GAAmB,IAAIZ,OAAJ,EAAnB;;AAEA,KAAI4tD,WAAW,IAAIjB,WAAJ,CAAiB,CAAEc,OAAF,EAAWE,OAAX,CAAjB,CAAf;AACAC,UAAS5uC,MAAT,CAAgBJ,MAAhB,CAAwB,CAAxB;AACAgvC,UAAS5uC,MAAT,CAAgBJ,MAAhB,CAAwB,CAAxB;;AAEA;;AAEA,MAAKoF,OAAL,GAAe,KAAf;;AAEA,MAAKwqC,SAAL,GAAiB,YAAY;;AAE5B,SAAOzB,MAAP;AAEA,EAJD;;AAMA,MAAK0B,SAAL,GAAiB,UAAW52E,KAAX,EAAmB;;AAEnC,MAAKA,UAAUJ,SAAf,EAA2Bs1E,SAASl1E,KAAT;;AAE3B2jC,KAAGy0C,qBAAH,CAA0Bp4E,KAA1B;AAEA,EAND;;AAQA;;AAEA,MAAKq4E,UAAL,GAAkB,UAAWr4E,KAAX,EAAkB4oB,OAAlB,EAA4B;;AAE7CsvD,YAAUl4E,KAAV;;AAEA,MAAKk4E,YAAY,IAAjB,EAAwB;;AAEvBA,WAAQ12E,gBAAR,CAA0B,KAA1B,EAAiC,YAAY;;AAE5CwjD,aAASszB,cAAT,CAAyB,IAAzB;AACA7B,cAAUlzC,IAAV;AAEA,IALD;;AAOA20C,WAAQK,SAAR,GAAoB,IAAIC,YAAJ,CAAkBN,OAAlB,EAA2Bv0C,EAA3B,CAApB;AACAu0C,WAAQO,uBAAR,CAAiC7vD,QAAQ8vD,oBAAzC,EAAgEC,IAAhE,CAAsE,UAAW34E,KAAX,EAAmB;;AAExFm4E,iBAAan4E,KAAb;;AAEAglD,aAASszB,cAAT,CAAyBJ,QAAQK,SAAR,CAAkBrI,WAA3C;;AAEAuG,cAAUhzC,UAAV,CAAsBy0C,OAAtB;AACAzB,cAAUlmD,KAAV;AAEA,IATD;AAWA;AAED,EA3BD;;AA6BA,UAASqoD,YAAT,CAAuBp2D,MAAvB,EAA+B8kB,MAA/B,EAAwC;;AAEvC,MAAKA,WAAW,IAAhB,EAAuB;;AAEtB9kB,UAAOE,WAAP,CAAmBzT,IAAnB,CAAyBuT,OAAOlG,MAAhC;AAEA,GAJD,MAIO;;AAENkG,UAAOE,WAAP,CAAmB/L,gBAAnB,CAAqC2wB,OAAO5kB,WAA5C,EAAyDF,OAAOlG,MAAhE;AAEA;;AAEDkG,SAAOkpB,kBAAP,CAA0BpyB,UAA1B,CAAsCkJ,OAAOE,WAA7C;AAEA;;AAED,MAAKo0D,SAAL,GAAiB,UAAWt0D,MAAX,EAAoB;;AAEpC,MAAKwzD,cAAL,EAAsB;;AAErB,OAAI1uC,SAAS9kB,OAAO8kB,MAApB;AACA,OAAIytC,UAAUgB,SAAShB,OAAvB;;AAEA;;AAEA6D,gBAAc7C,QAAd,EAAwBzuC,MAAxB;;AAEA,QAAM,IAAI/kC,IAAI,CAAd,EAAiBA,IAAIwyE,QAAQ7zE,MAA7B,EAAqCqB,GAArC,EAA4C;;AAE3Cq2E,iBAAc7D,QAASxyE,CAAT,CAAd,EAA4B+kC,MAA5B;AAEA;;AAED;;AAEA9kB,UAAOE,WAAP,CAAmBzT,IAAnB,CAAyB8mE,SAASrzD,WAAlC;;AAEA,OAAI6kB,WAAW/kB,OAAO+kB,QAAtB;;AAEA,QAAM,IAAIhlC,IAAI,CAAR,EAAWC,IAAI+kC,SAASrmC,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDglC,aAAUhlC,CAAV,EAAc2pB,iBAAd,CAAiC,IAAjC;AAEA;;AAED,UAAO6pD,QAAP;AAEA;;AAED,SAAOvzD,MAAP;AAEA,EAnCD;;AAqCA,MAAKwzD,YAAL,GAAoBA,YAApB;;AAEA;;AAEA,KAAI6C,2BAA2B,IAA/B;;AAEA,UAAS11C,gBAAT,CAA2BC,IAA3B,EAAiCC,KAAjC,EAAyC;;AAExC+zC,SAAO/zC,MAAMy1C,aAAN,CAAqBX,UAArB,CAAP;;AAEA,MAAIP,QAAQM,QAAQK,SAApB;AACA,MAAIQ,QAAQ11C,MAAM01C,KAAlB;;AAEA,OAAM,IAAIx2E,IAAI,CAAd,EAAiBA,IAAIw2E,MAAM73E,MAA3B,EAAmCqB,GAAnC,EAA0C;;AAEzC,OAAIspC,OAAOktC,MAAOx2E,CAAP,CAAX;AACA,OAAIwmB,WAAW6uD,MAAMoB,WAAN,CAAmBntC,IAAnB,CAAf;AACA,OAAI4e,aAAa2sB,KAAK6B,aAAL,CAAoBptC,IAApB,CAAjB;;AAEA,OAAIrpB,SAASuzD,SAAShB,OAAT,CAAkBxyE,CAAlB,CAAb;AACAigB,UAAOlG,MAAP,CAAcrK,SAAd,CAAyBw4C,UAAzB,EAAsCnxC,UAAtC,CAAkDkJ,OAAOlG,MAAzD;AACAkG,UAAOC,gBAAP,CAAwBxQ,SAAxB,CAAmC45B,KAAKppB,gBAAxC;AACAD,UAAOuG,QAAP,CAAgBza,GAAhB,CAAqBya,SAAS3oB,CAA9B,EAAiC2oB,SAAS/b,CAA1C,EAA6C+b,SAAS5B,KAAtD,EAA6D4B,SAAS3B,MAAtE;;AAEA,OAAK7kB,MAAM,CAAX,EAAe;;AAEdwzE,aAASz5D,MAAT,CAAgBrN,IAAhB,CAAsBuT,OAAOlG,MAA7B;;AAEA;AACA;;AAEAy5D,aAAStzD,gBAAT,CAA0BxT,IAA1B,CAAgCuT,OAAOC,gBAAvC;AAEA;AAED;;AAED,MAAKo2D,wBAAL,EAAgCA;AAEhC;;AAED,KAAIpC,YAAY,IAAIzzC,cAAJ,EAAhB;AACAyzC,WAAUjzC,gBAAV,CAA4BL,gBAA5B;;AAEA,MAAKK,gBAAL,GAAwB,UAAWhiB,QAAX,EAAsB;;AAE7Cq3D,6BAA2Br3D,QAA3B;AAEA,EAJD;;AAMA;;AAEA,MAAKu2D,iBAAL,GAAyB,YAAY;;AAEpC1oE,UAAQC,IAAR,CAAc,8DAAd;AACA,SAAO,IAAI4pE,MAAMrmE,OAAV,EAAP;AAEA,EALD;;AAOA,MAAKmlE,WAAL,GAAmB,YAAY,CAAE,CAAjC;AAEA;;AAED;;;;;;;;AAQA,SAASmB,aAAT,CAAwBpuC,UAAxB,EAAqC;;AAEpC17B,SAAQpB,GAAR,CAAa,qBAAb,EAAoCxL,QAApC;;AAEAsoC,cAAaA,cAAc,EAA3B;;AAEA,KAAIshC,UAAUthC,WAAWhkB,MAAX,KAAsBnnB,SAAtB,GAAkCmrC,WAAWhkB,MAA7C,GAAsDE,SAASC,eAAT,CAA0B,8BAA1B,EAA0D,QAA1D,CAApE;AAAA,KACCkyD,WAAWruC,WAAW1jB,OAAX,KAAuBznB,SAAvB,GAAmCmrC,WAAW1jB,OAA9C,GAAwD,IADpE;AAAA,KAGCgyD,SAAStuC,WAAWn5B,KAAX,KAAqBhS,SAArB,GAAiCmrC,WAAWn5B,KAA5C,GAAoD,KAH9D;AAAA,KAIC0nE,SAASvuC,WAAW5I,KAAX,KAAqBviC,SAArB,GAAiCmrC,WAAW5I,KAA5C,GAAoD,IAJ9D;AAAA,KAKCo3C,WAAWxuC,WAAW87B,OAAX,KAAuBjnE,SAAvB,GAAmCmrC,WAAW87B,OAA9C,GAAwD,IALpE;AAAA,KAMC2S,aAAazuC,WAAW0uC,SAAX,KAAyB75E,SAAzB,GAAqCmrC,WAAW0uC,SAAhD,GAA4D,KAN1E;AAAA,KAOCC,sBAAsB3uC,WAAW6Q,kBAAX,KAAkCh8C,SAAlC,GAA8CmrC,WAAW6Q,kBAAzD,GAA8E,IAPrG;AAAA,KAQC+9B,yBAAyB5uC,WAAW6uC,qBAAX,KAAqCh6E,SAArC,GAAiDmrC,WAAW6uC,qBAA5D,GAAoF,KAR9G;AAAA,KASCC,mBAAmB9uC,WAAW+uC,eAAX,KAA+Bl6E,SAA/B,GAA2CmrC,WAAW+uC,eAAtD,GAAwE,SAT5F;;AAWA,KAAIC,oBAAoB,IAAxB;AACA,KAAIC,qBAAqB,IAAzB;;AAEA;;AAEA,MAAKC,UAAL,GAAkB5N,OAAlB;AACA,MAAKhlD,OAAL,GAAe,IAAf;;AAEA;;AAEA,MAAKy+B,SAAL,GAAiB,IAAjB;AACA,MAAKE,cAAL,GAAsB,IAAtB;AACA,MAAKC,cAAL,GAAsB,IAAtB;AACA,MAAKC,gBAAL,GAAwB,IAAxB;;AAEA;;AAEA,MAAKg0B,WAAL,GAAmB,IAAnB;;AAEA;;AAEA,MAAKh/B,cAAL,GAAsB,EAAtB;AACA,MAAKkO,oBAAL,GAA4B,KAA5B;;AAEA;;AAEA,MAAKttB,WAAL,GAAmB,GAAnB,CA3CoC,CA2CZ;AACxB,MAAKk/B,UAAL,GAAkB,KAAlB;AACA,MAAKD,WAAL,GAAmB,KAAnB;;AAEA;;AAEA,MAAK/D,uBAAL,GAA+B,KAA/B;;AAEA;;AAEA,MAAKnD,WAAL,GAAmB5tD,iBAAnB;AACA,MAAKk0E,mBAAL,GAA2B,GAA3B;AACA,MAAKC,qBAAL,GAA6B,GAA7B;;AAEA;;AAEA,MAAKjf,eAAL,GAAuB,CAAvB;AACA,MAAKC,eAAL,GAAuB,CAAvB;;AAEA;;AAEA,KAAIif,QAAQ,IAAZ;AAAA,KAECC,iBAAiB,KAFlB;;;AAIC;;AAEAC,gBAAe,IANhB;AAAA,KAQCC,uBAAuB,IARxB;AAAA,KASCC,sBAAsB,IATvB;AAAA,KAUCC,qBAAqB,CAAE,CAVxB;AAAA,KAWCC,0BAA0B,EAX3B;AAAA,KAaCC,iBAAiB,IAblB;AAAA,KAcCC,sBAAsB,IAdvB;AAAA,KAgBCC,mBAAmB,IAAI3yD,OAAJ,EAhBpB;AAAA,KAiBC4yD,kBAAkB,IAAI5yD,OAAJ,EAjBnB;AAAA,KAkBC6yD,sBAAsB,IAlBvB;;;AAoBC;;AAEAC,qBAAoB,CAtBrB;;;AAwBC;;AAEAC,UAAS7O,QAAQllD,KA1BlB;AAAA,KA2BCg0D,UAAU9O,QAAQjlD,MA3BnB;AAAA,KA6BCg0D,cAAc,CA7Bf;AAAA,KA+BCC,YAAY,IAAIlzD,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB+yD,MAAnB,EAA2BC,OAA3B,CA/Bb;AAAA,KAgCCG,WAAW,IAAInzD,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB+yD,MAAnB,EAA2BC,OAA3B,CAhCZ;AAAA,KAiCCI,eAAe,KAjChB;;;AAmCC;;AAEAnc,YAAW,IAAInuC,OAAJ,EArCZ;;;AAuCC;;AAEAuqD,aAAY,IAAIvyB,aAAJ,EAzCb;AAAA,KA0CCwyB,mBAAmB,KA1CpB;AAAA,KA2CCC,wBAAwB,KA3CzB;;;AA6CC;;AAEArc,qBAAoB,IAAIxsD,OAAJ,EA/CrB;AAAA,KAiDC8oE,WAAW,IAAI/mE,OAAJ,EAjDZ;;AAmDA,UAASgnE,mBAAT,GAA+B;;AAE9B,SAAOpB,yBAAyB,IAAzB,GAAgCY,WAAhC,GAA8C,CAArD;AAEA;;AAED;;AAEA,KAAI5a,GAAJ;;AAEA,KAAI;;AAEH,MAAIqb,oBAAoB;AACvBjqE,UAAOynE,MADgB;AAEvBl3C,UAAOm3C,MAFgB;AAGvBzS,YAAS0S,QAHc;AAIvBE,cAAWD,UAJY;AAKvB59B,uBAAoB89B,mBALG;AAMvBE,0BAAuBD,sBANA;AAOvBG,oBAAiBD;AAPM,GAAxB;;AAUA;;AAEAxN,UAAQ7qE,gBAAR,CAA0B,kBAA1B,EAA8Cs6E,aAA9C,EAA6D,KAA7D;AACAzP,UAAQ7qE,gBAAR,CAA0B,sBAA1B,EAAkDu6E,gBAAlD,EAAoE,KAApE;;AAEAvb,QAAM4Y,YAAY/M,QAAQ/kD,UAAR,CAAoB,OAApB,EAA6Bu0D,iBAA7B,CAAZ,IAAgExP,QAAQ/kD,UAAR,CAAoB,oBAApB,EAA0Cu0D,iBAA1C,CAAtE;;AAEA,MAAKrb,QAAQ,IAAb,EAAoB;;AAEnB,OAAK6L,QAAQ/kD,UAAR,CAAoB,OAApB,MAAkC,IAAvC,EAA8C;;AAE7C,UAAM,IAAIzY,KAAJ,CAAW,6DAAX,CAAN;AAEA,IAJD,MAIO;;AAEN,UAAM,IAAIA,KAAJ,CAAW,+BAAX,CAAN;AAEA;AAED;;AAED;;AAEA,MAAK2xD,IAAIjZ,wBAAJ,KAAiC3nD,SAAtC,EAAkD;;AAEjD4gE,OAAIjZ,wBAAJ,GAA+B,YAAY;;AAE1C,WAAO,EAAE,YAAY,CAAd,EAAiB,YAAY,CAA7B,EAAgC,aAAa,CAA7C,EAAP;AAEA,IAJD;AAMA;AAED,EA7CD,CA6CE,OAAQz0C,KAAR,EAAgB;;AAEjBzD,UAAQyD,KAAR,CAAe,0BAA0BA,MAAMkpE,OAA/C;AAEA;;AAED,KAAI3+B,UAAJ,EAAgB4b,YAAhB,EAA8BhU,KAA9B,EAAqCyB,IAArC;AACA,KAAI7mB,UAAJ,EAAgBhZ,QAAhB,EAA0BoF,UAA1B,EAAsCse,UAAtC,EAAkD2a,OAAlD;AACA,KAAI+2B,YAAJ,EAAkBC,WAAlB,EAA+Brd,YAA/B;;AAEA,KAAIjZ,UAAJ,EAAgBu2B,YAAhB,EAA8BC,cAA9B,EAA8CC,qBAA9C;AACA,KAAIC,cAAJ;;AAEA,KAAIpY,KAAJ;;AAEA,UAASqY,aAAT,GAAyB;;AAExBl/B,eAAa,IAAIsN,eAAJ,CAAqB6V,GAArB,CAAb;AACAnjB,aAAW58C,GAAX,CAAgB,qBAAhB;AACA48C,aAAW58C,GAAX,CAAgB,mBAAhB;AACA48C,aAAW58C,GAAX,CAAgB,0BAAhB;AACA48C,aAAW58C,GAAX,CAAgB,wBAAhB;AACA48C,aAAW58C,GAAX,CAAgB,+BAAhB;AACA48C,aAAW58C,GAAX,CAAgB,0BAAhB;AACA48C,aAAW58C,GAAX,CAAgB,wBAAhB;AACA48C,aAAW58C,GAAX,CAAgB,wBAAhB;;AAEAyjE,UAAQ,IAAIyN,UAAJ,CAAgBnR,GAAhB,EAAqBnjB,UAArB,CAAR;;AAEA4b,iBAAe,IAAI/R,iBAAJ,CAAuBsZ,GAAvB,EAA4BnjB,UAA5B,EAAwCtS,UAAxC,CAAf;;AAEAka,UAAQ,IAAIgf,UAAJ,CAAgBzD,GAAhB,EAAqBnjB,UAArB,EAAiC6mB,KAAjC,CAAR;AACAjf,QAAMp8B,OAAN,CAAekyD,gBAAgB9rE,IAAhB,CAAsBqsE,QAAtB,EAAiCrrE,cAAjC,CAAiDmrE,WAAjD,CAAf;AACAn2B,QAAMl8B,QAAN,CAAgB+xD,iBAAiB7rE,IAAjB,CAAuBosE,SAAvB,EAAmCprE,cAAnC,CAAmDmrE,WAAnD,CAAhB;;AAEA10B,SAAO,IAAIiF,SAAJ,CAAe6U,GAAf,CAAP;AACA3gC,eAAa,IAAIm8B,eAAJ,EAAb;AACAn1C,aAAW,IAAIolD,aAAJ,CAAmBzL,GAAnB,EAAwBnjB,UAAxB,EAAoC4H,KAApC,EAA2CplB,UAA3C,EAAuDo5B,YAAvD,EAAqEiL,KAArE,EAA4Exd,IAA5E,CAAX;AACAz6B,eAAa,IAAIyX,eAAJ,CAAqB88B,GAArB,CAAb;AACAj2B,eAAa,IAAIsgB,eAAJ,CAAqB2V,GAArB,EAA0Bv0C,UAA1B,EAAsCy6B,IAAtC,CAAb;AACAxB,YAAU,IAAIgI,YAAJ,CAAkB3iB,UAAlB,EAA8Bmc,IAA9B,CAAV;AACAy1B,iBAAe,IAAIxvB,iBAAJ,CAAuB6T,GAAvB,CAAf;AACAyb,iBAAe,IAAIjjB,aAAJ,CAAmBqhB,KAAnB,EAA0Bh9B,UAA1B,EAAsC4b,YAAtC,CAAf;AACAijB,gBAAc,IAAI1f,gBAAJ,EAAd;AACAqC,iBAAe,IAAID,iBAAJ,EAAf;;AAEAhZ,eAAa,IAAIb,eAAJ,CAAqBs1B,KAArB,EAA4Bp1B,KAA5B,EAAmCC,OAAnC,EAA4Cw0B,mBAA5C,CAAb;;AAEA0C,mBAAiB,IAAI31B,mBAAJ,CAAyB+Z,GAAzB,EAA8BnjB,UAA9B,EAA0CqJ,IAA1C,CAAjB;AACA21B,0BAAwB,IAAI7wB,0BAAJ,CAAgCgV,GAAhC,EAAqCnjB,UAArC,EAAiDqJ,IAAjD,CAAxB;;AAEA41B,mBAAiB,IAAIha,mBAAJ,CAAyB+X,KAAzB,EAAgC7Z,GAAhC,EAAqCvb,KAArC,EAA4Cp+B,QAA5C,EAAsDoyC,YAAtD,CAAjB;;AAEAvS,OAAK8F,QAAL,GAAgByvB,aAAazvB,QAA7B;;AAEA6tB,QAAMhzD,OAAN,GAAgBm5C,GAAhB;AACA6Z,QAAMphB,YAAN,GAAqBA,YAArB;AACAohB,QAAMh9B,UAAN,GAAmBA,UAAnB;AACAg9B,QAAMx6C,UAAN,GAAmBA,UAAnB;AACAw6C,QAAM6B,WAAN,GAAoBA,WAApB;AACA7B,QAAMp1B,KAAN,GAAcA,KAAd;AACAo1B,QAAM3zB,IAAN,GAAaA,IAAb;AAEA;;AAED61B;;AAEA;;AAEA,KAAIC,KAAO,QAAQC,SAAV,GAAwB,IAAIxE,YAAJ,CAAkBoC,KAAlB,CAAxB,GAAoD,IAAIpF,YAAJ,CAAkBoF,KAAlB,CAA7D;;AAEA,MAAKmC,EAAL,GAAUA,EAAV;;AAEA;;AAEA,KAAI/gB,YAAY,IAAIwD,cAAJ,CAAoBob,KAApB,EAA2Bn1B,OAA3B,EAAoC+T,aAAa/Q,cAAjD,CAAhB;;AAEA,MAAKuT,SAAL,GAAiBA,SAAjB;;AAEA;;AAEA,MAAKn0C,UAAL,GAAkB,YAAY;;AAE7B,SAAOk5C,GAAP;AAEA,EAJD;;AAMA,MAAKkc,oBAAL,GAA4B,YAAY;;AAEvC,SAAOlc,IAAIkc,oBAAJ,EAAP;AAEA,EAJD;;AAMA,MAAKC,gBAAL,GAAwB,YAAY;;AAEnC,MAAI51B,YAAY1J,WAAW58C,GAAX,CAAgB,oBAAhB,CAAhB;AACA,MAAKsmD,SAAL,EAAiBA,UAAU61B,WAAV;AAEjB,EALD;;AAOA,MAAKC,mBAAL,GAA2B,YAAY;;AAEtC,MAAI91B,YAAY1J,WAAW58C,GAAX,CAAgB,oBAAhB,CAAhB;AACA,MAAKsmD,SAAL,EAAiBA,UAAU+1B,cAAV;AAEjB,EALD;;AAOA,MAAKvG,aAAL,GAAqB,YAAY;;AAEhC,SAAO6E,WAAP;AAEA,EAJD;;AAMA,MAAK2B,aAAL,GAAqB,UAAW/8E,KAAX,EAAmB;;AAEvC,MAAKA,UAAUJ,SAAf,EAA2B;;AAE3Bw7E,gBAAcp7E,KAAd;;AAEA,OAAKqpB,OAAL,CAAc6xD,MAAd,EAAsBC,OAAtB,EAA+B,KAA/B;AAEA,EARD;;AAUA,MAAK7vD,OAAL,GAAe,YAAY;;AAE1B,SAAO;AACNnE,UAAO+zD,MADD;AAEN9zD,WAAQ+zD;AAFF,GAAP;AAKA,EAPD;;AASA,MAAK9xD,OAAL,GAAe,UAAWlC,KAAX,EAAkBC,MAAlB,EAA0B41D,WAA1B,EAAwC;;AAEtD,MAAKR,GAAGxG,YAAH,EAAL,EAAyB;;AAExB3mE,WAAQC,IAAR,CAAc,wEAAd;AACA;AAEA;;AAED4rE,WAAS/zD,KAAT;AACAg0D,YAAU/zD,MAAV;;AAEAilD,UAAQllD,KAAR,GAAgBA,QAAQi0D,WAAxB;AACA/O,UAAQjlD,MAAR,GAAiBA,SAASg0D,WAA1B;;AAEA,MAAK4B,gBAAgB,KAArB,EAA6B;;AAE5B3Q,WAAQjxC,KAAR,CAAcjU,KAAd,GAAsBA,QAAQ,IAA9B;AACAklD,WAAQjxC,KAAR,CAAchU,MAAd,GAAuBA,SAAS,IAAhC;AAEA;;AAED,OAAK61D,WAAL,CAAkB,CAAlB,EAAqB,CAArB,EAAwB91D,KAAxB,EAA+BC,MAA/B;AAEA,EAxBD;;AA0BA,MAAK81D,oBAAL,GAA4B,YAAY;;AAEvC,SAAO;AACN/1D,UAAO+zD,SAASE,WADV;AAENh0D,WAAQ+zD,UAAUC;AAFZ,GAAP;AAKA,EAPD;;AASA,MAAK5E,oBAAL,GAA4B,UAAWrvD,KAAX,EAAkBC,MAAlB,EAA0B+1D,UAA1B,EAAuC;;AAElEjC,WAAS/zD,KAAT;AACAg0D,YAAU/zD,MAAV;;AAEAg0D,gBAAc+B,UAAd;;AAEA9Q,UAAQllD,KAAR,GAAgBA,QAAQg2D,UAAxB;AACA9Q,UAAQjlD,MAAR,GAAiBA,SAAS+1D,UAA1B;;AAEA,OAAKF,WAAL,CAAkB,CAAlB,EAAqB,CAArB,EAAwB91D,KAAxB,EAA+BC,MAA/B;AAEA,EAZD;;AAcA,MAAKg2D,kBAAL,GAA0B,YAAY;;AAErC,SAAOtC,gBAAP;AAEA,EAJD;;AAMA,MAAKmC,WAAL,GAAmB,UAAW78E,CAAX,EAAc4M,CAAd,EAAiBma,KAAjB,EAAwBC,MAAxB,EAAiC;;AAEnDi0D,YAAU/sE,GAAV,CAAelO,CAAf,EAAkB+6E,UAAUnuE,CAAV,GAAcoa,MAAhC,EAAwCD,KAAxC,EAA+CC,MAA/C;AACA69B,QAAMl8B,QAAN,CAAgB+xD,iBAAiB7rE,IAAjB,CAAuBosE,SAAvB,EAAmCprE,cAAnC,CAAmDmrE,WAAnD,CAAhB;AAEA,EALD;;AAOA,MAAKiC,UAAL,GAAkB,UAAWj9E,CAAX,EAAc4M,CAAd,EAAiBma,KAAjB,EAAwBC,MAAxB,EAAiC;;AAElDk0D,WAAShtE,GAAT,CAAclO,CAAd,EAAiB+6E,UAAUnuE,CAAV,GAAcoa,MAA/B,EAAuCD,KAAvC,EAA8CC,MAA9C;AACA69B,QAAMp8B,OAAN,CAAekyD,gBAAgB9rE,IAAhB,CAAsBqsE,QAAtB,EAAiCrrE,cAAjC,CAAiDmrE,WAAjD,CAAf;AAEA,EALD;;AAOA,MAAKxa,cAAL,GAAsB,UAAW0c,OAAX,EAAqB;;AAE1Cr4B,QAAM2b,cAAN,CAAsB2a,eAAe+B,OAArC;AAEA,EAJD;;AAMA;;AAEA,MAAKj3B,aAAL,GAAqB,YAAY;;AAEhC,SAAOT,WAAWS,aAAX,EAAP;AAEA,EAJD;;AAMA,MAAKC,aAAL,GAAqB,YAAY;;AAEhCV,aAAWU,aAAX,CAAyB0lB,KAAzB,CAAgCpmB,UAAhC,EAA4C3kD,SAA5C;AAEA,EAJD;;AAMA,MAAKslD,aAAL,GAAqB,YAAY;;AAEhC,SAAOX,WAAWW,aAAX,EAAP;AAEA,EAJD;;AAMA,MAAKC,aAAL,GAAqB,YAAY;;AAEhCZ,aAAWY,aAAX,CAAyBwlB,KAAzB,CAAgCpmB,UAAhC,EAA4C3kD,SAA5C;AAEA,EAJD;;AAMA,MAAK8kD,KAAL,GAAa,UAAWtqB,KAAX,EAAkB0G,KAAlB,EAAyB0kC,OAAzB,EAAmC;;AAE/C,MAAI0W,OAAO,CAAX;;AAEA,MAAK9hD,UAAU77B,SAAV,IAAuB67B,KAA5B,EAAoC8hD,QAAQ/c,IAAIgd,gBAAZ;AACpC,MAAKr7C,UAAUviC,SAAV,IAAuBuiC,KAA5B,EAAoCo7C,QAAQ/c,IAAIid,gBAAZ;AACpC,MAAK5W,YAAYjnE,SAAZ,IAAyBinE,OAA9B,EAAwC0W,QAAQ/c,IAAIkd,kBAAZ;;AAExCld,MAAIza,KAAJ,CAAWw3B,IAAX;AAEA,EAVD;;AAYA,MAAKp4B,UAAL,GAAkB,YAAY;;AAE7B,OAAKY,KAAL,CAAY,IAAZ,EAAkB,KAAlB,EAAyB,KAAzB;AAEA,EAJD;;AAMA,MAAK0f,UAAL,GAAkB,YAAY;;AAE7B,OAAK1f,KAAL,CAAY,KAAZ,EAAmB,IAAnB,EAAyB,KAAzB;AAEA,EAJD;;AAMA,MAAK+gB,YAAL,GAAoB,YAAY;;AAE/B,OAAK/gB,KAAL,CAAY,KAAZ,EAAmB,KAAnB,EAA0B,IAA1B;AAEA,EAJD;;AAMA,MAAK43B,WAAL,GAAmB,UAAWpQ,YAAX,EAAyB9xC,KAAzB,EAAgC0G,KAAhC,EAAuC0kC,OAAvC,EAAiD;;AAEnE,OAAKzF,eAAL,CAAsBmM,YAAtB;AACA,OAAKxnB,KAAL,CAAYtqB,KAAZ,EAAmB0G,KAAnB,EAA0B0kC,OAA1B;AAEA,EALD;;AAOA;;AAEA,MAAK7+C,OAAL,GAAe,YAAY;;AAE1BqkD,UAAQrqE,mBAAR,CAA6B,kBAA7B,EAAiD85E,aAAjD,EAAgE,KAAhE;AACAzP,UAAQrqE,mBAAR,CAA6B,sBAA7B,EAAqD+5E,gBAArD,EAAuE,KAAvE;;AAEAG,cAAYl0D,OAAZ;AACA62C,eAAa72C,OAAb;AACA6X,aAAW7X,OAAX;AACAk9B,UAAQl9B,OAAR;;AAEAw0D,KAAGx0D,OAAH;;AAEAyuD,YAAUlzC,IAAV;AAEA,EAdD;;AAgBA;;AAEA,UAASu4C,aAAT,CAAwB15E,KAAxB,EAAgC;;AAE/BA,QAAMw7E,cAAN;;AAEAvuE,UAAQpB,GAAR,CAAa,oCAAb;;AAEAqsE,mBAAiB,IAAjB;AAEA;;AAED,UAASyB,gBAAT,GAA2B,WAAc;;AAExC1sE,UAAQpB,GAAR,CAAa,wCAAb;;AAEAqsE,mBAAiB,KAAjB;;AAEAiC;AAEA;;AAED,UAASsB,iBAAT,CAA4Bz7E,KAA5B,EAAoC;;AAEnC,MAAI6oC,WAAW7oC,MAAMvB,MAArB;;AAEAoqC,WAASjpC,mBAAT,CAA8B,SAA9B,EAAyC67E,iBAAzC;;AAEAC,qBAAoB7yC,QAApB;AAEA;;AAED;;AAEA,UAAS6yC,kBAAT,CAA6B7yC,QAA7B,EAAwC;;AAEvC8yC,kCAAiC9yC,QAAjC;;AAEApL,aAAWiG,MAAX,CAAmBmF,QAAnB;AAEA;;AAGD,UAAS8yC,+BAAT,CAA0C9yC,QAA1C,EAAqD;;AAEpD,MAAI4wB,cAAch8B,WAAWp/B,GAAX,CAAgBwqC,QAAhB,EAA2B4hB,OAA7C;;AAEA5hB,WAAS4hB,OAAT,GAAmBjtD,SAAnB;;AAEA,MAAKi8D,gBAAgBj8D,SAArB,EAAiC;;AAEhCq8E,gBAAangB,cAAb,CAA6BD,WAA7B;AAEA;AAED;;AAED;;AAEA,UAASmiB,qBAAT,CAAgC/yD,MAAhC,EAAwC4hC,OAAxC,EAAiD5hB,QAAjD,EAA4D;;AAE3DhgB,SAAOu6B,MAAP,CAAe,UAAWv6B,MAAX,EAAoB;;AAElCovD,SAAM4D,qBAAN,CAA6BhzD,MAA7B,EAAqC4hC,OAArC,EAA8C5hB,QAA9C;AAEA,GAJD;AAMA;;AAED,MAAKgzC,qBAAL,GAA6B,UAAWhzD,MAAX,EAAmB4hC,OAAnB,EAA4B5hB,QAA5B,EAAuC;;AAEnEga,QAAMme,cAAN;;AAEA,MAAIx/B,UAAU/D,WAAWp/B,GAAX,CAAgBwqB,MAAhB,CAAd;;AAEA,MAAKA,OAAOizD,YAAP,IAAuB,CAAEt6C,QAAQ7oB,QAAtC,EAAiD6oB,QAAQ7oB,QAAR,GAAmBylD,IAAI18B,YAAJ,EAAnB;AACjD,MAAK7Y,OAAOkzD,UAAP,IAAqB,CAAEv6C,QAAQpgB,MAApC,EAA6CogB,QAAQpgB,MAAR,GAAiBg9C,IAAI18B,YAAJ,EAAjB;AAC7C,MAAK7Y,OAAOmzD,MAAP,IAAiB,CAAEx6C,QAAQ1b,EAAhC,EAAqC0b,QAAQ1b,EAAR,GAAas4C,IAAI18B,YAAJ,EAAb;AACrC,MAAK7Y,OAAOozD,SAAP,IAAoB,CAAEz6C,QAAQnI,KAAnC,EAA2CmI,QAAQnI,KAAR,GAAgB+kC,IAAI18B,YAAJ,EAAhB;;AAE3C,MAAIw6C,oBAAoBzxB,QAAQ+L,aAAR,EAAxB;;AAEA,MAAK3tC,OAAOizD,YAAZ,EAA2B;;AAE1B1d,OAAIn8B,UAAJ,CAAgBm8B,IAAInV,YAApB,EAAkCznB,QAAQ7oB,QAA1C;AACAylD,OAAIl8B,UAAJ,CAAgBk8B,IAAInV,YAApB,EAAkCpgC,OAAOszD,aAAzC,EAAwD/d,IAAIt8B,YAA5D;;AAEA+gB,SAAMoe,eAAN,CAAuBib,kBAAkBvjE,QAAzC;AACAylD,OAAIgD,mBAAJ,CAAyB8a,kBAAkBvjE,QAA3C,EAAqD,CAArD,EAAwDylD,IAAIh8B,KAA5D,EAAmE,KAAnE,EAA0E,CAA1E,EAA6E,CAA7E;AAEA;;AAED,MAAKvZ,OAAOkzD,UAAZ,EAAyB;;AAExB3d,OAAIn8B,UAAJ,CAAgBm8B,IAAInV,YAApB,EAAkCznB,QAAQpgB,MAA1C;;AAEA,OAAK,CAAEynB,SAASuzC,mBAAX,IACJ,CAAEvzC,SAASwzC,sBADP,IAEJ,CAAExzC,SAASyzC,oBAFP,IAGJzzC,SAASsP,WAAT,KAAyB,IAH1B,EAGiC;;AAEhC,SAAM,IAAIh4C,IAAI,CAAR,EAAWC,IAAIyoB,OAAOnS,KAAP,GAAe,CAApC,EAAuCvW,IAAIC,CAA3C,EAA8CD,KAAK,CAAnD,EAAuD;;AAEtD,SAAIF,QAAQ4oB,OAAO0zD,WAAnB;;AAEA,SAAIC,KAAK,CAAEv8E,MAAOE,IAAI,CAAX,IAAiBF,MAAOE,IAAI,CAAX,CAAjB,GAAkCF,MAAOE,IAAI,CAAX,CAApC,IAAuD,CAAhE;AACA,SAAIs8E,KAAK,CAAEx8E,MAAOE,IAAI,CAAX,IAAiBF,MAAOE,IAAI,CAAX,CAAjB,GAAkCF,MAAOE,IAAI,CAAX,CAApC,IAAuD,CAAhE;AACA,SAAIu8E,KAAK,CAAEz8E,MAAOE,IAAI,CAAX,IAAiBF,MAAOE,IAAI,CAAX,CAAjB,GAAkCF,MAAOE,IAAI,CAAX,CAApC,IAAuD,CAAhE;;AAEAF,WAAOE,IAAI,CAAX,IAAiBq8E,EAAjB;AACAv8E,WAAOE,IAAI,CAAX,IAAiBs8E,EAAjB;AACAx8E,WAAOE,IAAI,CAAX,IAAiBu8E,EAAjB;;AAEAz8E,WAAOE,IAAI,CAAX,IAAiBq8E,EAAjB;AACAv8E,WAAOE,IAAI,CAAX,IAAiBs8E,EAAjB;AACAx8E,WAAOE,IAAI,CAAX,IAAiBu8E,EAAjB;;AAEAz8E,WAAOE,IAAI,CAAX,IAAiBq8E,EAAjB;AACAv8E,WAAOE,IAAI,CAAX,IAAiBs8E,EAAjB;AACAx8E,WAAOE,IAAI,CAAX,IAAiBu8E,EAAjB;AAEA;AAED;;AAEDte,OAAIl8B,UAAJ,CAAgBk8B,IAAInV,YAApB,EAAkCpgC,OAAO0zD,WAAzC,EAAsDne,IAAIt8B,YAA1D;;AAEA+gB,SAAMoe,eAAN,CAAuBib,kBAAkB96D,MAAzC;;AAEAg9C,OAAIgD,mBAAJ,CAAyB8a,kBAAkB96D,MAA3C,EAAmD,CAAnD,EAAsDg9C,IAAIh8B,KAA1D,EAAiE,KAAjE,EAAwE,CAAxE,EAA2E,CAA3E;AAEA;;AAED,MAAKvZ,OAAOmzD,MAAP,IAAiBnzC,SAAS/N,GAA/B,EAAqC;;AAEpCsjC,OAAIn8B,UAAJ,CAAgBm8B,IAAInV,YAApB,EAAkCznB,QAAQ1b,EAA1C;AACAs4C,OAAIl8B,UAAJ,CAAgBk8B,IAAInV,YAApB,EAAkCpgC,OAAO8zD,OAAzC,EAAkDve,IAAIt8B,YAAtD;;AAEA+gB,SAAMoe,eAAN,CAAuBib,kBAAkBp2D,EAAzC;;AAEAs4C,OAAIgD,mBAAJ,CAAyB8a,kBAAkBp2D,EAA3C,EAA+C,CAA/C,EAAkDs4C,IAAIh8B,KAAtD,EAA6D,KAA7D,EAAoE,CAApE,EAAuE,CAAvE;AAEA;;AAED,MAAKvZ,OAAOozD,SAAP,IAAoBpzC,SAAS6B,YAAT,KAA0BlpC,QAAnD,EAA8D;;AAE7D48D,OAAIn8B,UAAJ,CAAgBm8B,IAAInV,YAApB,EAAkCznB,QAAQnI,KAA1C;AACA+kC,OAAIl8B,UAAJ,CAAgBk8B,IAAInV,YAApB,EAAkCpgC,OAAO+zD,UAAzC,EAAqDxe,IAAIt8B,YAAzD;;AAEA+gB,SAAMoe,eAAN,CAAuBib,kBAAkB7iD,KAAzC;;AAEA+kC,OAAIgD,mBAAJ,CAAyB8a,kBAAkB7iD,KAA3C,EAAkD,CAAlD,EAAqD+kC,IAAIh8B,KAAzD,EAAgE,KAAhE,EAAuE,CAAvE,EAA0E,CAA1E;AAEA;;AAEDygB,QAAMqe,uBAAN;;AAEA9C,MAAI3Z,UAAJ,CAAgB2Z,IAAIxU,SAApB,EAA+B,CAA/B,EAAkC/gC,OAAOnS,KAAzC;;AAEAmS,SAAOnS,KAAP,GAAe,CAAf;AAEA,EA5FD;;AA8FA,MAAKstC,kBAAL,GAA0B,UAAW5jC,MAAX,EAAmB6c,GAAnB,EAAwBxT,QAAxB,EAAkCof,QAAlC,EAA4ChgB,MAA5C,EAAoDikB,KAApD,EAA4D;;AAErF,MAAI27B,cAAgB5/C,OAAOqmB,MAAP,IAAiBrmB,OAAOvI,WAAP,CAAmBxJ,WAAnB,KAAmC,CAAxE;;AAEA+rC,QAAM2lB,WAAN,CAAmB3/B,QAAnB,EAA6B4/B,WAA7B;;AAEA,MAAIhe,UAAUoyB,WAAYz8D,MAAZ,EAAoB6c,GAApB,EAAyB4L,QAAzB,EAAmChgB,MAAnC,CAAd;AACA,MAAIi0D,kBAAkBrzD,SAAS8d,EAAT,GAAc,GAAd,GAAoBkjB,QAAQljB,EAA5B,GAAiC,GAAjC,IAAyCsB,SAASuR,SAAT,KAAuB,IAAhE,CAAtB;;AAEA,MAAI2iC,gBAAgB,KAApB;;AAEA,MAAKD,oBAAoBvE,uBAAzB,EAAmD;;AAElDA,6BAA0BuE,eAA1B;AACAC,mBAAgB,IAAhB;AAEA;;AAED,MAAKl0D,OAAO63B,qBAAZ,EAAoC;;AAEnCq5B,gBAAap9D,MAAb,CAAqBkM,MAArB,EAA6BY,QAA7B,EAAuCof,QAAvC,EAAiD4hB,OAAjD;;AAEAsyB,mBAAgB,IAAhB;AAEA;;AAED;;AAEA,MAAIn+E,QAAQ6qB,SAAS7qB,KAArB;AACA,MAAI+Z,WAAW8Q,SAASI,UAAT,CAAoBlR,QAAnC;AACA,MAAIqkE,cAAc,CAAlB;;AAEA,MAAKn0C,SAASuR,SAAT,KAAuB,IAA5B,EAAmC;;AAElCx7C,WAAQupC,WAAW+gB,qBAAX,CAAkCz/B,QAAlC,CAAR;AACAuzD,iBAAc,CAAd;AAEA;;AAED,MAAI/sE,SAAJ;AACA,MAAI2yC,WAAWo3B,cAAf;;AAEA,MAAKp7E,UAAU,IAAf,EAAsB;;AAErBqR,eAAY4Z,WAAWxrB,GAAX,CAAgBO,KAAhB,CAAZ;;AAEAgkD,cAAWq3B,qBAAX;AACAr3B,YAAStO,QAAT,CAAmBrkC,SAAnB;AAEA;;AAED,MAAK8sE,aAAL,EAAqB;;AAEpBE,yBAAuBp0C,QAAvB,EAAiC4hB,OAAjC,EAA0ChhC,QAA1C;;AAEA,OAAK7qB,UAAU,IAAf,EAAsB;;AAErBw/D,QAAIn8B,UAAJ,CAAgBm8B,IAAIpV,oBAApB,EAA0C/4C,UAAU+xB,MAApD;AAEA;AAED;;AAED;;AAEA,MAAIk7C,YAAYx1D,QAAhB;;AAEA,MAAK9oB,UAAU,IAAf,EAAsB;;AAErBs+E,eAAYt+E,MAAM8X,KAAlB;AAEA,GAJD,MAIO,IAAKiC,aAAanb,SAAlB,EAA8B;;AAEpC0/E,eAAYvkE,SAASjC,KAArB;AAEA;;AAED,MAAIymE,aAAa1zD,SAAS2qB,SAAT,CAAmBjmB,KAAnB,GAA2B6uD,WAA5C;AACA,MAAII,aAAa3zD,SAAS2qB,SAAT,CAAmB19B,KAAnB,GAA2BsmE,WAA5C;;AAEA,MAAItmC,aAAa5J,UAAU,IAAV,GAAiBA,MAAM3e,KAAN,GAAc6uD,WAA/B,GAA6C,CAA9D;AACA,MAAIxlC,aAAa1K,UAAU,IAAV,GAAiBA,MAAMp2B,KAAN,GAAcsmE,WAA/B,GAA6Ct1D,QAA9D;;AAEA,MAAI21D,YAAY5/E,KAAKyM,GAAL,CAAUizE,UAAV,EAAsBzmC,UAAtB,CAAhB;AACA,MAAI4mC,UAAU7/E,KAAKwM,GAAL,CAAUizE,SAAV,EAAqBC,aAAaC,UAAlC,EAA8C1mC,aAAac,UAA3D,IAA0E,CAAxF;;AAEA,MAAI+lC,YAAY9/E,KAAKyM,GAAL,CAAU,CAAV,EAAaozE,UAAUD,SAAV,GAAsB,CAAnC,CAAhB;;AAEA,MAAKE,cAAc,CAAnB,EAAuB;;AAEvB;;AAEA,MAAK10D,OAAOqmB,MAAZ,EAAqB;;AAEpB,OAAKrG,SAASuR,SAAT,KAAuB,IAA5B,EAAmC;;AAElCyI,UAAMqmB,YAAN,CAAoBrgC,SAASwR,kBAAT,GAA8Bm/B,qBAAlD;AACA52B,aAAS4B,OAAT,CAAkB4Z,IAAIrU,KAAtB;AAEA,IALD,MAKO;;AAEN,YAASlhC,OAAO03B,QAAhB;;AAEC,UAAKj4C,iBAAL;AACCs6C,eAAS4B,OAAT,CAAkB4Z,IAAIxU,SAAtB;AACA;;AAED,UAAKrhD,qBAAL;AACCq6C,eAAS4B,OAAT,CAAkB4Z,IAAIvU,cAAtB;AACA;;AAED,UAAKrhD,mBAAL;AACCo6C,eAAS4B,OAAT,CAAkB4Z,IAAItU,YAAtB;AACA;;AAZF;AAgBA;AAGD,GA5BD,MA4BO,IAAKjhC,OAAOksB,MAAZ,EAAqB;;AAE3B,OAAIo0B,YAAYtgC,SAASqR,SAAzB;;AAEA,OAAKivB,cAAc3rE,SAAnB,EAA+B2rE,YAAY,CAAZ,CAJJ,CAImB;;AAE9CtmB,SAAMqmB,YAAN,CAAoBC,YAAYqQ,qBAAhC;;AAEA,OAAK3wD,OAAO20D,cAAZ,EAA6B;;AAE5B56B,aAAS4B,OAAT,CAAkB4Z,IAAIrU,KAAtB;AAEA,IAJD,MAIO,IAAKlhC,OAAO40D,UAAZ,EAAyB;;AAE/B76B,aAAS4B,OAAT,CAAkB4Z,IAAInU,SAAtB;AAEA,IAJM,MAIA;;AAENrH,aAAS4B,OAAT,CAAkB4Z,IAAIpU,UAAtB;AAEA;AAED,GAtBM,MAsBA,IAAKnhC,OAAOisB,QAAZ,EAAuB;;AAE7B8N,YAAS4B,OAAT,CAAkB4Z,IAAIlU,MAAtB;AAEA;;AAED,MAAKzgC,YAAYA,SAASi0D,yBAA1B,EAAsD;;AAErD,OAAKj0D,SAASo7B,iBAAT,GAA6B,CAAlC,EAAsC;;AAErCjC,aAAS8B,eAAT,CAA0Bj7B,QAA1B,EAAoC4zD,SAApC,EAA+CE,SAA/C;AAEA;AAED,GARD,MAQO;;AAEN36B,YAASQ,MAAT,CAAiBi6B,SAAjB,EAA4BE,SAA5B;AAEA;AAED,EAlKD;;AAoKA,UAASN,qBAAT,CAAgCp0C,QAAhC,EAA0C4hB,OAA1C,EAAmDhhC,QAAnD,EAA8D;;AAE7D,MAAKA,YAAYA,SAASi0D,yBAA1B,EAAsD;;AAErD,OAAKziC,WAAW58C,GAAX,CAAgB,wBAAhB,MAA+C,IAApD,EAA2D;;AAE1D4O,YAAQyD,KAAR,CAAe,gJAAf;AACA;AAEA;AAED;;AAEDmyC,QAAMme,cAAN;;AAEA,MAAIjY,qBAAqBt/B,SAASI,UAAlC;;AAEA,MAAIqyD,oBAAoBzxB,QAAQ+L,aAAR,EAAxB;;AAEA,MAAImnB,iCAAiC90C,SAASyS,sBAA9C;;AAEA,OAAM,IAAI/3B,IAAV,IAAkB24D,iBAAlB,EAAsC;;AAErC,OAAI0B,mBAAmB1B,kBAAmB34D,IAAnB,CAAvB;;AAEA,OAAKq6D,oBAAoB,CAAzB,EAA6B;;AAE5B,QAAIC,oBAAoB90B,mBAAoBxlC,IAApB,CAAxB;;AAEA,QAAKs6D,sBAAsBrgF,SAA3B,EAAuC;;AAEtC,SAAIm0C,aAAaksC,kBAAkBlsC,UAAnC;AACA,SAAIjpB,OAAOm1D,kBAAkBnsC,QAA7B;;AAEA,SAAIzhC,YAAY4Z,WAAWxrB,GAAX,CAAgBw/E,iBAAhB,CAAhB;;AAEA;;AAEA,SAAK5tE,cAAczS,SAAnB,EAA+B;;AAE/B,SAAIwkC,SAAS/xB,UAAU+xB,MAAvB;AACA,SAAI3iC,OAAO4Q,UAAU5Q,IAArB;AACA,SAAI8jC,kBAAkBlzB,UAAUkzB,eAAhC;;AAEA,SAAK06C,kBAAkBp6C,4BAAvB,EAAsD;;AAErD,UAAIlc,OAAOs2D,kBAAkBt2D,IAA7B;AACA,UAAIu2D,SAASv2D,KAAKu2D,MAAlB;AACA,UAAIhuE,SAAS+tE,kBAAkB/tE,MAA/B;;AAEA,UAAKyX,QAAQA,KAAKw2D,4BAAlB,EAAiD;;AAEhDl7B,aAAMwkB,yBAAN,CAAiCuW,gBAAjC,EAAmDr2D,KAAK+/C,gBAAxD;;AAEA,WAAK79C,SAASo7B,iBAAT,KAA+BrnD,SAApC,EAAgD;;AAE/CisB,iBAASo7B,iBAAT,GAA6Bt9B,KAAK+/C,gBAAL,GAAwB//C,KAAK7Q,KAA1D;AAEA;AAED,OAVD,MAUO;;AAENmsC,aAAMoe,eAAN,CAAuB2c,gBAAvB;AAEA;;AAEDxf,UAAIn8B,UAAJ,CAAgBm8B,IAAInV,YAApB,EAAkCjnB,MAAlC;AACAo8B,UAAIgD,mBAAJ,CAAyBwc,gBAAzB,EAA2Cl1D,IAA3C,EAAiDrpB,IAAjD,EAAuDsyC,UAAvD,EAAmEmsC,SAAS36C,eAA5E,EAA6FrzB,SAASqzB,eAAtG;AAEA,MAzBD,MAyBO;;AAEN,UAAK06C,kBAAkBG,0BAAvB,EAAoD;;AAEnDn7B,aAAMwkB,yBAAN,CAAiCuW,gBAAjC,EAAmDC,kBAAkBvW,gBAArE;;AAEA,WAAK79C,SAASo7B,iBAAT,KAA+BrnD,SAApC,EAAgD;;AAE/CisB,iBAASo7B,iBAAT,GAA6Bg5B,kBAAkBvW,gBAAlB,GAAqCuW,kBAAkBnnE,KAApF;AAEA;AAED,OAVD,MAUO;;AAENmsC,aAAMoe,eAAN,CAAuB2c,gBAAvB;AAEA;;AAEDxf,UAAIn8B,UAAJ,CAAgBm8B,IAAInV,YAApB,EAAkCjnB,MAAlC;AACAo8B,UAAIgD,mBAAJ,CAAyBwc,gBAAzB,EAA2Cl1D,IAA3C,EAAiDrpB,IAAjD,EAAuDsyC,UAAvD,EAAmE,CAAnE,EAAsE,CAAtE;AAEA;AAED,KA/DD,MA+DO,IAAKgsC,mCAAmCngF,SAAxC,EAAoD;;AAE1D,SAAII,QAAQ+/E,+BAAgCp6D,IAAhC,CAAZ;;AAEA,SAAK3lB,UAAUJ,SAAf,EAA2B;;AAE1B,cAASI,MAAMkB,MAAf;;AAEC,YAAK,CAAL;AACCs/D,YAAI6f,eAAJ,CAAqBL,gBAArB,EAAuChgF,KAAvC;AACA;;AAED,YAAK,CAAL;AACCwgE,YAAI8f,eAAJ,CAAqBN,gBAArB,EAAuChgF,KAAvC;AACA;;AAED,YAAK,CAAL;AACCwgE,YAAI+f,eAAJ,CAAqBP,gBAArB,EAAuChgF,KAAvC;AACA;;AAED;AACCwgE,YAAIggB,eAAJ,CAAqBR,gBAArB,EAAuChgF,KAAvC;;AAfF;AAmBA;AAED;AAED;AAED;;AAEDilD,QAAMqe,uBAAN;AAEA;;AAED;;AAEA,MAAKmd,OAAL,GAAe,UAAW/6B,KAAX,EAAkBljC,MAAlB,EAA2B;;AAEzCw3D,uBAAqBnb,aAAap+D,GAAb,CAAkBilD,KAAlB,EAAyBljC,MAAzB,CAArB;AACAw3D,qBAAmBtwB,IAAnB;;AAEAhE,QAAM/5B,QAAN,CAAgB,UAAWV,MAAX,EAAoB;;AAEnC,OAAKA,OAAOy1D,OAAZ,EAAsB;;AAErB1G,uBAAmBzb,SAAnB,CAA8BtzC,MAA9B;;AAEA,QAAKA,OAAO+c,UAAZ,EAAyB;;AAExBgyC,wBAAmBxb,UAAnB,CAA+BvzC,MAA/B;AAEA;AAED;AAED,GAdD;;AAgBA+uD,qBAAmBrb,WAAnB,CAAgCn8C,MAAhC;;AAEAkjC,QAAM/5B,QAAN,CAAgB,UAAWV,MAAX,EAAoB;;AAEnC,OAAKA,OAAOggB,QAAZ,EAAuB;;AAEtB,QAAKvQ,MAAMC,OAAN,CAAe1P,OAAOggB,QAAtB,CAAL,EAAwC;;AAEvC,UAAM,IAAI1oC,IAAI,CAAd,EAAiBA,IAAI0oB,OAAOggB,QAAP,CAAgB/pC,MAArC,EAA6CqB,GAA7C,EAAoD;;AAEnDo+E,mBAAc11D,OAAOggB,QAAP,CAAiB1oC,CAAjB,CAAd,EAAoCmjD,MAAMrmB,GAA1C,EAA+CpU,MAA/C;AAEA;AAED,KARD,MAQO;;AAEN01D,kBAAc11D,OAAOggB,QAArB,EAA+Bya,MAAMrmB,GAArC,EAA0CpU,MAA1C;AAEA;AAED;AAED,GApBD;AAsBA,EA7CD;;AA+CA;;AAEA,KAAI4tD,2BAA2B,IAA/B;;AAEA,UAAS11C,gBAAT,GAA4B;;AAE3B,MAAKq5C,GAAGxG,YAAH,EAAL,EAAyB;AACzB,MAAK6C,wBAAL,EAAgCA;AAEhC;;AAED,KAAIpC,YAAY,IAAIzzC,cAAJ,EAAhB;AACAyzC,WAAUjzC,gBAAV,CAA4BL,gBAA5B;AACAszC,WAAUhzC,UAAV,CAAsB8xC,MAAtB;;AAEA,MAAK/xC,gBAAL,GAAwB,UAAWhiB,QAAX,EAAsB;;AAE7Cq3D,6BAA2Br3D,QAA3B;AACAg7D,KAAGh5C,gBAAH,CAAqBhiB,QAArB;;AAEAi1D,YAAUlmD,KAAV;AAEA,EAPD;;AASA;;AAEA,MAAKi1B,MAAL,GAAc,UAAWE,KAAX,EAAkBljC,MAAlB,EAA0B+qD,YAA1B,EAAwC5nB,UAAxC,EAAqD;;AAElE,MAAK,EAAInjC,UAAUA,OAAOinB,QAArB,CAAL,EAAuC;;AAEtCp6B,WAAQyD,KAAR,CAAe,wEAAf;AACA;AAEA;;AAED,MAAKwnE,cAAL,EAAsB;;AAEtB;;AAEAK,4BAA0B,EAA1B;AACAD,uBAAqB,CAAE,CAAvB;AACAE,mBAAiB,IAAjB;;AAEA;;AAEA,MAAKl1B,MAAM6a,UAAN,KAAqB,IAA1B,EAAiC7a,MAAMx5B,iBAAN;;AAEjC;;AAEA,MAAK1J,OAAO8kB,MAAP,KAAkB,IAAvB,EAA8B9kB,OAAO0J,iBAAP;;AAE9B,MAAKswD,GAAGrwC,OAAR,EAAkB;;AAEjB3pB,YAASg6D,GAAG1F,SAAH,CAAct0D,MAAd,CAAT;AAEA;;AAED;;AAEAw3D,uBAAqBnb,aAAap+D,GAAb,CAAkBilD,KAAlB,EAAyBljC,MAAzB,CAArB;AACAw3D,qBAAmBtwB,IAAnB;;AAEAhE,QAAMpd,cAAN,CAAsB+xC,KAAtB,EAA6B30B,KAA7B,EAAoCljC,MAApC,EAA4C+qD,YAA5C;;AAEAlO,oBAAkB1oD,gBAAlB,CAAoC6L,OAAOC,gBAA3C,EAA6DD,OAAOkpB,kBAApE;AACA0zB,WAAS7tC,aAAT,CAAwB8tC,iBAAxB;;AAEAqc,0BAAwB,KAAKtyB,oBAA7B;AACAqyB,qBAAmBD,UAAU9xB,IAAV,CAAgB,KAAKxO,cAArB,EAAqCwgC,qBAArC,EAA4Dl5D,MAA5D,CAAnB;;AAEAu3D,sBAAoBmC,YAAYz7E,GAAZ,CAAiBilD,KAAjB,EAAwBljC,MAAxB,CAApB;AACAu3D,oBAAkBrwB,IAAlB;;AAEAk3B,gBAAel7B,KAAf,EAAsBljC,MAAtB,EAA8B63D,MAAMH,WAApC;;AAEA,MAAKG,MAAMH,WAAN,KAAsB,IAA3B,EAAkC;;AAEjCH,qBAAkB5nC,IAAlB;AAEA;;AAED;;AAEA,MAAKspC,gBAAL,EAAwBD,UAAU3xB,YAAV;;AAExB,MAAIwU,eAAe2b,mBAAmB/0B,KAAnB,CAAyBoZ,YAA5C;;AAEA5C,YAAUjW,MAAV,CAAkB6Y,YAAlB,EAAgC3Y,KAAhC,EAAuCljC,MAAvC;;AAEAw3D,qBAAmBrb,WAAnB,CAAgCn8C,MAAhC;;AAEA,MAAKi5D,gBAAL,EAAwBD,UAAU1xB,UAAV;;AAExB;;AAEA,MAAK,KAAKpD,IAAL,CAAU+F,SAAf,EAA2B,KAAK/F,IAAL,CAAU6F,KAAV;;AAE3B,MAAKghB,iBAAiB3tE,SAAtB,EAAkC;;AAEjC2tE,kBAAe,IAAf;AAEA;;AAED,OAAKnM,eAAL,CAAsBmM,YAAtB;;AAEA;;AAEA3nB,aAAWJ,MAAX,CAAmBu0B,iBAAnB,EAAsCr0B,KAAtC,EAA6CljC,MAA7C,EAAqDmjC,UAArD;;AAEA;;AAEA,MAAIk7B,gBAAgB9G,kBAAkBzd,MAAtC;AACA,MAAIwkB,qBAAqB/G,kBAAkBv/B,WAA3C;;AAEA,MAAKkL,MAAMq7B,gBAAX,EAA8B;;AAE7B,OAAIA,mBAAmBr7B,MAAMq7B,gBAA7B;;AAEA,OAAKF,cAAc3/E,MAAnB,EAA4B8/E,cAAeH,aAAf,EAA8Bn7B,KAA9B,EAAqCljC,MAArC,EAA6Cu+D,gBAA7C;AAC5B,OAAKD,mBAAmB5/E,MAAxB,EAAiC8/E,cAAeF,kBAAf,EAAmCp7B,KAAnC,EAA0CljC,MAA1C,EAAkDu+D,gBAAlD;AAEjC,GAPD,MAOO;;AAEN;;AAEA,OAAKF,cAAc3/E,MAAnB,EAA4B8/E,cAAeH,aAAf,EAA8Bn7B,KAA9B,EAAqCljC,MAArC;;AAE5B;;AAEA,OAAKs+D,mBAAmB5/E,MAAxB,EAAiC8/E,cAAeF,kBAAf,EAAmCp7B,KAAnC,EAA0CljC,MAA1C;AAEjC;;AAED;;AAEA,MAAI87C,eAAe0b,mBAAmB/0B,KAAnB,CAAyBqZ,YAA5C;;AAEAge,iBAAe92B,MAAf,CAAuB8Y,YAAvB,EAAqC5Y,KAArC,EAA4CljC,MAA5C;;AAEA;;AAEA,MAAK+qD,YAAL,EAAoB;;AAEnB1mD,YAAS6qD,wBAAT,CAAmCnE,YAAnC;AAEA;;AAED;;AAEAtoB,QAAMrhB,OAAN,CAAczB,KAAd,CAAoBw+B,OAApB,CAA6B,IAA7B;AACA1b,QAAMrhB,OAAN,CAAczB,KAAd,CAAoB6hC,OAApB,CAA6B,IAA7B;AACA/e,QAAMrhB,OAAN,CAAcnI,KAAd,CAAoBuoC,OAApB,CAA6B,IAA7B;;AAEA/e,QAAM6lB,gBAAN,CAAwB,KAAxB;;AAEAplB,QAAMnd,aAAN,CAAqB8xC,KAArB,EAA4B30B,KAA5B,EAAmCljC,MAAnC;;AAEA,MAAKg6D,GAAGrwC,OAAR,EAAkB;;AAEjBqwC,MAAGxE,WAAH;AAEA;;AAED;;AAEA+B,sBAAoB,IAApB;AACAC,uBAAqB,IAArB;AAEA,EA9ID;;AAgJA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,UAAS4G,aAAT,CAAwB31D,MAAxB,EAAgCzI,MAAhC,EAAwC03D,WAAxC,EAAsD;;AAErD,MAAKjvD,OAAO8c,OAAP,KAAmB,KAAxB,EAAgC;;AAEhC,MAAIA,UAAU9c,OAAOkc,MAAP,CAAcD,IAAd,CAAoB1kB,OAAO2kB,MAA3B,CAAd;;AAEA,MAAKY,OAAL,EAAe;;AAEd,OAAK9c,OAAOy1D,OAAZ,EAAsB;;AAErB1G,uBAAmBzb,SAAnB,CAA8BtzC,MAA9B;;AAEA,QAAKA,OAAO+c,UAAZ,EAAyB;;AAExBgyC,wBAAmBxb,UAAnB,CAA+BvzC,MAA/B;AAEA;AAED,IAVD,MAUO,IAAKA,OAAOg2D,QAAZ,EAAuB;;AAE7B,QAAK,CAAEh2D,OAAOid,aAAT,IAA0Bk3B,SAASzsC,gBAAT,CAA2B1H,MAA3B,CAA/B,EAAqE;;AAEpE+uD,wBAAmBtb,UAAnB,CAA+BzzC,MAA/B;AAEA;AAED,IARM,MAQA,IAAKA,OAAOi2D,uBAAZ,EAAsC;;AAE5C,QAAKhH,WAAL,EAAmB;;AAElByB,cAAS13D,qBAAT,CAAgCgH,OAAOvI,WAAvC,EACE1J,YADF,CACgBqmD,iBADhB;AAGA;;AAED0a,sBAAkBj4E,IAAlB,CAAwBmpB,MAAxB,EAAgC,IAAhC,EAAsCA,OAAOggB,QAA7C,EAAuD0wC,SAASjnE,CAAhE,EAAmE,IAAnE;AAEA,IAXM,MAWA,IAAKuW,OAAOqmB,MAAP,IAAiBrmB,OAAOksB,MAAxB,IAAkClsB,OAAOisB,QAA9C,EAAyD;;AAE/D,QAAKjsB,OAAO2vC,aAAZ,EAA4B;;AAE3B3vC,YAAOgvC,QAAP,CAAgBl7C,MAAhB;AAEA;;AAED,QAAK,CAAEkM,OAAOid,aAAT,IAA0Bk3B,SAAS5sC,gBAAT,CAA2BvH,MAA3B,CAA/B,EAAqE;;AAEpE,SAAKivD,WAAL,EAAmB;;AAElByB,eAAS13D,qBAAT,CAAgCgH,OAAOvI,WAAvC,EACE1J,YADF,CACgBqmD,iBADhB;AAGA;;AAED,SAAIxzC,WAAWq5B,QAAQnmC,MAAR,CAAgBkM,MAAhB,CAAf;AACA,SAAIggB,WAAWhgB,OAAOggB,QAAtB;;AAEA,SAAKvQ,MAAMC,OAAN,CAAesQ,QAAf,CAAL,EAAiC;;AAEhC,UAAIgE,SAASpjB,SAASojB,MAAtB;;AAEA,WAAM,IAAI1sC,IAAI,CAAR,EAAWC,IAAIysC,OAAO/tC,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,WAAI2sC,QAAQD,OAAQ1sC,CAAR,CAAZ;AACA,WAAI4/D,gBAAgBl3B,SAAUiE,MAAMtC,aAAhB,CAApB;;AAEA,WAAKu1B,iBAAiBA,cAAcp6B,OAApC,EAA8C;;AAE7CgyC,0BAAkBj4E,IAAlB,CAAwBmpB,MAAxB,EAAgCY,QAAhC,EAA0Cs2C,aAA1C,EAAyDwZ,SAASjnE,CAAlE,EAAqEw6B,KAArE;AAEA;AAED;AAED,MAjBD,MAiBO,IAAKjE,SAASlD,OAAd,EAAwB;;AAE9BgyC,wBAAkBj4E,IAAlB,CAAwBmpB,MAAxB,EAAgCY,QAAhC,EAA0Cof,QAA1C,EAAoD0wC,SAASjnE,CAA7D,EAAgE,IAAhE;AAEA;AAED;AAED;AAED;;AAED,MAAI6yB,WAAWtc,OAAOsc,QAAtB;;AAEA,OAAM,IAAIhlC,IAAI,CAAR,EAAWC,IAAI+kC,SAASrmC,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDq+E,iBAAer5C,SAAUhlC,CAAV,CAAf,EAA8BigB,MAA9B,EAAsC03D,WAAtC;AAEA;AAED;;AAED,UAAS8G,aAAT,CAAwBv7B,UAAxB,EAAoCC,KAApC,EAA2CljC,MAA3C,EAAmDu+D,gBAAnD,EAAsE;;AAErE,OAAM,IAAIx+E,IAAI,CAAR,EAAWC,IAAIijD,WAAWvkD,MAAhC,EAAwCqB,IAAIC,CAA5C,EAA+CD,GAA/C,EAAsD;;AAErD,OAAIg6D,aAAa9W,WAAYljD,CAAZ,CAAjB;;AAEA,OAAI0oB,SAASsxC,WAAWtxC,MAAxB;AACA,OAAIY,WAAW0wC,WAAW1wC,QAA1B;AACA,OAAIof,WAAW81C,qBAAqBnhF,SAArB,GAAiC28D,WAAWtxB,QAA5C,GAAuD81C,gBAAtE;AACA,OAAI7xC,QAAQqtB,WAAWrtB,KAAvB;;AAEA,OAAK1sB,OAAOwyD,aAAZ,EAA4B;;AAE3B6F,0BAAsBr4D,MAAtB;;AAEA,QAAIuyD,UAAUvyD,OAAOuyD,OAArB;;AAEA,SAAM,IAAIvnD,IAAI,CAAR,EAAW2gB,KAAK4mC,QAAQ7zE,MAA9B,EAAsCssB,IAAI2gB,EAA1C,EAA8C3gB,GAA9C,EAAqD;;AAEpD,SAAI2zD,UAAUpM,QAASvnD,CAAT,CAAd;;AAEA,SAAKvC,OAAOkc,MAAP,CAAcD,IAAd,CAAoBi6C,QAAQh6C,MAA5B,CAAL,EAA4C;;AAE3C,UAAK,cAAcg6C,OAAnB,EAA6B;AAAE;;AAE9Bl8B,aAAMl8B,QAAN,CAAgB+xD,iBAAiB7rE,IAAjB,CAAuBkyE,QAAQp4D,QAA/B,CAAhB;AAEA,OAJD,MAIO;;AAEN,WAAI8sD,SAASsL,QAAQtL,MAArB;;AAEA,WAAIz1E,IAAIy1E,OAAOz1E,CAAP,GAAW86E,MAAnB;AACA,WAAIluE,IAAI6oE,OAAO7oE,CAAP,GAAWmuE,OAAnB;AACA,WAAIh0D,QAAQ0uD,OAAOnhE,CAAP,GAAWwmE,MAAvB;AACA,WAAI9zD,SAASyuD,OAAOzmE,CAAP,GAAW+rE,OAAxB;;AAEAl2B,aAAMl8B,QAAN,CAAgB+xD,iBAAiBxsE,GAAjB,CAAsBlO,CAAtB,EAAyB4M,CAAzB,EAA4Bma,KAA5B,EAAmCC,MAAnC,EAA4CnX,cAA5C,CAA4DmrE,WAA5D,CAAhB;AAEA;;AAED9Z,mBAAcr2C,MAAd,EAAsBy6B,KAAtB,EAA6By7B,OAA7B,EAAsCt1D,QAAtC,EAAgDof,QAAhD,EAA0DiE,KAA1D;AAEA;AAED;AAED,IAnCD,MAmCO;;AAEN2rC,0BAAsB,IAAtB;;AAEAvZ,iBAAcr2C,MAAd,EAAsBy6B,KAAtB,EAA6BljC,MAA7B,EAAqCqJ,QAArC,EAA+Cof,QAA/C,EAAyDiE,KAAzD;AAEA;AAED;AAED;;AAED,UAASoyB,YAAT,CAAuBr2C,MAAvB,EAA+By6B,KAA/B,EAAsCljC,MAAtC,EAA8CqJ,QAA9C,EAAwDof,QAAxD,EAAkEiE,KAAlE,EAA0E;;AAEzEjkB,SAAOqd,cAAP,CAAuB+xC,KAAvB,EAA8B30B,KAA9B,EAAqCljC,MAArC,EAA6CqJ,QAA7C,EAAuDof,QAAvD,EAAiEiE,KAAjE;AACA8qC,uBAAqBnb,aAAap+D,GAAb,CAAkBilD,KAAlB,EAAyBm1B,uBAAuBr4D,MAAhD,CAArB;;AAEAyI,SAAO2c,eAAP,CAAuBjxB,gBAAvB,CAAyC6L,OAAOkpB,kBAAhD,EAAoEzgB,OAAOvI,WAA3E;AACAuI,SAAO8F,YAAP,CAAoBxM,eAApB,CAAqC0G,OAAO2c,eAA5C;;AAEA,MAAK3c,OAAOi2D,uBAAZ,EAAsC;;AAErC,OAAIrW,cAAgB5/C,OAAOqmB,MAAP,IAAiBrmB,OAAOvI,WAAP,CAAmBxJ,WAAnB,KAAmC,CAAxE;;AAEA+rC,SAAM2lB,WAAN,CAAmB3/B,QAAnB,EAA6B4/B,WAA7B;;AAEA,OAAIhe,UAAUoyB,WAAYz8D,MAAZ,EAAoBkjC,MAAMrmB,GAA1B,EAA+B4L,QAA/B,EAAyChgB,MAAzC,CAAd;;AAEA0vD,6BAA0B,EAA1B;;AAEAqD,yBAAuB/yD,MAAvB,EAA+B4hC,OAA/B,EAAwC5hB,QAAxC;AAEA,GAZD,MAYO;;AAENovC,SAAMj0B,kBAAN,CAA0B5jC,MAA1B,EAAkCkjC,MAAMrmB,GAAxC,EAA6CxT,QAA7C,EAAuDof,QAAvD,EAAiEhgB,MAAjE,EAAyEikB,KAAzE;AAEA;;AAEDjkB,SAAOsd,aAAP,CAAsB8xC,KAAtB,EAA6B30B,KAA7B,EAAoCljC,MAApC,EAA4CqJ,QAA5C,EAAsDof,QAAtD,EAAgEiE,KAAhE;AACA8qC,uBAAqBnb,aAAap+D,GAAb,CAAkBilD,KAAlB,EAAyBm1B,uBAAuBr4D,MAAhD,CAArB;AAEA;;AAED,UAASm+D,YAAT,CAAuB11C,QAAvB,EAAiC5L,GAAjC,EAAsCpU,MAAtC,EAA+C;;AAE9C,MAAIm2D,qBAAqBvhD,WAAWp/B,GAAX,CAAgBwqC,QAAhB,CAAzB;;AAEA,MAAIvL,SAASs6C,mBAAmB/0B,KAAnB,CAAyBvlB,MAAtC;AACA,MAAI2+B,eAAe2b,mBAAmB/0B,KAAnB,CAAyBoZ,YAA5C;;AAEA,MAAItzB,aAAakxC,aAAa1hB,aAAb,CAChBtvB,QADgB,EACNvL,OAAOulB,KADD,EACQoZ,YADR,EACsBh/B,GADtB,EAC2Bm8C,UAAUhyB,SADrC,EACgDgyB,UAAU/xB,eAD1D,EAC2Ex+B,MAD3E,CAAjB;;AAGA,MAAI0qC,OAAOsmB,aAAavgB,cAAb,CAA6BzwB,QAA7B,EAAuCF,UAAvC,CAAX;;AAEA,MAAI8hB,UAAUu0B,mBAAmBv0B,OAAjC;AACA,MAAIw0B,gBAAgB,IAApB;;AAEA,MAAKx0B,YAAYjtD,SAAjB,EAA6B;;AAE5B;AACAqrC,YAASzpC,gBAAT,CAA2B,SAA3B,EAAsCq8E,iBAAtC;AAEA,GALD,MAKO,IAAKhxB,QAAQ8I,IAAR,KAAiBA,IAAtB,EAA6B;;AAEnC;AACAooB,mCAAiC9yC,QAAjC;AAEA,GALM,MAKA,IAAKm2C,mBAAmBE,UAAnB,KAAkC5hD,OAAOulB,KAAP,CAAa5R,IAApD,EAA2D;;AAEjExT,cAAW9gB,MAAX,CAAmBksB,QAAnB,EAA6B,YAA7B,EAA2CvL,OAAOulB,KAAP,CAAa5R,IAAxD;AACAguC,mBAAgB,KAAhB;AAEA,GALM,MAKA,IAAKt2C,WAAW4vB,QAAX,KAAwB/6D,SAA7B,EAAyC;;AAE/C;AACA;AAEA,GALM,MAKA;;AAEN;AACAyhF,mBAAgB,KAAhB;AAEA;;AAED,MAAKA,aAAL,EAAqB;;AAEpB,OAAKt2C,WAAW4vB,QAAhB,EAA2B;;AAE1B,QAAI3H,SAAS7xB,UAAW4J,WAAW4vB,QAAtB,CAAb;;AAEAymB,uBAAmBpuB,MAAnB,GAA4B;AAC3BrtC,WAAMslB,SAASxpC,IADY;AAE3B04B,eAAUF,cAAclrB,KAAd,CAAqBikD,OAAO74B,QAA5B,CAFiB;AAG3BkH,mBAAc2xB,OAAO3xB,YAHM;AAI3BC,qBAAgB0xB,OAAO1xB;AAJI,KAA5B;AAOA,IAXD,MAWO;;AAEN8/C,uBAAmBpuB,MAAnB,GAA4B;AAC3BrtC,WAAMslB,SAASxpC,IADY;AAE3B04B,eAAU8Q,SAAS9Q,QAFQ;AAG3BkH,mBAAc4J,SAAS5J,YAHI;AAI3BC,qBAAgB2J,SAAS3J;AAJE,KAA5B;AAOA;;AAED2J,YAAS8Q,eAAT,CAA0BqlC,mBAAmBpuB,MAA7C,EAAqDqnB,KAArD;;AAEAxtB,aAAUovB,aAAatgB,cAAb,CAA6B1wB,QAA7B,EAAuCm2C,mBAAmBpuB,MAA1D,EAAkEjoB,UAAlE,EAA8E4qB,IAA9E,CAAV;;AAEAyrB,sBAAmBv0B,OAAnB,GAA6BA,OAA7B;AACA5hB,YAAS4hB,OAAT,GAAmBA,OAAnB;AAEA;;AAED,MAAIyxB,oBAAoBzxB,QAAQ+L,aAAR,EAAxB;;AAEA,MAAK3tB,SAASmC,YAAd,EAA6B;;AAE5BnC,YAASs2C,wBAAT,GAAoC,CAApC;;AAEA,QAAM,IAAIh/E,IAAI,CAAd,EAAiBA,IAAI83E,MAAMlf,eAA3B,EAA4C54D,GAA5C,EAAmD;;AAElD,QAAK+7E,kBAAmB,gBAAgB/7E,CAAnC,KAA0C,CAA/C,EAAmD;;AAElD0oC,cAASs2C,wBAAT;AAEA;AAED;AAED;;AAED,MAAKt2C,SAASoC,YAAd,EAA6B;;AAE5BpC,YAASu2C,wBAAT,GAAoC,CAApC;;AAEA,QAAM,IAAIj/E,IAAI,CAAd,EAAiBA,IAAI83E,MAAMjf,eAA3B,EAA4C74D,GAA5C,EAAmD;;AAElD,QAAK+7E,kBAAmB,gBAAgB/7E,CAAnC,KAA0C,CAA/C,EAAmD;;AAElD0oC,cAASu2C,wBAAT;AAEA;AAED;AAED;;AAED,MAAIrnD,WAAWinD,mBAAmBpuB,MAAnB,CAA0B74B,QAAzC;;AAEA,MAAK,CAAE8Q,SAAS4S,gBAAX,IACJ,CAAE5S,SAASsrB,mBADP,IAEJtrB,SAASmS,QAAT,KAAsB,IAFvB,EAE8B;;AAE7BgkC,sBAAmBlsB,iBAAnB,GAAuCsmB,UAAUhyB,SAAjD;AACA43B,sBAAmB33B,eAAnB,GAAqC+xB,UAAU/xB,eAA/C;AACAtvB,YAAS+gB,cAAT,GAA0BsgC,UAAUjyB,OAApC;AAEA;;AAED63B,qBAAmB/hD,GAAnB,GAAyBA,GAAzB;;AAEA;;AAEA+hD,qBAAmBE,UAAnB,GAAgC5hD,OAAOulB,KAAP,CAAa5R,IAA7C;;AAEA,MAAKpI,SAASvL,MAAd,EAAuB;;AAEtB;;AAEAvF,YAASwF,iBAAT,CAA2B3/B,KAA3B,GAAmC0/B,OAAOulB,KAAP,CAAa+X,OAAhD;AACA7iC,YAASyF,iBAAT,CAA2B5/B,KAA3B,GAAmC0/B,OAAOulB,KAAP,CAAaoW,WAAhD;AACAlhC,YAASiG,UAAT,CAAoBpgC,KAApB,GAA4B0/B,OAAOulB,KAAP,CAAaqW,IAAzC;AACAnhC,YAAS+G,cAAT,CAAwBlhC,KAAxB,GAAgC0/B,OAAOulB,KAAP,CAAasW,QAA7C;AACAphC,YAASuG,WAAT,CAAqB1gC,KAArB,GAA6B0/B,OAAOulB,KAAP,CAAa15B,KAA1C;AACA4O,YAAS4G,gBAAT,CAA0B/gC,KAA1B,GAAkC0/B,OAAOulB,KAAP,CAAauW,IAA/C;;AAEArhC,YAAS+F,oBAAT,CAA8BlgC,KAA9B,GAAsC0/B,OAAOulB,KAAP,CAAa/kB,oBAAnD;AACA/F,YAASgG,uBAAT,CAAiCngC,KAAjC,GAAyC0/B,OAAOulB,KAAP,CAAa9kB,uBAAtD;AACAhG,YAASqG,aAAT,CAAuBxgC,KAAvB,GAA+B0/B,OAAOulB,KAAP,CAAazkB,aAA5C;AACArG,YAASsG,gBAAT,CAA0BzgC,KAA1B,GAAkC0/B,OAAOulB,KAAP,CAAaxkB,gBAA/C;AACAtG,YAAS0G,cAAT,CAAwB7gC,KAAxB,GAAgC0/B,OAAOulB,KAAP,CAAapkB,cAA7C;AACA1G,YAAS2G,iBAAT,CAA2B9gC,KAA3B,GAAmC0/B,OAAOulB,KAAP,CAAankB,iBAAhD;AACA;AAEA;;AAED,MAAI2gD,eAAeL,mBAAmBv0B,OAAnB,CAA2BG,WAA3B,EAAnB;AAAA,MACC00B,eACCtvB,cAAcO,YAAd,CAA4B8uB,aAAaj0B,GAAzC,EAA8CrzB,QAA9C,CAFF;;AAIAinD,qBAAmBM,YAAnB,GAAkCA,YAAlC;AAEA;;AAED,UAASzC,UAAT,CAAqBz8D,MAArB,EAA6B6c,GAA7B,EAAkC4L,QAAlC,EAA4ChgB,MAA5C,EAAqD;;AAEpDgwD,sBAAoB,CAApB;;AAEA,MAAImG,qBAAqBvhD,WAAWp/B,GAAX,CAAgBwqC,QAAhB,CAAzB;AACA,MAAIvL,SAASs6C,mBAAmB/0B,KAAnB,CAAyBvlB,MAAtC;;AAEA,MAAK+7C,gBAAL,EAAwB;;AAEvB,OAAKC,yBAAyBl5D,WAAWo4D,cAAzC,EAA0D;;AAEzD,QAAI+G,WACHn/D,WAAWo4D,cAAX,IACA3vC,SAAStB,EAAT,KAAgB+wC,kBAFjB;;AAIA;AACA;AACA;AACAc,cAAUxxB,QAAV,CACC/e,SAASiQ,cADV,EAC0BjQ,SAASkQ,gBADnC,EACqDlQ,SAASmQ,WAD9D,EAEC54B,MAFD,EAES4+D,kBAFT,EAE6BO,QAF7B;AAIA;AAED;;AAED,MAAK12C,SAASgM,WAAT,KAAyB,KAA9B,EAAsC;;AAErC,OAAKmqC,mBAAmBv0B,OAAnB,KAA+BjtD,SAApC,EAAgD;;AAE/CqrC,aAASgM,WAAT,GAAuB,IAAvB;AAEA,IAJD,MAIO,IAAKhM,SAAS5L,GAAT,IAAgB+hD,mBAAmB/hD,GAAnB,KAA2BA,GAAhD,EAAsD;;AAE5D4L,aAASgM,WAAT,GAAuB,IAAvB;AAEA,IAJM,MAIA,IAAKhM,SAASvL,MAAT,IAAmB0hD,mBAAmBE,UAAnB,KAAkC5hD,OAAOulB,KAAP,CAAa5R,IAAvE,EAA8E;;AAEpFpI,aAASgM,WAAT,GAAuB,IAAvB;AAEA,IAJM,MAIA,IAAKmqC,mBAAmBlsB,iBAAnB,KAAyCt1D,SAAzC,KACTwhF,mBAAmBlsB,iBAAnB,KAAyCsmB,UAAUhyB,SAAnD,IACF43B,mBAAmB33B,eAAnB,KAAuC+xB,UAAU/xB,eAFtC,CAAL,EAE+D;;AAErExe,aAASgM,WAAT,GAAuB,IAAvB;AAEA;AAED;;AAED,MAAKhM,SAASgM,WAAd,EAA4B;;AAE3B0pC,gBAAc11C,QAAd,EAAwB5L,GAAxB,EAA6BpU,MAA7B;AACAggB,YAASgM,WAAT,GAAuB,KAAvB;AAEA;;AAED,MAAI2qC,iBAAiB,KAArB;AACA,MAAIC,kBAAkB,KAAtB;AACA,MAAIC,gBAAgB,KAApB;;AAEA,MAAIj1B,UAAUu0B,mBAAmBv0B,OAAjC;AAAA,MACCk1B,aAAal1B,QAAQG,WAAR,EADd;AAAA,MAECg1B,aAAaZ,mBAAmBpuB,MAAnB,CAA0B74B,QAFxC;;AAIA,MAAK8qB,MAAMke,UAAN,CAAkBtW,QAAQA,OAA1B,CAAL,EAA2C;;AAE1C+0B,oBAAiB,IAAjB;AACAC,qBAAkB,IAAlB;AACAC,mBAAgB,IAAhB;AAEA;;AAED,MAAK72C,SAAStB,EAAT,KAAgB+wC,kBAArB,EAA0C;;AAEzCA,wBAAqBzvC,SAAStB,EAA9B;;AAEAk4C,qBAAkB,IAAlB;AAEA;;AAED,MAAKD,kBAAkBp/D,WAAWo4D,cAAlC,EAAmD;;AAElDmH,cAAW90B,QAAX,CAAqBuT,GAArB,EAA0B,kBAA1B,EAA8Ch+C,OAAOC,gBAArD;;AAEA,OAAKw2C,aAAapR,sBAAlB,EAA2C;;AAE1Ck6B,eAAW90B,QAAX,CAAqBuT,GAArB,EAA0B,eAA1B,EACC,OAAQ3gE,KAAKoO,GAAL,CAAUuU,OAAOvF,GAAP,GAAa,GAAvB,IAA+Bpd,KAAKqO,GAA5C,CADD;AAGA;;AAED;;AAEA,OAAK0sE,oBAAqBC,uBAAuBr4D,MAA5C,CAAL,EAA4D;;AAE3Do4D,qBAAmBC,uBAAuBr4D,MAA1C;;AAEA;AACA;AACA;;AAEAq/D,sBAAkB,IAAlB,CAR2D,CAQlC;AACzBC,oBAAgB,IAAhB,CAT2D,CASpC;AAEvB;;AAED;AACA;;AAEA,OAAK72C,SAAS4S,gBAAT,IACJ5S,SAASuzC,mBADL,IAEJvzC,SAASwzC,sBAFL,IAGJxzC,SAASzN,MAHV,EAGmB;;AAElB,QAAIykD,UAAUF,WAAW7kD,GAAX,CAAeglD,cAA7B;;AAEA,QAAKD,YAAYriF,SAAjB,EAA6B;;AAE5BqiF,aAAQh1B,QAAR,CAAkBuT,GAAlB,EACCmb,SAAS13D,qBAAT,CAAgCzB,OAAOE,WAAvC,CADD;AAGA;AAED;;AAED,OAAKuoB,SAASuzC,mBAAT,IACJvzC,SAASk3C,qBADL,IAEJl3C,SAASgS,mBAFL,IAGJhS,SAASwzC,sBAHL,IAIJxzC,SAAS4S,gBAJL,IAKJ5S,SAAS2R,QALV,EAKqB;;AAEpBmlC,eAAW90B,QAAX,CAAqBuT,GAArB,EAA0B,YAA1B,EAAwCh+C,OAAOkpB,kBAA/C;AAEA;AAED;;AAED;AACA;AACA;;AAEA,MAAKT,SAAS2R,QAAd,EAAyB;;AAExBmlC,cAAWtvB,WAAX,CAAwB+N,GAAxB,EAA6Bv1C,MAA7B,EAAqC,YAArC;AACA82D,cAAWtvB,WAAX,CAAwB+N,GAAxB,EAA6Bv1C,MAA7B,EAAqC,mBAArC;;AAEA,OAAIgvC,WAAWhvC,OAAOgvC,QAAtB;;AAEA,OAAKA,QAAL,EAAgB;;AAEf,QAAIC,QAAQD,SAASC,KAArB;;AAEA,QAAKjB,aAAajQ,mBAAlB,EAAwC;;AAEvC,SAAKiR,SAASmoB,WAAT,KAAyBxiF,SAA9B,EAA0C;;AAEzC;AACA;AACA;AACA;AACA;AACA;;;AAGA,UAAIkrB,OAAOjrB,KAAKmR,IAAL,CAAWkpD,MAAMh5D,MAAN,GAAe,CAA1B,CAAX,CAVyC,CAUC;AAC1C4pB,aAAOvf,MAAMwC,cAAN,CAAsB+c,IAAtB,CAAP;AACAA,aAAOjrB,KAAKyM,GAAL,CAAUwe,IAAV,EAAgB,CAAhB,CAAP;;AAEA,UAAIu3D,eAAe,IAAI59C,YAAJ,CAAkB3Z,OAAOA,IAAP,GAAc,CAAhC,CAAnB,CAdyC,CAce;AACxDu3D,mBAAa/zE,GAAb,CAAkB2rD,SAASooB,YAA3B,EAfyC,CAeE;;AAE3C,UAAID,cAAc,IAAI14D,WAAJ,CAAiB24D,YAAjB,EAA+Bv3D,IAA/B,EAAqCA,IAArC,EAA2C1iB,UAA3C,EAAuDR,SAAvD,CAAlB;AACAw6E,kBAAYnrC,WAAZ,GAA0B,IAA1B;;AAEAgjB,eAASooB,YAAT,GAAwBA,YAAxB;AACApoB,eAASmoB,WAAT,GAAuBA,WAAvB;AACAnoB,eAASqoB,eAAT,GAA2Bx3D,IAA3B;AAEA;;AAEDi3D,gBAAW90B,QAAX,CAAqBuT,GAArB,EAA0B,aAA1B,EAAyCvG,SAASmoB,WAAlD;AACAL,gBAAW90B,QAAX,CAAqBuT,GAArB,EAA0B,iBAA1B,EAA6CvG,SAASqoB,eAAtD;AAEA,KA/BD,MA+BO;;AAENP,gBAAWtvB,WAAX,CAAwB+N,GAAxB,EAA6BvG,QAA7B,EAAuC,cAAvC;AAEA;AAED;AAED;;AAED,MAAK4nB,eAAL,EAAuB;;AAEtBE,cAAW90B,QAAX,CAAqBuT,GAArB,EAA0B,qBAA1B,EAAiD6Z,MAAMF,mBAAvD;AACA4H,cAAW90B,QAAX,CAAqBuT,GAArB,EAA0B,uBAA1B,EAAmD6Z,MAAMD,qBAAzD;;AAEA,OAAKnvC,SAASvL,MAAd,EAAuB;;AAEtB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA6iD,kCAA+BP,UAA/B,EAA2CF,aAA3C;AAEA;;AAED;;AAEA,OAAKziD,OAAO4L,SAAS5L,GAArB,EAA2B;;AAE1BmjD,uBAAoBR,UAApB,EAAgC3iD,GAAhC;AAEA;;AAED,OAAK4L,SAASgS,mBAAd,EAAoC;;AAEnCwlC,0BAAuBT,UAAvB,EAAmC/2C,QAAnC;AAEA,IAJD,MAIO,IAAKA,SAASk3C,qBAAd,EAAsC;;AAE5CM,0BAAuBT,UAAvB,EAAmC/2C,QAAnC;AACAy3C,2BAAwBV,UAAxB,EAAoC/2C,QAApC;AAEA,IALM,MAKA,IAAKA,SAASuzC,mBAAd,EAAoC;;AAE1CiE,0BAAuBT,UAAvB,EAAmC/2C,QAAnC;;AAEA,QAAKA,SAAS03C,kBAAd,EAAmC;;AAElCC,yBAAqBZ,UAArB,EAAiC/2C,QAAjC;AAEA,KAJD,MAIO;;AAEN43C,0BAAsBb,UAAtB,EAAkC/2C,QAAlC;AAEA;AAED,IAdM,MAcA,IAAKA,SAASwzC,sBAAd,EAAuC;;AAE7CgE,0BAAuBT,UAAvB,EAAmC/2C,QAAnC;;AAEA,QAAKA,SAAS63C,sBAAd,EAAuC;;AAEtCC,6BAAyBf,UAAzB,EAAqC/2C,QAArC;AAEA,KAJD,MAIO;;AAEN+3C,6BAAyBhB,UAAzB,EAAqC/2C,QAArC;AAEA;AAED,IAdM,MAcA,IAAKA,SAAS8zB,mBAAd,EAAoC;;AAE1C0jB,0BAAuBT,UAAvB,EAAmC/2C,QAAnC;AACAg4C,yBAAsBjB,UAAtB,EAAkC/2C,QAAlC;AAEA,IALM,MAKA,IAAKA,SAAS+zB,sBAAd,EAAuC;;AAE7CyjB,0BAAuBT,UAAvB,EAAmC/2C,QAAnC;AACAi4C,4BAAyBlB,UAAzB,EAAqC/2C,QAArC;AAEA,IALM,MAKA,IAAKA,SAASyzC,oBAAd,EAAqC;;AAE3C+D,0BAAuBT,UAAvB,EAAmC/2C,QAAnC;AACAk4C,0BAAuBnB,UAAvB,EAAmC/2C,QAAnC;AAEA,IALM,MAKA,IAAKA,SAASm4C,mBAAd,EAAoC;;AAE1CC,wBAAqBrB,UAArB,EAAiC/2C,QAAjC;;AAEA,QAAKA,SAASq4C,oBAAd,EAAqC;;AAEpCC,yBAAqBvB,UAArB,EAAiC/2C,QAAjC;AAEA;AAED,IAVM,MAUA,IAAKA,SAASu4C,gBAAd,EAAiC;;AAEvCC,0BAAuBzB,UAAvB,EAAmC/2C,QAAnC;AAEA,IAJM,MAIA,IAAKA,SAASy4C,gBAAd,EAAiC;;AAEvC1B,eAAWvmD,KAAX,CAAiBz7B,KAAjB,GAAyBirC,SAASxP,KAAlC;AACAumD,eAAW/kD,OAAX,CAAmBj9B,KAAnB,GAA2BirC,SAAShO,OAApC;AAEA;;AAED;AACA;;AAEA,OAAK+kD,WAAW2B,KAAX,KAAqB/jF,SAA1B,EAAsCoiF,WAAW2B,KAAX,CAAiB3jF,KAAjB,GAAyB+8B,YAAY6mD,KAArC;AACtC,OAAK5B,WAAW6B,KAAX,KAAqBjkF,SAA1B,EAAsCoiF,WAAW6B,KAAX,CAAiB7jF,KAAjB,GAAyB+8B,YAAY+mD,KAArC;;AAEtC1xB,iBAAcM,MAAd,CAAsB8N,GAAtB,EAA2B4gB,mBAAmBM,YAA9C,EAA4DM,UAA5D,EAAwE3H,KAAxE;AAEA;;AAED,MAAKpvC,SAAS4S,gBAAT,IAA6B5S,SAAS2S,kBAAT,KAAgC,IAAlE,EAAyE;;AAExEwU,iBAAcM,MAAd,CAAsB8N,GAAtB,EAA2B4gB,mBAAmBM,YAA9C,EAA4DM,UAA5D,EAAwE3H,KAAxE;AACApvC,YAAS2S,kBAAT,GAA8B,KAA9B;AAEA;;AAED;;AAEAmkC,aAAW90B,QAAX,CAAqBuT,GAArB,EAA0B,iBAA1B,EAA6Cv1C,OAAO2c,eAApD;AACAm6C,aAAW90B,QAAX,CAAqBuT,GAArB,EAA0B,cAA1B,EAA0Cv1C,OAAO8F,YAAjD;AACAgxD,aAAW90B,QAAX,CAAqBuT,GAArB,EAA0B,aAA1B,EAAyCv1C,OAAOvI,WAAhD;;AAEA,SAAOmqC,OAAP;AAEA;;AAED;;AAEA,UAAS41B,qBAAT,CAAgCtoD,QAAhC,EAA0C8Q,QAA1C,EAAqD;;AAEpD9Q,WAAS8C,OAAT,CAAiBj9B,KAAjB,GAAyBirC,SAAShO,OAAlC;;AAEA,MAAKgO,SAASxP,KAAd,EAAsB;;AAErBtB,YAAS6C,OAAT,CAAiBh9B,KAAjB,GAAyBirC,SAASxP,KAAlC;AAEA;;AAED,MAAKwP,SAASzJ,QAAd,EAAyB;;AAExBrH,YAASqH,QAAT,CAAkBxhC,KAAlB,CAAwBiP,IAAxB,CAA8Bg8B,SAASzJ,QAAvC,EAAkDvxB,cAAlD,CAAkEg7B,SAASmR,iBAA3E;AAEA;;AAED,MAAKnR,SAAS/N,GAAd,EAAoB;;AAEnB/C,YAAS+C,GAAT,CAAal9B,KAAb,GAAqBirC,SAAS/N,GAA9B;AAEA;;AAED,MAAK+N,SAAS7N,QAAd,EAAyB;;AAExBjD,YAASiD,QAAT,CAAkBp9B,KAAlB,GAA0BirC,SAAS7N,QAAnC;AAEA;;AAED,MAAK6N,SAAS3N,WAAd,EAA4B;;AAE3BnD,YAASmD,WAAT,CAAqBt9B,KAArB,GAA6BirC,SAAS3N,WAAtC;AAEA;;AAED,MAAK2N,SAASzN,MAAd,EAAuB;;AAEtBrD,YAASqD,MAAT,CAAgBx9B,KAAhB,GAAwBirC,SAASzN,MAAjC;;AAEA;AACA;AACA;AACA;AACArD,YAASsD,UAAT,CAAoBz9B,KAApB,GAA8B,EAAIirC,SAASzN,MAAT,IAAmByN,SAASzN,MAAT,CAAgB2oB,aAAvC,CAAF,GAA6D,CAA7D,GAAiE,CAAE,CAA/F;;AAEAhsB,YAASuD,YAAT,CAAsB19B,KAAtB,GAA8BirC,SAASvN,YAAvC;AACAvD,YAASwD,eAAT,CAAyB39B,KAAzB,GAAiCirC,SAAStN,eAA1C;;AAEAxD,YAASyD,WAAT,CAAqB59B,KAArB,GAA6B6/B,WAAWp/B,GAAX,CAAgBwqC,SAASzN,MAAzB,EAAkCuvC,aAA/D;AAEA;;AAED,MAAK9hC,SAAShN,QAAd,EAAyB;;AAExB9D,YAAS8D,QAAT,CAAkBj+B,KAAlB,GAA0BirC,SAAShN,QAAnC;AACA9D,YAAS+D,iBAAT,CAA2Bl+B,KAA3B,GAAmCirC,SAAS/M,iBAA5C;AAEA;;AAED,MAAK+M,SAASnN,KAAd,EAAsB;;AAErB3D,YAAS2D,KAAT,CAAe99B,KAAf,GAAuBirC,SAASnN,KAAhC;AACA3D,YAAS4D,cAAT,CAAwB/9B,KAAxB,GAAgCirC,SAASlN,cAAzC;AAEA;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAIgmD,UAAJ;;AAEA,MAAK94C,SAAS/N,GAAd,EAAoB;;AAEnB6mD,gBAAa94C,SAAS/N,GAAtB;AAEA,GAJD,MAIO,IAAK+N,SAAS3N,WAAd,EAA4B;;AAElCymD,gBAAa94C,SAAS3N,WAAtB;AAEA,GAJM,MAIA,IAAK2N,SAASrM,eAAd,EAAgC;;AAEtCmlD,gBAAa94C,SAASrM,eAAtB;AAEA,GAJM,MAIA,IAAKqM,SAASxM,SAAd,EAA0B;;AAEhCslD,gBAAa94C,SAASxM,SAAtB;AAEA,GAJM,MAIA,IAAKwM,SAAS3M,OAAd,EAAwB;;AAE9BylD,gBAAa94C,SAAS3M,OAAtB;AAEA,GAJM,MAIA,IAAK2M,SAASjM,YAAd,EAA6B;;AAEnC+kD,gBAAa94C,SAASjM,YAAtB;AAEA,GAJM,MAIA,IAAKiM,SAAS/L,YAAd,EAA6B;;AAEnC6kD,gBAAa94C,SAAS/L,YAAtB;AAEA,GAJM,MAIA,IAAK+L,SAAS7N,QAAd,EAAyB;;AAE/B2mD,gBAAa94C,SAAS7N,QAAtB;AAEA,GAJM,MAIA,IAAK6N,SAAS7M,WAAd,EAA4B;;AAElC2lD,gBAAa94C,SAAS7M,WAAtB;AAEA;;AAED,MAAK2lD,eAAenkF,SAApB,EAAgC;;AAE/B;AACA,OAAKmkF,WAAW36D,mBAAhB,EAAsC;;AAErC26D,iBAAaA,WAAW/6D,OAAxB;AAEA;;AAED,OAAK+6D,WAAW/9D,gBAAX,KAAgC,IAArC,EAA4C;;AAE3C+9D,eAAWt9D,YAAX;AAEA;;AAED0T,YAASgD,WAAT,CAAqBn9B,KAArB,CAA2BiP,IAA3B,CAAiC80E,WAAWznE,MAA5C;AAEA;AAED;;AAED,UAAS+mE,mBAAT,CAA8BlpD,QAA9B,EAAwC8Q,QAAxC,EAAmD;;AAElD9Q,WAAS6C,OAAT,CAAiBh9B,KAAjB,GAAyBirC,SAASxP,KAAlC;AACAtB,WAAS8C,OAAT,CAAiBj9B,KAAjB,GAAyBirC,SAAShO,OAAlC;AAEA;;AAED,UAASsmD,mBAAT,CAA8BppD,QAA9B,EAAwC8Q,QAAxC,EAAmD;;AAElD9Q,WAAS8H,QAAT,CAAkBjiC,KAAlB,GAA0BirC,SAAShJ,QAAnC;AACA9H,WAAS+H,SAAT,CAAmBliC,KAAnB,GAA2BirC,SAAShJ,QAAT,GAAoBgJ,SAASsR,OAAxD;AACApiB,WAASpgB,KAAT,CAAe/Z,KAAf,GAAuBirC,SAASlxB,KAAhC;AAEA;;AAED,UAAS0pE,qBAAT,CAAgCtpD,QAAhC,EAA0C8Q,QAA1C,EAAqD;;AAEpD9Q,WAAS6C,OAAT,CAAiBh9B,KAAjB,GAAyBirC,SAASxP,KAAlC;AACAtB,WAAS8C,OAAT,CAAiBj9B,KAAjB,GAAyBirC,SAAShO,OAAlC;AACA9C,WAASrP,IAAT,CAAc9qB,KAAd,GAAsBirC,SAASngB,IAAT,GAAgBswD,WAAtC;AACAjhD,WAASpgB,KAAT,CAAe/Z,KAAf,GAAuBm7E,UAAU,GAAjC;;AAEAhhD,WAAS+C,GAAT,CAAal9B,KAAb,GAAqBirC,SAAS/N,GAA9B;;AAEA,MAAK+N,SAAS/N,GAAT,KAAiB,IAAtB,EAA6B;;AAE5B,OAAK+N,SAAS/N,GAAT,CAAalX,gBAAb,KAAkC,IAAvC,EAA8C;;AAE7CilB,aAAS/N,GAAT,CAAazW,YAAb;AAEA;;AAED0T,YAASgD,WAAT,CAAqBn9B,KAArB,CAA2BiP,IAA3B,CAAiCg8B,SAAS/N,GAAT,CAAa5gB,MAA9C;AAEA;AAED;;AAED,UAASkmE,kBAAT,CAA6BroD,QAA7B,EAAuCkF,GAAvC,EAA6C;;AAE5ClF,WAASsF,QAAT,CAAkBz/B,KAAlB,GAA0Bq/B,IAAI5D,KAA9B;;AAEA,MAAK4D,IAAIwkC,KAAT,EAAiB;;AAEhB1pC,YAASoF,OAAT,CAAiBv/B,KAAjB,GAAyBq/B,IAAIriB,IAA7B;AACAmd,YAASqF,MAAT,CAAgBx/B,KAAhB,GAAwBq/B,IAAIpiB,GAA5B;AAEA,GALD,MAKO,IAAKoiB,IAAI67B,SAAT,EAAqB;;AAE3B/gC,YAASmF,UAAT,CAAoBt/B,KAApB,GAA4Bq/B,IAAIykC,OAAhC;AAEA;AAED;;AAED,UAAS4e,sBAAT,CAAiCvoD,QAAjC,EAA2C8Q,QAA3C,EAAsD;;AAErD,MAAKA,SAAS7M,WAAd,EAA4B;;AAE3BjE,YAASiE,WAAT,CAAqBp+B,KAArB,GAA6BirC,SAAS7M,WAAtC;AAEA;AAED;;AAED,UAASykD,oBAAT,CAA+B1oD,QAA/B,EAAyC8Q,QAAzC,EAAoD;;AAEnD9Q,WAASuH,QAAT,CAAkB1hC,KAAlB,GAA0BirC,SAASvJ,QAAnC;AACAvH,WAASwH,SAAT,CAAmB3hC,KAAnB,GAA2BH,KAAKyM,GAAL,CAAU2+B,SAAStJ,SAAnB,EAA8B,IAA9B,CAA3B,CAHmD,CAGc;;AAEjE,MAAKsJ,SAAS7M,WAAd,EAA4B;;AAE3BjE,YAASiE,WAAT,CAAqBp+B,KAArB,GAA6BirC,SAAS7M,WAAtC;AAEA;;AAED,MAAK6M,SAAS3M,OAAd,EAAwB;;AAEvBnE,YAASmE,OAAT,CAAiBt+B,KAAjB,GAAyBirC,SAAS3M,OAAlC;AACAnE,YAASoE,SAAT,CAAmBv+B,KAAnB,GAA2BirC,SAAS1M,SAApC;AACA,OAAK0M,SAASqP,IAAT,KAAkB92C,QAAvB,EAAkC22B,SAASoE,SAAT,CAAmBv+B,KAAnB,IAA4B,CAAE,CAA9B;AAElC;;AAED,MAAKirC,SAASxM,SAAd,EAA0B;;AAEzBtE,YAASsE,SAAT,CAAmBz+B,KAAnB,GAA2BirC,SAASxM,SAApC;AACAtE,YAASuE,WAAT,CAAqB1+B,KAArB,CAA2BiP,IAA3B,CAAiCg8B,SAASvM,WAA1C;AACA,OAAKuM,SAASqP,IAAT,KAAkB92C,QAAvB,EAAkC22B,SAASuE,WAAT,CAAqB1+B,KAArB,CAA2B6Q,MAA3B;AAElC;;AAED,MAAKo6B,SAASrM,eAAd,EAAgC;;AAE/BzE,YAASyE,eAAT,CAAyB5+B,KAAzB,GAAiCirC,SAASrM,eAA1C;AACAzE,YAAS0E,iBAAT,CAA2B7+B,KAA3B,GAAmCirC,SAASpM,iBAA5C;AACA1E,YAAS2E,gBAAT,CAA0B9+B,KAA1B,GAAkCirC,SAASnM,gBAA3C;AAEA;AAED;;AAED,UAAS8jD,mBAAT,CAA8BzoD,QAA9B,EAAwC8Q,QAAxC,EAAmD;;AAElD43C,uBAAsB1oD,QAAtB,EAAgC8Q,QAAhC;;AAEA,MAAKA,SAAS7L,WAAd,EAA4B;;AAE3BjF,YAASiF,WAAT,CAAqBp/B,KAArB,GAA6BirC,SAAS7L,WAAtC;AAEA;AAED;;AAED,UAAS4jD,uBAAT,CAAkC7oD,QAAlC,EAA4C8Q,QAA5C,EAAuD;;AAEtD9Q,WAAS0H,SAAT,CAAmB7hC,KAAnB,GAA2BirC,SAASpJ,SAApC;AACA1H,WAAS2H,SAAT,CAAmB9hC,KAAnB,GAA2BirC,SAASnJ,SAApC;;AAEA,MAAKmJ,SAASjM,YAAd,EAA6B;;AAE5B7E,YAAS6E,YAAT,CAAsBh/B,KAAtB,GAA8BirC,SAASjM,YAAvC;AAEA;;AAED,MAAKiM,SAAS/L,YAAd,EAA6B;;AAE5B/E,YAAS+E,YAAT,CAAsBl/B,KAAtB,GAA8BirC,SAAS/L,YAAvC;AAEA;;AAED,MAAK+L,SAAS7M,WAAd,EAA4B;;AAE3BjE,YAASiE,WAAT,CAAqBp+B,KAArB,GAA6BirC,SAAS7M,WAAtC;AAEA;;AAED,MAAK6M,SAAS3M,OAAd,EAAwB;;AAEvBnE,YAASmE,OAAT,CAAiBt+B,KAAjB,GAAyBirC,SAAS3M,OAAlC;AACAnE,YAASoE,SAAT,CAAmBv+B,KAAnB,GAA2BirC,SAAS1M,SAApC;AACA,OAAK0M,SAASqP,IAAT,KAAkB92C,QAAvB,EAAkC22B,SAASoE,SAAT,CAAmBv+B,KAAnB,IAA4B,CAAE,CAA9B;AAElC;;AAED,MAAKirC,SAASxM,SAAd,EAA0B;;AAEzBtE,YAASsE,SAAT,CAAmBz+B,KAAnB,GAA2BirC,SAASxM,SAApC;AACAtE,YAASuE,WAAT,CAAqB1+B,KAArB,CAA2BiP,IAA3B,CAAiCg8B,SAASvM,WAA1C;AACA,OAAKuM,SAASqP,IAAT,KAAkB92C,QAAvB,EAAkC22B,SAASuE,WAAT,CAAqB1+B,KAArB,CAA2B6Q,MAA3B;AAElC;;AAED,MAAKo6B,SAASrM,eAAd,EAAgC;;AAE/BzE,YAASyE,eAAT,CAAyB5+B,KAAzB,GAAiCirC,SAASrM,eAA1C;AACAzE,YAAS0E,iBAAT,CAA2B7+B,KAA3B,GAAmCirC,SAASpM,iBAA5C;AACA1E,YAAS2E,gBAAT,CAA0B9+B,KAA1B,GAAkCirC,SAASnM,gBAA3C;AAEA;;AAED,MAAKmM,SAASzN,MAAd,EAAuB;;AAEtB;AACArD,YAAS4H,eAAT,CAAyB/hC,KAAzB,GAAiCirC,SAASlJ,eAA1C;AAEA;AAED;;AAED,UAASghD,uBAAT,CAAkC5oD,QAAlC,EAA4C8Q,QAA5C,EAAuD;;AAEtD9Q,WAAS2I,SAAT,CAAmB9iC,KAAnB,GAA2BirC,SAASnI,SAApC;AACA3I,WAAS4I,kBAAT,CAA4B/iC,KAA5B,GAAoCirC,SAASlI,kBAA7C;;AAEAigD,0BAAyB7oD,QAAzB,EAAmC8Q,QAAnC;AAEA;;AAED,UAASg4C,oBAAT,CAA+B9oD,QAA/B,EAAyC8Q,QAAzC,EAAoD;;AAEnD,MAAKA,SAASrM,eAAd,EAAgC;;AAE/BzE,YAASyE,eAAT,CAAyB5+B,KAAzB,GAAiCirC,SAASrM,eAA1C;AACAzE,YAAS0E,iBAAT,CAA2B7+B,KAA3B,GAAmCirC,SAASpM,iBAA5C;AACA1E,YAAS2E,gBAAT,CAA0B9+B,KAA1B,GAAkCirC,SAASnM,gBAA3C;AAEA;AAED;;AAED,UAASokD,uBAAT,CAAkC/oD,QAAlC,EAA4C8Q,QAA5C,EAAuD;;AAEtD,MAAKA,SAASrM,eAAd,EAAgC;;AAE/BzE,YAASyE,eAAT,CAAyB5+B,KAAzB,GAAiCirC,SAASrM,eAA1C;AACAzE,YAAS0E,iBAAT,CAA2B7+B,KAA3B,GAAmCirC,SAASpM,iBAA5C;AACA1E,YAAS2E,gBAAT,CAA0B9+B,KAA1B,GAAkCirC,SAASnM,gBAA3C;AAEA;;AAED3E,WAASuI,iBAAT,CAA2B1iC,KAA3B,CAAiCiP,IAAjC,CAAuCg8B,SAASvI,iBAAhD;AACAvI,WAASwI,YAAT,CAAsB3iC,KAAtB,GAA8BirC,SAAStI,YAAvC;AACAxI,WAASyI,WAAT,CAAqB5iC,KAArB,GAA6BirC,SAASrI,WAAtC;AAEA;;AAED,UAASugD,qBAAT,CAAgChpD,QAAhC,EAA0C8Q,QAA1C,EAAqD;;AAEpD,MAAKA,SAAS3M,OAAd,EAAwB;;AAEvBnE,YAASmE,OAAT,CAAiBt+B,KAAjB,GAAyBirC,SAAS3M,OAAlC;AACAnE,YAASoE,SAAT,CAAmBv+B,KAAnB,GAA2BirC,SAAS1M,SAApC;AACA,OAAK0M,SAASqP,IAAT,KAAkB92C,QAAvB,EAAkC22B,SAASoE,SAAT,CAAmBv+B,KAAnB,IAA4B,CAAE,CAA9B;AAElC;;AAED,MAAKirC,SAASxM,SAAd,EAA0B;;AAEzBtE,YAASsE,SAAT,CAAmBz+B,KAAnB,GAA2BirC,SAASxM,SAApC;AACAtE,YAASuE,WAAT,CAAqB1+B,KAArB,CAA2BiP,IAA3B,CAAiCg8B,SAASvM,WAA1C;AACA,OAAKuM,SAASqP,IAAT,KAAkB92C,QAAvB,EAAkC22B,SAASuE,WAAT,CAAqB1+B,KAArB,CAA2B6Q,MAA3B;AAElC;;AAED,MAAKo6B,SAASrM,eAAd,EAAgC;;AAE/BzE,YAASyE,eAAT,CAAyB5+B,KAAzB,GAAiCirC,SAASrM,eAA1C;AACAzE,YAAS0E,iBAAT,CAA2B7+B,KAA3B,GAAmCirC,SAASpM,iBAA5C;AACA1E,YAAS2E,gBAAT,CAA0B9+B,KAA1B,GAAkCirC,SAASnM,gBAA3C;AAEA;AAED;;AAED;;AAEA,UAASyjD,6BAAT,CAAwCpoD,QAAxC,EAAkDn6B,KAAlD,EAA0D;;AAEzDm6B,WAASwF,iBAAT,CAA2BsX,WAA3B,GAAyCj3C,KAAzC;;AAEAm6B,WAASyF,iBAAT,CAA2BqX,WAA3B,GAAyCj3C,KAAzC;AACAm6B,WAASuG,WAAT,CAAqBuW,WAArB,GAAmCj3C,KAAnC;AACAm6B,WAASiG,UAAT,CAAoB6W,WAApB,GAAkCj3C,KAAlC;AACAm6B,WAAS+G,cAAT,CAAwB+V,WAAxB,GAAsCj3C,KAAtC;AACAm6B,WAAS4G,gBAAT,CAA0BkW,WAA1B,GAAwCj3C,KAAxC;AAEA;;AAED;;AAEA,UAASouD,gBAAT,GAA4B;;AAE3B,MAAI41B,cAAc/I,iBAAlB;;AAEA,MAAK+I,eAAe/qB,aAAanR,WAAjC,EAA+C;;AAE9Cz4C,WAAQC,IAAR,CAAc,wCAAwC00E,WAAxC,GAAsD,8CAAtD,GAAuG/qB,aAAanR,WAAlI;AAEA;;AAEDmzB,uBAAqB,CAArB;;AAEA,SAAO+I,WAAP;AAEA;;AAED,MAAK51B,gBAAL,GAAwBA,gBAAxB;;AAEA;AACA,MAAKuB,YAAL,GAAsB,YAAY;;AAEjC,MAAIs0B,SAAS,KAAb;;AAEA;AACA,SAAO,SAASt0B,YAAT,CAAuB3mC,OAAvB,EAAgCklD,IAAhC,EAAuC;;AAE7C,OAAKllD,WAAWA,QAAQI,mBAAxB,EAA8C;;AAE7C,QAAK,CAAE66D,MAAP,EAAgB;;AAEf50E,aAAQC,IAAR,CAAc,8GAAd;AACA20E,cAAS,IAAT;AAEA;;AAEDj7D,cAAUA,QAAQA,OAAlB;AAEA;;AAEDnC,YAAS8oC,YAAT,CAAuB3mC,OAAvB,EAAgCklD,IAAhC;AAEA,GAjBD;AAmBA,EAxBqB,EAAtB;;AA0BA,MAAKgW,UAAL,GAAoB,YAAY;;AAE/B,MAAID,SAAS,KAAb;;AAEA,SAAO,SAASC,UAAT,CAAqBl7D,OAArB,EAA8BklD,IAA9B,EAAqC;;AAE3C,OAAK,CAAE+V,MAAP,EAAgB;;AAEf50E,YAAQC,IAAR,CAAc,2EAAd;AACA20E,aAAS,IAAT;AAEA;;AAEDp9D,YAAS8oC,YAAT,CAAuB3mC,OAAvB,EAAgCklD,IAAhC;AAEA,GAXD;AAaA,EAjBmB,EAApB;;AAmBA,MAAKre,cAAL,GAAwB,YAAY;;AAEnC,MAAIo0B,SAAS,KAAb;;AAEA,SAAO,SAASp0B,cAAT,CAAyB7mC,OAAzB,EAAkCklD,IAAlC,EAAyC;;AAE/C;AACA,OAAKllD,WAAWA,QAAQS,uBAAxB,EAAkD;;AAEjD,QAAK,CAAEw6D,MAAP,EAAgB;;AAEf50E,aAAQC,IAAR,CAAc,qHAAd;AACA20E,cAAS,IAAT;AAEA;;AAEDj7D,cAAUA,QAAQA,OAAlB;AAEA;;AAED;AACA;AACA,OAAOA,WAAWA,QAAQm9B,aAArB,IACFzrB,MAAMC,OAAN,CAAe3R,QAAQ9D,KAAvB,KAAkC8D,QAAQ9D,KAAR,CAAchkB,MAAd,KAAyB,CAD9D,EACoE;;AAEnE;;AAEA;AACA2lB,aAASgpC,cAAT,CAAyB7mC,OAAzB,EAAkCklD,IAAlC;AAEA,IARD,MAQO;;AAEN;;AAEArnD,aAASooD,qBAAT,CAAgCjmD,OAAhC,EAAyCklD,IAAzC;AAEA;AAED,GAlCD;AAoCA,EAxCuB,EAAxB;;AA0CA;;AAEA,MAAKoK,cAAL,GAAsB,UAAWt4E,KAAX,EAAmB;;AAExCu6E,iBAAev6E,KAAf;AAEA,EAJD;;AAMA,MAAK86D,eAAL,GAAuB,YAAY;;AAElC,SAAO0f,oBAAP;AAEA,EAJD;;AAMA,MAAKpZ,eAAL,GAAuB,UAAWmM,YAAX,EAA0B;;AAEhDiN,yBAAuBjN,YAAvB;;AAEA,MAAKA,gBAAgB1tC,WAAWp/B,GAAX,CAAgB8sE,YAAhB,EAA+BQ,kBAA/B,KAAsDnuE,SAA3E,EAAuF;;AAEtFinB,YAASyqD,iBAAT,CAA4B/D,YAA5B;AAEA;;AAED,MAAI2C,cAAcqK,YAAlB;AACA,MAAIrJ,SAAS,KAAb;;AAEA,MAAK3D,YAAL,EAAoB;;AAEnB,OAAIQ,qBAAqBluC,WAAWp/B,GAAX,CAAgB8sE,YAAhB,EAA+BQ,kBAAxD;;AAEA,OAAKR,aAAa9jD,uBAAlB,EAA4C;;AAE3CymD,kBAAcnC,mBAAoBR,aAAahkD,cAAjC,CAAd;AACA2nD,aAAS,IAAT;AAEA,IALD,MAKO;;AAENhB,kBAAcnC,kBAAd;AAEA;;AAED+M,oBAAiB7rE,IAAjB,CAAuBs+D,aAAaxkD,QAApC;AACAgyD,mBAAgB9rE,IAAhB,CAAsBs+D,aAAa1kD,OAAnC;AACAmyD,yBAAsBzN,aAAazkD,WAAnC;AAEA,GAnBD,MAmBO;;AAENgyD,oBAAiB7rE,IAAjB,CAAuBosE,SAAvB,EAAmCprE,cAAnC,CAAmDmrE,WAAnD;AACAL,mBAAgB9rE,IAAhB,CAAsBqsE,QAAtB,EAAiCrrE,cAAjC,CAAiDmrE,WAAjD;AACAJ,yBAAsBO,YAAtB;AAEA;;AAED,MAAKd,wBAAwBvK,WAA7B,EAA2C;;AAE1C1P,OAAI6P,eAAJ,CAAqB7P,IAAI8P,WAAzB,EAAsCJ,WAAtC;AACAuK,yBAAsBvK,WAAtB;AAEA;;AAEDjrB,QAAMl8B,QAAN,CAAgB+xD,gBAAhB;AACA71B,QAAMp8B,OAAN,CAAekyD,eAAf;AACA91B,QAAM2b,cAAN,CAAsBoa,mBAAtB;;AAEA,MAAK9J,MAAL,EAAc;;AAEb,OAAIpE,oBAAoBjtC,WAAWp/B,GAAX,CAAgB8sE,aAAavkD,OAA7B,CAAxB;AACAw3C,OAAI+P,oBAAJ,CAA0B/P,IAAI8P,WAA9B,EAA2C9P,IAAIiR,iBAA/C,EAAkEjR,IAAI8I,2BAAJ,GAAkCiE,aAAahkD,cAAjH,EAAiIujD,kBAAkBc,cAAnJ,EAAmKL,aAAa/jD,iBAAhL;AAEA;AAED,EA1DD;;AA4DA,MAAK26D,sBAAL,GAA8B,UAAW5W,YAAX,EAAyBntE,CAAzB,EAA4B4M,CAA5B,EAA+Bma,KAA/B,EAAsCC,MAAtC,EAA8Cgd,MAA9C,EAAuD;;AAEpF,MAAK,EAAImpC,gBAAgBA,aAAankD,mBAAjC,CAAL,EAA8D;;AAE7D/Z,WAAQyD,KAAR,CAAe,0FAAf;AACA;AAEA;;AAED,MAAIo9D,cAAcrwC,WAAWp/B,GAAX,CAAgB8sE,YAAhB,EAA+BQ,kBAAjD;;AAEA,MAAKmC,WAAL,EAAmB;;AAElB,OAAIkU,UAAU,KAAd;;AAEA,OAAKlU,gBAAgBuK,mBAArB,EAA2C;;AAE1Cja,QAAI6P,eAAJ,CAAqB7P,IAAI8P,WAAzB,EAAsCJ,WAAtC;;AAEAkU,cAAU,IAAV;AAEA;;AAED,OAAI;;AAEH,QAAIp7D,UAAUukD,aAAavkD,OAA3B;AACA,QAAIq7D,gBAAgBr7D,QAAQxD,MAA5B;AACA,QAAI0pD,cAAclmD,QAAQvnB,IAA1B;;AAEA,QAAK4iF,kBAAkBj8E,UAAlB,IAAgC87D,MAAMyG,OAAN,CAAe0Z,aAAf,MAAmC7jB,IAAIn0C,YAAJ,CAAkBm0C,IAAI8jB,gCAAtB,CAAxE,EAAmI;;AAElIj1E,aAAQyD,KAAR,CAAe,2GAAf;AACA;AAEA;;AAED,QAAKo8D,gBAAgB5nE,gBAAhB,IAAoC48D,MAAMyG,OAAN,CAAeuE,WAAf,MAAiC1O,IAAIn0C,YAAJ,CAAkBm0C,IAAI+jB,8BAAtB,CAArE,IAA+H;AACnI,MAAIrV,gBAAgBtnE,SAAhB,KAA+By1C,WAAW58C,GAAX,CAAgB,mBAAhB,KAAyC48C,WAAW58C,GAAX,CAAgB,0BAAhB,CAAxE,CAAJ,CADI,IAC4H;AAChI,MAAIyuE,gBAAgBrnE,aAAhB,IAAiCw1C,WAAW58C,GAAX,CAAgB,6BAAhB,CAArC,CAFD,EAE0F;;AAEzF4O,aAAQyD,KAAR,CAAe,qHAAf;AACA;AAEA;;AAED,QAAK0tD,IAAIgkB,sBAAJ,CAA4BhkB,IAAI8P,WAAhC,MAAkD9P,IAAIikB,oBAA3D,EAAkF;;AAEjF;;AAEA,SAAOrkF,KAAK,CAAL,IAAUA,KAAOmtE,aAAapmD,KAAb,GAAqBA,KAAxC,IAAuDna,KAAK,CAAL,IAAUA,KAAOugE,aAAanmD,MAAb,GAAsBA,MAAnG,EAAgH;;AAE/Go5C,UAAIkkB,UAAJ,CAAgBtkF,CAAhB,EAAmB4M,CAAnB,EAAsBma,KAAtB,EAA6BC,MAA7B,EAAqC88C,MAAMyG,OAAN,CAAe0Z,aAAf,CAArC,EAAqEngB,MAAMyG,OAAN,CAAeuE,WAAf,CAArE,EAAmG9qC,MAAnG;AAEA;AAED,KAVD,MAUO;;AAEN/0B,aAAQyD,KAAR,CAAe,4GAAf;AAEA;AAED,IAtCD,SAsCU;;AAET,QAAKsxE,OAAL,EAAe;;AAEd5jB,SAAI6P,eAAJ,CAAqB7P,IAAI8P,WAAzB,EAAsCmK,mBAAtC;AAEA;AAED;AAED;AAED,EAzED;;AA2EA,MAAKkK,wBAAL,GAAgC,UAAW5pE,QAAX,EAAqBiO,OAArB,EAA8B47D,KAA9B,EAAsC;;AAErE,MAAIz9D,QAAQ6B,QAAQ9D,KAAR,CAAciC,KAA1B;AACA,MAAIC,SAAS4B,QAAQ9D,KAAR,CAAckC,MAA3B;AACA,MAAIynD,WAAW3K,MAAMyG,OAAN,CAAe3hD,QAAQxD,MAAvB,CAAf;;AAEA,OAAKmqC,YAAL,CAAmB3mC,OAAnB,EAA4B,CAA5B;;AAEAw3C,MAAIqkB,cAAJ,CAAoBrkB,IAAI4I,UAAxB,EAAoCwb,SAAS,CAA7C,EAAgD/V,QAAhD,EAA0D9zD,SAAS3a,CAAnE,EAAsE2a,SAAS/N,CAA/E,EAAkFma,KAAlF,EAAyFC,MAAzF,EAAiG,CAAjG;AAEA,EAVD;;AAYA,MAAK09D,oBAAL,GAA4B,UAAW/pE,QAAX,EAAqBgqE,UAArB,EAAiCC,UAAjC,EAA6CJ,KAA7C,EAAqD;;AAEhF,MAAIz9D,QAAQ49D,WAAW7/D,KAAX,CAAiBiC,KAA7B;AACA,MAAIC,SAAS29D,WAAW7/D,KAAX,CAAiBkC,MAA9B;AACA,MAAIynD,WAAW3K,MAAMyG,OAAN,CAAeqa,WAAWx/D,MAA1B,CAAf;AACA,MAAIspD,SAAS5K,MAAMyG,OAAN,CAAeqa,WAAWvjF,IAA1B,CAAb;;AAEA,OAAKkuD,YAAL,CAAmBq1B,UAAnB,EAA+B,CAA/B;;AAEA,MAAKD,WAAWn7D,aAAhB,EAAgC;;AAE/B42C,OAAIykB,aAAJ,CAAmBzkB,IAAI4I,UAAvB,EAAmCwb,SAAS,CAA5C,EAA+C7pE,SAAS3a,CAAxD,EAA2D2a,SAAS/N,CAApE,EAAuEma,KAAvE,EAA8EC,MAA9E,EAAsFynD,QAAtF,EAAgGC,MAAhG,EAAwGiW,WAAW7/D,KAAX,CAAiByE,IAAzH;AAEA,GAJD,MAIO;;AAEN62C,OAAIykB,aAAJ,CAAmBzkB,IAAI4I,UAAvB,EAAmCwb,SAAS,CAA5C,EAA+C7pE,SAAS3a,CAAxD,EAA2D2a,SAAS/N,CAApE,EAAuE6hE,QAAvE,EAAiFC,MAAjF,EAAyFiW,WAAW7/D,KAApG;AAEA;AAED,EAnBD;AAqBA;;AAED;;;;;AAKA,SAASggE,OAAT,CAAkBzpD,KAAlB,EAAyBqoC,OAAzB,EAAmC;;AAElC,MAAKn+C,IAAL,GAAY,EAAZ;;AAEA,MAAK8V,KAAL,GAAa,IAAIZ,KAAJ,CAAWY,KAAX,CAAb;AACA,MAAKqoC,OAAL,GAAiBA,YAAYlkE,SAAd,GAA4BkkE,OAA5B,GAAsC,OAArD;AAEA;;AAEDohB,QAAQ5kF,SAAR,CAAkB46D,SAAlB,GAA8B,IAA9B;;AAEAgqB,QAAQ5kF,SAAR,CAAkByO,KAAlB,GAA0B,YAAY;;AAErC,QAAO,IAAIm2E,OAAJ,CAAa,KAAKzpD,KAAlB,EAAyB,KAAKqoC,OAA9B,CAAP;AAEA,CAJD;;AAMAohB,QAAQ5kF,SAAR,CAAkBomB,MAAlB,GAA2B,YAAW,UAAa;;AAElD,QAAO;AACNjlB,QAAM,SADA;AAENg6B,SAAO,KAAKA,KAAL,CAAWU,MAAX,EAFD;AAGN2nC,WAAS,KAAKA;AAHR,EAAP;AAMA,CARD;;AAUA;;;;;AAKA,SAASqhB,GAAT,CAAc1pD,KAAd,EAAqBze,IAArB,EAA2BC,GAA3B,EAAiC;;AAEhC,MAAK0I,IAAL,GAAY,EAAZ;;AAEA,MAAK8V,KAAL,GAAa,IAAIZ,KAAJ,CAAWY,KAAX,CAAb;;AAEA,MAAKze,IAAL,GAAcA,SAASpd,SAAX,GAAyBod,IAAzB,GAAgC,CAA5C;AACA,MAAKC,GAAL,GAAaA,QAAQrd,SAAV,GAAwBqd,GAAxB,GAA8B,IAAzC;AAEA;;AAEDkoE,IAAI7kF,SAAJ,CAAcujE,KAAd,GAAsB,IAAtB;;AAEAshB,IAAI7kF,SAAJ,CAAcyO,KAAd,GAAsB,YAAY;;AAEjC,QAAO,IAAIo2E,GAAJ,CAAS,KAAK1pD,KAAd,EAAqB,KAAKze,IAA1B,EAAgC,KAAKC,GAArC,CAAP;AAEA,CAJD;;AAMAkoE,IAAI7kF,SAAJ,CAAcomB,MAAd,GAAuB,YAAW,UAAa;;AAE9C,QAAO;AACNjlB,QAAM,KADA;AAENg6B,SAAO,KAAKA,KAAL,CAAWU,MAAX,EAFD;AAGNnf,QAAM,KAAKA,IAHL;AAINC,OAAK,KAAKA;AAJJ,EAAP;AAOA,CATD;;AAWA;;;;AAIA,SAASmoE,KAAT,GAAiB;;AAEhB/9C,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,OAAZ;;AAEA,MAAKmkD,UAAL,GAAkB,IAAlB;AACA,MAAKvmB,GAAL,GAAW,IAAX;AACA,MAAK0hD,gBAAL,GAAwB,IAAxB;;AAEA,MAAKxgB,UAAL,GAAkB,IAAlB,CAVgB,CAUQ;AAExB;;AAED6kB,MAAM9kF,SAAN,GAAkBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAErE0O,cAAao2E,KAFwD;;AAIrEn2E,OAAM,UAAW9N,MAAX,EAAmBoqC,SAAnB,EAA+B;;AAEpClE,WAAS/mC,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC,EAA4CoqC,SAA5C;;AAEA,MAAKpqC,OAAOykD,UAAP,KAAsB,IAA3B,EAAkC,KAAKA,UAAL,GAAkBzkD,OAAOykD,UAAP,CAAkB72C,KAAlB,EAAlB;AAClC,MAAK5N,OAAOk+B,GAAP,KAAe,IAApB,EAA2B,KAAKA,GAAL,GAAWl+B,OAAOk+B,GAAP,CAAWtwB,KAAX,EAAX;AAC3B,MAAK5N,OAAO4/E,gBAAP,KAA4B,IAAjC,EAAwC,KAAKA,gBAAL,GAAwB5/E,OAAO4/E,gBAAP,CAAwBhyE,KAAxB,EAAxB;;AAExC,OAAKwxD,UAAL,GAAkBp/D,OAAOo/D,UAAzB;AACA,OAAKv6C,gBAAL,GAAwB7kB,OAAO6kB,gBAA/B;;AAEA,SAAO,IAAP;AAEA,EAjBoE;;AAmBrEU,SAAQ,UAAWC,IAAX,EAAkB;;AAEzB,MAAIgD,OAAO0d,SAAS/mC,SAAT,CAAmBomB,MAAnB,CAA0BplB,IAA1B,CAAgC,IAAhC,EAAsCqlB,IAAtC,CAAX;;AAEA,MAAK,KAAKi/B,UAAL,KAAoB,IAAzB,EAAgCj8B,KAAKsB,MAAL,CAAY26B,UAAZ,GAAyB,KAAKA,UAAL,CAAgBl/B,MAAhB,CAAwBC,IAAxB,CAAzB;AAChC,MAAK,KAAK0Y,GAAL,KAAa,IAAlB,EAAyB1V,KAAKsB,MAAL,CAAYoU,GAAZ,GAAkB,KAAKA,GAAL,CAAS3Y,MAAT,EAAlB;;AAEzB,SAAOiD,IAAP;AAEA;;AA5BoE,CAApD,CAAlB;;AAgCA;;;;;;;;;;;;;AAaA,SAAS07D,cAAT,CAAyBt6C,UAAzB,EAAsC;;AAErCqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,gBAAZ;;AAEA,MAAKg6B,KAAL,GAAa,IAAIZ,KAAJ,CAAW,QAAX,CAAb;AACA,MAAKqC,GAAL,GAAW,IAAX;;AAEA,MAAKvY,QAAL,GAAgB,CAAhB;;AAEA,MAAK0a,GAAL,GAAW,KAAX;AACA,MAAKK,MAAL,GAAc,KAAd;;AAEA,MAAKsc,SAAL,CAAgBjR,UAAhB;AAEA;;AAEDs6C,eAAe/kF,SAAf,GAA2BC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAA3B;AACA+kF,eAAe/kF,SAAf,CAAyB0O,WAAzB,GAAuCq2E,cAAvC;AACAA,eAAe/kF,SAAf,CAAyBglF,gBAAzB,GAA4C,IAA5C;;AAEAD,eAAe/kF,SAAf,CAAyB2O,IAAzB,GAAgC,UAAW9N,MAAX,EAAoB;;AAEnDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKs6B,KAAL,CAAWxsB,IAAX,CAAiB9N,OAAOs6B,KAAxB;AACA,MAAKyB,GAAL,GAAW/7B,OAAO+7B,GAAlB;;AAEA,MAAKvY,QAAL,GAAgBxjB,OAAOwjB,QAAvB;;AAEA,QAAO,IAAP;AAEA,CAXD;;AAaA;;;;;AAKA,SAAS4gE,MAAT,CAAiBt6C,QAAjB,EAA4B;;AAE3B5D,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,QAAZ;;AAEA,MAAKwpC,QAAL,GAAkBA,aAAarrC,SAAf,GAA6BqrC,QAA7B,GAAwC,IAAIo6C,cAAJ,EAAxD;;AAEA,MAAK5yE,MAAL,GAAc,IAAIrE,OAAJ,CAAa,GAAb,EAAkB,GAAlB,CAAd;AAEA;;AAEDm3E,OAAOjlF,SAAP,GAAmBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAEtE0O,cAAau2E,MAFyD;;AAItEtE,WAAU,IAJ4D;;AAMtE92C,UAAW,YAAY;;AAEtB,MAAIq7C,iBAAiB,IAAI5wE,OAAJ,EAArB;AACA,MAAI6wE,gBAAgB,IAAI7wE,OAAJ,EAApB;AACA,MAAI8wE,aAAa,IAAI9wE,OAAJ,EAAjB;;AAEA,SAAO,SAASu1B,OAAT,CAAkB6Z,SAAlB,EAA6BG,UAA7B,EAA0C;;AAEhDshC,iBAAcxhE,qBAAd,CAAqC,KAAKvB,WAA1C;AACAshC,aAAUhG,GAAV,CAAcG,mBAAd,CAAmCsnC,aAAnC,EAAkDD,cAAlD;;AAEAE,cAAWxhE,kBAAX,CAA+B,KAAKxB,WAApC;AACA,OAAIijE,cAAcD,WAAWtlF,CAAX,GAAeslF,WAAW14E,CAA1B,GAA8B,CAAhD;;AAEA,OAAKy4E,cAAcl0E,iBAAd,CAAiCi0E,cAAjC,IAAoDG,WAAzD,EAAuE;;AAEvE,OAAI7yD,WAAWkxB,UAAUhG,GAAV,CAAcD,MAAd,CAAqBzsC,UAArB,CAAiCk0E,cAAjC,CAAf;;AAEA,OAAK1yD,WAAWkxB,UAAUhnC,IAArB,IAA6B8V,WAAWkxB,UAAU/mC,GAAvD,EAA6D;;AAE7DknC,cAAWriD,IAAX,CAAiB;;AAEhBgxB,cAAUA,QAFM;AAGhBvH,WAAOi6D,eAAez2E,KAAf,EAHS;AAIhBm/B,UAAM,IAJU;AAKhBjjB,YAAQ;;AALQ,IAAjB;AASA,GAvBD;AAyBA,EA/BU,EAN2D;;AAuCtElc,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAKi8B,QAA3B,EAAsCh8B,IAAtC,CAA4C,IAA5C,CAAP;AAEA,EA3CqE;;AA6CtEA,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBkmC,WAAS/mC,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKA,OAAOsR,MAAP,KAAkB7S,SAAvB,EAAmC,KAAK6S,MAAL,CAAYxD,IAAZ,CAAkB9N,OAAOsR,MAAzB;;AAEnC,SAAO,IAAP;AAEA;;AArDqE,CAApD,CAAnB;;AA0DA;;;;;;AAMA,SAASmzE,GAAT,GAAe;;AAEdv+C,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,KAAZ;;AAEAlB,QAAO8N,gBAAP,CAAyB,IAAzB,EAA+B;AAC9Bw3E,UAAQ;AACPl+C,eAAY,IADL;AAEP3nC,UAAO;AAFA;AADsB,EAA/B;AAOA;;AAED4lF,IAAItlF,SAAJ,GAAgBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAEnE0O,cAAa42E,GAFsD;;AAInE32E,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBkmC,WAAS/mC,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC,EAA4C,KAA5C;;AAEA,MAAI0kF,SAAS1kF,OAAO0kF,MAApB;;AAEA,OAAM,IAAItjF,IAAI,CAAR,EAAWC,IAAIqjF,OAAO3kF,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAIqiF,QAAQiB,OAAQtjF,CAAR,CAAZ;;AAEA,QAAKujF,QAAL,CAAelB,MAAM35D,MAAN,CAAalc,KAAb,EAAf,EAAqC61E,MAAM9xD,QAA3C;AAEA;;AAED,SAAO,IAAP;AAEA,EApBkE;;AAsBnEgzD,WAAU,UAAW76D,MAAX,EAAmB6H,QAAnB,EAA8B;;AAEvC,MAAKA,aAAalzB,SAAlB,EAA8BkzB,WAAW,CAAX;;AAE9BA,aAAWjzB,KAAKqR,GAAL,CAAU4hB,QAAV,CAAX;;AAEA,MAAI+yD,SAAS,KAAKA,MAAlB;;AAEA,OAAM,IAAIrjF,IAAI,CAAd,EAAiBA,IAAIqjF,OAAO3kF,MAA5B,EAAoCsB,GAApC,EAA2C;;AAE1C,OAAKswB,WAAW+yD,OAAQrjF,CAAR,EAAYswB,QAA5B,EAAuC;;AAEtC;AAEA;AAED;;AAED+yD,SAAO3jF,MAAP,CAAeM,CAAf,EAAkB,CAAlB,EAAqB,EAAEswB,UAAUA,QAAZ,EAAsB7H,QAAQA,MAA9B,EAArB;;AAEA,OAAK9b,GAAL,CAAU8b,MAAV;AAEA,EA5CkE;;AA8CnE86D,uBAAsB,UAAWjzD,QAAX,EAAsB;;AAE3C,MAAI+yD,SAAS,KAAKA,MAAlB;;AAEA,OAAM,IAAItjF,IAAI,CAAR,EAAWC,IAAIqjF,OAAO3kF,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAKuwB,WAAW+yD,OAAQtjF,CAAR,EAAYuwB,QAA5B,EAAuC;;AAEtC;AAEA;AAED;;AAED,SAAO+yD,OAAQtjF,IAAI,CAAZ,EAAgB0oB,MAAvB;AAEA,EA9DkE;;AAgEnEkf,UAAW,YAAY;;AAEtB,MAAI67C,iBAAiB,IAAIpxE,OAAJ,EAArB;;AAEA,SAAO,SAASu1B,OAAT,CAAkB6Z,SAAlB,EAA6BG,UAA7B,EAA0C;;AAEhD6hC,kBAAe/hE,qBAAf,CAAsC,KAAKvB,WAA3C;;AAEA,OAAIoQ,WAAWkxB,UAAUhG,GAAV,CAAcD,MAAd,CAAqBzsC,UAArB,CAAiC00E,cAAjC,CAAf;;AAEA,QAAKD,oBAAL,CAA2BjzD,QAA3B,EAAsCqX,OAAtC,CAA+C6Z,SAA/C,EAA0DG,UAA1D;AAEA,GARD;AAUA,EAdU,EAhEwD;;AAgFnEplC,SAAQ,YAAY;;AAEnB,MAAIjN,KAAK,IAAI8C,OAAJ,EAAT;AACA,MAAI7C,KAAK,IAAI6C,OAAJ,EAAT;;AAEA,SAAO,SAASmK,MAAT,CAAiByD,MAAjB,EAA0B;;AAEhC,OAAIqjE,SAAS,KAAKA,MAAlB;;AAEA,OAAKA,OAAO3kF,MAAP,GAAgB,CAArB,EAAyB;;AAExB4Q,OAAGmS,qBAAH,CAA0BzB,OAAOE,WAAjC;AACA3Q,OAAGkS,qBAAH,CAA0B,KAAKvB,WAA/B;;AAEA,QAAIoQ,WAAWhhB,GAAGR,UAAH,CAAeS,EAAf,CAAf;;AAEA8zE,WAAQ,CAAR,EAAY56D,MAAZ,CAAmB8c,OAAnB,GAA6B,IAA7B;;AAEA,SAAM,IAAIxlC,IAAI,CAAR,EAAWC,IAAIqjF,OAAO3kF,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,SAAKuwB,YAAY+yD,OAAQtjF,CAAR,EAAYuwB,QAA7B,EAAwC;;AAEvC+yD,aAAQtjF,IAAI,CAAZ,EAAgB0oB,MAAhB,CAAuB8c,OAAvB,GAAiC,KAAjC;AACA89C,aAAQtjF,CAAR,EAAY0oB,MAAZ,CAAmB8c,OAAnB,GAA6B,IAA7B;AAEA,MALD,MAKO;;AAEN;AAEA;AAED;;AAED,WAAQxlC,IAAIC,CAAZ,EAAeD,GAAf,EAAsB;;AAErBsjF,YAAQtjF,CAAR,EAAY0oB,MAAZ,CAAmB8c,OAAnB,GAA6B,KAA7B;AAEA;AAED;AAED,GApCD;AAsCA,EA3CO,EAhF2D;;AA6HnErhB,SAAQ,UAAWC,IAAX,EAAkB;;AAEzB,MAAIgD,OAAO0d,SAAS/mC,SAAT,CAAmBomB,MAAnB,CAA0BplB,IAA1B,CAAgC,IAAhC,EAAsCqlB,IAAtC,CAAX;;AAEAgD,OAAKsB,MAAL,CAAY46D,MAAZ,GAAqB,EAArB;;AAEA,MAAIA,SAAS,KAAKA,MAAlB;;AAEA,OAAM,IAAItjF,IAAI,CAAR,EAAWC,IAAIqjF,OAAO3kF,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAIqiF,QAAQiB,OAAQtjF,CAAR,CAAZ;;AAEAonB,QAAKsB,MAAL,CAAY46D,MAAZ,CAAmB/jF,IAAnB,CAAyB;AACxBmpB,YAAQ25D,MAAM35D,MAAN,CAAa/e,IADG;AAExB4mB,cAAU8xD,MAAM9xD;AAFQ,IAAzB;AAKA;;AAED,SAAOnJ,IAAP;AAEA;;AAlJkE,CAApD,CAAhB;;AAsJA;;;;;;;AAOA,SAASs8D,QAAT,CAAmB/rB,KAAnB,EAA0BgsB,YAA1B,EAAyC;;AAExC;;AAEAhsB,SAAQA,SAAS,EAAjB;;AAEA,MAAKA,KAAL,GAAaA,MAAM53D,KAAN,CAAa,CAAb,CAAb;AACA,MAAK+/E,YAAL,GAAoB,IAAI59C,YAAJ,CAAkB,KAAKy1B,KAAL,CAAWh5D,MAAX,GAAoB,EAAtC,CAApB;;AAEA;;AAEA,KAAKglF,iBAAiBtmF,SAAtB,EAAkC;;AAEjC,OAAKumF,iBAAL;AAEA,EAJD,MAIO;;AAEN,MAAK,KAAKjsB,KAAL,CAAWh5D,MAAX,KAAsBglF,aAAahlF,MAAxC,EAAiD;;AAEhD,QAAKglF,YAAL,GAAoBA,aAAa5jF,KAAb,CAAoB,CAApB,CAApB;AAEA,GAJD,MAIO;;AAEN+M,WAAQC,IAAR,CAAc,kDAAd;;AAEA,QAAK42E,YAAL,GAAoB,EAApB;;AAEA,QAAM,IAAI3jF,IAAI,CAAR,EAAWooB,KAAK,KAAKuvC,KAAL,CAAWh5D,MAAjC,EAAyCqB,IAAIooB,EAA7C,EAAiDpoB,GAAjD,EAAwD;;AAEvD,SAAK2jF,YAAL,CAAkBpkF,IAAlB,CAAwB,IAAI+Q,OAAJ,EAAxB;AAEA;AAED;AAED;AAED;;AAEDtS,OAAOK,MAAP,CAAeqlF,SAAS3lF,SAAxB,EAAmC;;AAElC6lF,oBAAmB,YAAY;;AAE9B,OAAKD,YAAL,GAAoB,EAApB;;AAEA,OAAM,IAAI3jF,IAAI,CAAR,EAAWooB,KAAK,KAAKuvC,KAAL,CAAWh5D,MAAjC,EAAyCqB,IAAIooB,EAA7C,EAAiDpoB,GAAjD,EAAwD;;AAEvD,OAAIge,UAAU,IAAI1N,OAAJ,EAAd;;AAEA,OAAK,KAAKqnD,KAAL,CAAY33D,CAAZ,CAAL,EAAuB;;AAEtBge,YAAQjH,UAAR,CAAoB,KAAK4gD,KAAL,CAAY33D,CAAZ,EAAgBmgB,WAApC;AAEA;;AAED,QAAKwjE,YAAL,CAAkBpkF,IAAlB,CAAwBye,OAAxB;AAEA;AAED,EApBiC;;AAsBlC62D,OAAM,YAAY;;AAEjB,MAAIgP,IAAJ,EAAU7jF,CAAV,EAAaooB,EAAb;;AAEA;;AAEA,OAAMpoB,IAAI,CAAJ,EAAOooB,KAAK,KAAKuvC,KAAL,CAAWh5D,MAA7B,EAAqCqB,IAAIooB,EAAzC,EAA6CpoB,GAA7C,EAAoD;;AAEnD6jF,UAAO,KAAKlsB,KAAL,CAAY33D,CAAZ,CAAP;;AAEA,OAAK6jF,IAAL,EAAY;;AAEXA,SAAK1jE,WAAL,CAAiBpJ,UAAjB,CAA6B,KAAK4sE,YAAL,CAAmB3jF,CAAnB,CAA7B;AAEA;AAED;;AAED;;AAEA,OAAMA,IAAI,CAAJ,EAAOooB,KAAK,KAAKuvC,KAAL,CAAWh5D,MAA7B,EAAqCqB,IAAIooB,EAAzC,EAA6CpoB,GAA7C,EAAoD;;AAEnD6jF,UAAO,KAAKlsB,KAAL,CAAY33D,CAAZ,CAAP;;AAEA,OAAK6jF,IAAL,EAAY;;AAEX,QAAKA,KAAK9+C,MAAL,IAAe8+C,KAAK9+C,MAAL,CAAY++C,MAAhC,EAAyC;;AAExCD,UAAK9pE,MAAL,CAAYhD,UAAZ,CAAwB8sE,KAAK9+C,MAAL,CAAY5kB,WAApC;AACA0jE,UAAK9pE,MAAL,CAAYtM,QAAZ,CAAsBo2E,KAAK1jE,WAA3B;AAEA,KALD,MAKO;;AAEN0jE,UAAK9pE,MAAL,CAAYrN,IAAZ,CAAkBm3E,KAAK1jE,WAAvB;AAEA;;AAED0jE,SAAK9pE,MAAL,CAAYF,SAAZ,CAAuBgqE,KAAKrrE,QAA5B,EAAsCqrE,KAAKprE,UAA3C,EAAuDorE,KAAKrsE,KAA5D;AAEA;AAED;AAED,EAjEiC;;AAmElCgF,SAAU,YAAY;;AAErB,MAAIunE,eAAe,IAAIzzE,OAAJ,EAAnB;AACA,MAAI0zE,iBAAiB,IAAI1zE,OAAJ,EAArB;;AAEA,SAAO,SAASkM,MAAT,GAAkB;;AAExB,OAAIm7C,QAAQ,KAAKA,KAAjB;AACA,OAAIgsB,eAAe,KAAKA,YAAxB;AACA,OAAI7D,eAAe,KAAKA,YAAxB;AACA,OAAID,cAAc,KAAKA,WAAvB;;AAEA;;AAEA,QAAM,IAAI7/E,IAAI,CAAR,EAAWooB,KAAKuvC,MAAMh5D,MAA5B,EAAoCqB,IAAIooB,EAAxC,EAA4CpoB,GAA5C,EAAmD;;AAElD;;AAEA,QAAI+Z,SAAS49C,MAAO33D,CAAP,IAAa23D,MAAO33D,CAAP,EAAWmgB,WAAxB,GAAsC6jE,cAAnD;;AAEAD,iBAAa3vE,gBAAb,CAA+B2F,MAA/B,EAAuC4pE,aAAc3jF,CAAd,CAAvC;AACA+jF,iBAAan0E,OAAb,CAAsBkwE,YAAtB,EAAoC9/E,IAAI,EAAxC;AAEA;;AAED,OAAK6/E,gBAAgBxiF,SAArB,EAAiC;;AAEhCwiF,gBAAYnrC,WAAZ,GAA0B,IAA1B;AAEA;AAED,GA1BD;AA4BA,EAjCO,EAnE0B;;AAsGlCloC,QAAO,YAAY;;AAElB,SAAO,IAAIk3E,QAAJ,CAAc,KAAK/rB,KAAnB,EAA0B,KAAKgsB,YAA/B,CAAP;AAEA,EA1GiC;;AA4GlCM,gBAAe,UAAW7gE,IAAX,EAAkB;;AAEhC,OAAM,IAAIpjB,IAAI,CAAR,EAAWooB,KAAK,KAAKuvC,KAAL,CAAWh5D,MAAjC,EAAyCqB,IAAIooB,EAA7C,EAAiDpoB,GAAjD,EAAwD;;AAEvD,OAAI6jF,OAAO,KAAKlsB,KAAL,CAAY33D,CAAZ,CAAX;;AAEA,OAAK6jF,KAAKzgE,IAAL,KAAcA,IAAnB,EAA0B;;AAEzB,WAAOygE,IAAP;AAEA;AAED;;AAED,SAAOxmF,SAAP;AAEA;;AA5HiC,CAAnC;;AAgIA;;;;;;AAMA,SAAS6mF,IAAT,GAAgB;;AAEfp/C,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,MAAZ;AAEA;;AAEDglF,KAAKnmF,SAAL,GAAiBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAEpE0O,cAAay3E,IAFuD;;AAIpEJ,SAAQ;;AAJ4D,CAApD,CAAjB;;AAQA;;;;;;AAMA,SAASK,WAAT,CAAsB76D,QAAtB,EAAgCof,QAAhC,EAA2C;;AAE1CyX,MAAKphD,IAAL,CAAW,IAAX,EAAiBuqB,QAAjB,EAA2Bof,QAA3B;;AAEA,MAAKxpC,IAAL,GAAY,aAAZ;;AAEA,MAAKklF,QAAL,GAAgB,UAAhB;AACA,MAAKC,UAAL,GAAkB,IAAI/zE,OAAJ,EAAlB;AACA,MAAKg0E,iBAAL,GAAyB,IAAIh0E,OAAJ,EAAzB;;AAEA,KAAIqnD,QAAQ,KAAK4sB,SAAL,EAAZ;AACA,KAAI7sB,WAAW,IAAIgsB,QAAJ,CAAc/rB,KAAd,CAAf;;AAEA,MAAK6sB,IAAL,CAAW9sB,QAAX,EAAqB,KAAKv3C,WAA1B;;AAEA,MAAKskE,oBAAL;AAEA;;AAEDN,YAAYpmF,SAAZ,GAAwBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAem8B,KAAKpiD,SAApB,CAAf,EAAgD;;AAEvE0O,cAAa03E,WAF0D;;AAIvE9rB,gBAAe,IAJwD;;AAMvEksB,YAAW,YAAY;;AAEtB,MAAI5sB,QAAQ,EAAZ;AAAA,MAAgBksB,IAAhB;AAAA,MAAsBa,KAAtB;AACA,MAAI1kF,CAAJ,EAAOooB,EAAP;;AAEA,MAAK,KAAKkB,QAAL,IAAiB,KAAKA,QAAL,CAAcquC,KAAd,KAAwBt6D,SAA9C,EAA0D;;AAEzD;;AAEA,QAAM2C,IAAI,CAAJ,EAAOooB,KAAK,KAAKkB,QAAL,CAAcquC,KAAd,CAAoBh5D,MAAtC,EAA8CqB,IAAIooB,EAAlD,EAAsDpoB,GAAtD,EAA6D;;AAE5D0kF,YAAQ,KAAKp7D,QAAL,CAAcquC,KAAd,CAAqB33D,CAArB,CAAR;;AAEA;;AAEA6jF,WAAO,IAAIK,IAAJ,EAAP;AACAvsB,UAAMp4D,IAAN,CAAYskF,IAAZ;;AAEA;;AAEAA,SAAKzgE,IAAL,GAAYshE,MAAMthE,IAAlB;AACAygE,SAAKrrE,QAAL,CAAc9I,SAAd,CAAyBg1E,MAAMC,GAA/B;AACAd,SAAKprE,UAAL,CAAgB/I,SAAhB,CAA2Bg1E,MAAME,IAAjC;AACA,QAAKF,MAAMG,GAAN,KAAcxnF,SAAnB,EAA+BwmF,KAAKrsE,KAAL,CAAW9H,SAAX,CAAsBg1E,MAAMG,GAA5B;AAE/B;;AAED;;AAEA,QAAM7kF,IAAI,CAAJ,EAAOooB,KAAK,KAAKkB,QAAL,CAAcquC,KAAd,CAAoBh5D,MAAtC,EAA8CqB,IAAIooB,EAAlD,EAAsDpoB,GAAtD,EAA6D;;AAE5D0kF,YAAQ,KAAKp7D,QAAL,CAAcquC,KAAd,CAAqB33D,CAArB,CAAR;;AAEA,QAAO0kF,MAAM3/C,MAAN,KAAiB,CAAE,CAArB,IAA8B2/C,MAAM3/C,MAAN,KAAiB,IAA/C,IAA2D4yB,MAAO+sB,MAAM3/C,MAAb,MAA0B1nC,SAA1F,EAAwG;;AAEvG;;AAEAs6D,WAAO+sB,MAAM3/C,MAAb,EAAsBn4B,GAAtB,CAA2B+qD,MAAO33D,CAAP,CAA3B;AAEA,KAND,MAMO;;AAEN;;AAEA,UAAK4M,GAAL,CAAU+qD,MAAO33D,CAAP,CAAV;AAEA;AAED;AAED;;AAED;AACA;;AAEA,OAAK2pB,iBAAL,CAAwB,IAAxB;;AAEA,SAAOguC,KAAP;AAEA,EAhEsE;;AAkEvE6sB,OAAM,UAAW9sB,QAAX,EAAqB2sB,UAArB,EAAkC;;AAEvC,OAAK3sB,QAAL,GAAgBA,QAAhB;;AAEA,MAAK2sB,eAAehnF,SAApB,EAAgC;;AAE/B,QAAKssB,iBAAL,CAAwB,IAAxB;;AAEA,QAAK+tC,QAAL,CAAcksB,iBAAd;;AAEAS,gBAAa,KAAKlkE,WAAlB;AAEA;;AAED,OAAKkkE,UAAL,CAAgB33E,IAAhB,CAAsB23E,UAAtB;AACA,OAAKC,iBAAL,CAAuBvtE,UAAvB,CAAmCstE,UAAnC;AAEA,EAnFsE;;AAqFvExP,OAAM,YAAY;;AAEjB,OAAKnd,QAAL,CAAcmd,IAAd;AAEA,EAzFsE;;AA2FvE4P,uBAAsB,YAAY;;AAEjC,MAAIjtE,KAAJ,EAAWxX,CAAX;;AAEA,MAAK,KAAKspB,QAAL,IAAiB,KAAKA,QAAL,CAAcC,UAApC,EAAiD;;AAEhD,QAAMvpB,IAAI,CAAV,EAAaA,IAAI,KAAKspB,QAAL,CAAcyhB,WAAd,CAA0BpsC,MAA3C,EAAmDqB,GAAnD,EAA0D;;AAEzD,QAAI8kF,KAAK,KAAKx7D,QAAL,CAAcyhB,WAAd,CAA2B/qC,CAA3B,CAAT;;AAEAwX,YAAQ,MAAMstE,GAAGp2E,eAAH,EAAd;;AAEA,QAAK8I,UAAU+P,QAAf,EAA0B;;AAEzBu9D,QAAGp3E,cAAH,CAAmB8J,KAAnB;AAEA,KAJD,MAIO;;AAENstE,QAAG/4E,GAAH,CAAQ,CAAR,EAAW,CAAX,EAAc,CAAd,EAAiB,CAAjB,EAFM,CAEgB;AAEtB;AAED;AAED,GApBD,MAoBO,IAAK,KAAKud,QAAL,IAAiB,KAAKA,QAAL,CAAcG,gBAApC,EAAuD;;AAE7D,OAAIs7D,MAAM,IAAIn/D,OAAJ,EAAV;;AAEA,OAAIo/D,aAAa,KAAK17D,QAAL,CAAcI,UAAd,CAAyBs7D,UAA1C;;AAEA,QAAMhlF,IAAI,CAAV,EAAaA,IAAIglF,WAAWzuE,KAA5B,EAAmCvW,GAAnC,EAA0C;;AAEzC+kF,QAAIlnF,CAAJ,GAAQmnF,WAAWj1E,IAAX,CAAiB/P,CAAjB,CAAR;AACA+kF,QAAIt6E,CAAJ,GAAQu6E,WAAWh1E,IAAX,CAAiBhQ,CAAjB,CAAR;AACA+kF,QAAI5yE,CAAJ,GAAQ6yE,WAAWxuE,IAAX,CAAiBxW,CAAjB,CAAR;AACA+kF,QAAIl4E,CAAJ,GAAQm4E,WAAW7+D,IAAX,CAAiBnmB,CAAjB,CAAR;;AAEAwX,YAAQ,MAAMutE,IAAIr2E,eAAJ,EAAd;;AAEA,QAAK8I,UAAU+P,QAAf,EAA0B;;AAEzBw9D,SAAIr3E,cAAJ,CAAoB8J,KAApB;AAEA,KAJD,MAIO;;AAENutE,SAAIh5E,GAAJ,CAAS,CAAT,EAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB,EAFM,CAEiB;AAEvB;;AAEDi5E,eAAW1yC,OAAX,CAAoBtyC,CAApB,EAAuB+kF,IAAIlnF,CAA3B,EAA8BknF,IAAIt6E,CAAlC,EAAqCs6E,IAAI5yE,CAAzC,EAA4C4yE,IAAIl4E,CAAhD;AAEA;AAED;AAED,EAlJsE;;AAoJvE8c,oBAAmB,UAAWoe,KAAX,EAAmB;;AAErCoY,OAAKpiD,SAAL,CAAe4rB,iBAAf,CAAiC5qB,IAAjC,CAAuC,IAAvC,EAA6CgpC,KAA7C;;AAEA,MAAK,KAAKq8C,QAAL,KAAkB,UAAvB,EAAoC;;AAEnC,QAAKE,iBAAL,CAAuBvtE,UAAvB,CAAmC,KAAKoJ,WAAxC;AAEA,GAJD,MAIO,IAAK,KAAKikE,QAAL,KAAkB,UAAvB,EAAoC;;AAE1C,QAAKE,iBAAL,CAAuBvtE,UAAvB,CAAmC,KAAKstE,UAAxC;AAEA,GAJM,MAIA;;AAENv3E,WAAQC,IAAR,CAAc,+CAA+C,KAAKq3E,QAAlE;AAEA;AAED,EAtKsE;;AAwKvE53E,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAK6c,QAA3B,EAAqC,KAAKof,QAA1C,EAAqDh8B,IAArD,CAA2D,IAA3D,CAAP;AAEA;;AA5KsE,CAAhD,CAAxB;;AAgLA;;;;;;;;;;;;;;AAcA,SAAS0qD,iBAAT,CAA4B5uB,UAA5B,EAAyC;;AAExCqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,mBAAZ;;AAEA,MAAKg6B,KAAL,GAAa,IAAIZ,KAAJ,CAAW,QAAX,CAAb;;AAEA,MAAKyhB,SAAL,GAAiB,CAAjB;AACA,MAAKkrC,OAAL,GAAe,OAAf;AACA,MAAKC,QAAL,GAAgB,OAAhB;;AAEA,MAAK/nD,MAAL,GAAc,KAAd;;AAEA,MAAKsc,SAAL,CAAgBjR,UAAhB;AAEA;;AAED4uB,kBAAkBr5D,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAA9B;AACAq5D,kBAAkBr5D,SAAlB,CAA4B0O,WAA5B,GAA0C2qD,iBAA1C;;AAEAA,kBAAkBr5D,SAAlB,CAA4B8iF,mBAA5B,GAAkD,IAAlD;;AAEAzpB,kBAAkBr5D,SAAlB,CAA4B2O,IAA5B,GAAmC,UAAW9N,MAAX,EAAoB;;AAEtDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKs6B,KAAL,CAAWxsB,IAAX,CAAiB9N,OAAOs6B,KAAxB;;AAEA,MAAK6gB,SAAL,GAAiBn7C,OAAOm7C,SAAxB;AACA,MAAKkrC,OAAL,GAAermF,OAAOqmF,OAAtB;AACA,MAAKC,QAAL,GAAgBtmF,OAAOsmF,QAAvB;;AAEA,QAAO,IAAP;AAEA,CAZD;;AAcA;;;;AAIA,SAASC,IAAT,CAAe77D,QAAf,EAAyBof,QAAzB,EAAmC0b,IAAnC,EAA0C;;AAEzC,KAAKA,SAAS,CAAd,EAAkB;;AAEjBt3C,UAAQC,IAAR,CAAc,iGAAd;AACA,SAAO,IAAIq4E,YAAJ,CAAkB97D,QAAlB,EAA4Bof,QAA5B,CAAP;AAEA;;AAED5D,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,MAAZ;;AAEA,MAAKoqB,QAAL,GAAgBA,aAAajsB,SAAb,GAAyBisB,QAAzB,GAAoC,IAAIyqB,cAAJ,EAApD;AACA,MAAKrL,QAAL,GAAgBA,aAAarrC,SAAb,GAAyBqrC,QAAzB,GAAoC,IAAI0uB,iBAAJ,CAAuB,EAAEl+B,OAAO57B,KAAKiM,MAAL,KAAgB,QAAzB,EAAvB,CAApD;AAEA;;AAED47E,KAAKpnF,SAAL,GAAiBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAEpE0O,cAAa04E,IAFuD;;AAIpEvwC,SAAQ,IAJ4D;;AAMpEywC,uBAAwB,YAAY;;AAEnC,MAAIr3D,QAAQ,IAAI3b,OAAJ,EAAZ;AACA,MAAI+b,MAAM,IAAI/b,OAAJ,EAAV;;AAEA,SAAO,SAASgzE,oBAAT,GAAgC;;AAEtC,OAAI/7D,WAAW,KAAKA,QAApB;;AAEA,OAAKA,SAASG,gBAAd,EAAiC;;AAEhC;;AAEA,QAAKH,SAAS7qB,KAAT,KAAmB,IAAxB,EAA+B;;AAE9B,SAAI6mF,oBAAoBh8D,SAASI,UAAT,CAAoBlR,QAA5C;AACA,SAAIyyB,gBAAgB,CAAE,CAAF,CAApB;;AAEA,UAAM,IAAIjrC,IAAI,CAAR,EAAWC,IAAIqlF,kBAAkB/uE,KAAvC,EAA8CvW,IAAIC,CAAlD,EAAqDD,GAArD,EAA4D;;AAE3DguB,YAAMne,mBAAN,CAA2By1E,iBAA3B,EAA8CtlF,IAAI,CAAlD;AACAouB,UAAIve,mBAAJ,CAAyBy1E,iBAAzB,EAA4CtlF,CAA5C;;AAEAirC,oBAAejrC,CAAf,IAAqBirC,cAAejrC,IAAI,CAAnB,CAArB;AACAirC,oBAAejrC,CAAf,KAAsBguB,MAAMjf,UAAN,CAAkBqf,GAAlB,CAAtB;AAEA;;AAED9E,cAAS8qB,YAAT,CAAuB,cAAvB,EAAuC,IAAIpB,sBAAJ,CAA4B/H,aAA5B,EAA2C,CAA3C,CAAvC;AAEA,KAjBD,MAiBO;;AAENn+B,aAAQC,IAAR,CAAc,+FAAd;AAEA;AAED,IA3BD,MA2BO,IAAKuc,SAASC,UAAd,EAA2B;;AAEjC,QAAIC,WAAWF,SAASE,QAAxB;AACA,QAAIyhB,gBAAgB3hB,SAAS2hB,aAA7B;;AAEAA,kBAAe,CAAf,IAAqB,CAArB;;AAEA,SAAM,IAAIjrC,IAAI,CAAR,EAAWC,IAAIupB,SAAS7qB,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDirC,mBAAejrC,CAAf,IAAqBirC,cAAejrC,IAAI,CAAnB,CAArB;AACAirC,mBAAejrC,CAAf,KAAsBwpB,SAAUxpB,IAAI,CAAd,EAAkB+O,UAAlB,CAA8Bya,SAAUxpB,CAAV,CAA9B,CAAtB;AAEA;AAED;;AAED,UAAO,IAAP;AAEA,GAjDD;AAmDA,EAxDuB,EAN4C;;AAgEpE4nC,UAAW,YAAY;;AAEtB,MAAI+Y,gBAAgB,IAAIrwC,OAAJ,EAApB;AACA,MAAImrC,MAAM,IAAIF,GAAJ,EAAV;AACA,MAAIrxB,SAAS,IAAIuB,MAAJ,EAAb;;AAEA,SAAO,SAASmc,OAAT,CAAkB6Z,SAAlB,EAA6BG,UAA7B,EAA0C;;AAEhD,OAAIvS,YAAYoS,UAAU8jC,aAA1B;AACA,OAAIC,cAAcn2C,YAAYA,SAA9B;;AAEA,OAAI/lB,WAAW,KAAKA,QAApB;AACA,OAAInJ,cAAc,KAAKA,WAAvB;;AAEA;;AAEA,OAAKmJ,SAAS4G,cAAT,KAA4B,IAAjC,EAAwC5G,SAAS6G,qBAAT;;AAExCjG,UAAOxd,IAAP,CAAa4c,SAAS4G,cAAtB;AACAhG,UAAOzT,YAAP,CAAqB0J,WAArB;;AAEA,OAAKshC,UAAUhG,GAAV,CAAczxB,gBAAd,CAAgCE,MAAhC,MAA6C,KAAlD,EAA0D;;AAE1D;;AAEAy2B,iBAAc5pC,UAAd,CAA0BoJ,WAA1B;AACAs7B,OAAI/uC,IAAJ,CAAU+0C,UAAUhG,GAApB,EAA0BhlC,YAA1B,CAAwCkqC,aAAxC;;AAEA,OAAI8kC,SAAS,IAAIpzE,OAAJ,EAAb;AACA,OAAIqzE,OAAO,IAAIrzE,OAAJ,EAAX;AACA,OAAIszE,eAAe,IAAItzE,OAAJ,EAAnB;AACA,OAAIuzE,WAAW,IAAIvzE,OAAJ,EAAf;AACA,OAAIwzE,OAAS,QAAQ,KAAKxI,cAAf,GAAkC,CAAlC,GAAsC,CAAjD;;AAEA,OAAK/zD,SAASG,gBAAd,EAAiC;;AAEhC,QAAIhrB,QAAQ6qB,SAAS7qB,KAArB;AACA,QAAIirB,aAAaJ,SAASI,UAA1B;AACA,QAAIuiB,YAAYviB,WAAWlR,QAAX,CAAoB1Y,KAApC;;AAEA,QAAKrB,UAAU,IAAf,EAAsB;;AAErB,SAAIutC,UAAUvtC,MAAMqB,KAApB;;AAEA,UAAM,IAAIE,IAAI,CAAR,EAAWC,IAAI+rC,QAAQrtC,MAAR,GAAiB,CAAtC,EAAyCqB,IAAIC,CAA7C,EAAgDD,KAAK6lF,IAArD,EAA4D;;AAE3D,UAAI14E,IAAI6+B,QAAShsC,CAAT,CAAR;AACA,UAAIoN,IAAI4+B,QAAShsC,IAAI,CAAb,CAAR;;AAEAylF,aAAO/1E,SAAP,CAAkBu8B,SAAlB,EAA6B9+B,IAAI,CAAjC;AACAu4E,WAAKh2E,SAAL,CAAgBu8B,SAAhB,EAA2B7+B,IAAI,CAA/B;;AAEA,UAAI04E,SAASrqC,IAAIM,mBAAJ,CAAyB0pC,MAAzB,EAAiCC,IAAjC,EAAuCE,QAAvC,EAAiDD,YAAjD,CAAb;;AAEA,UAAKG,SAASN,WAAd,EAA4B;;AAE5BI,eAASnvE,YAAT,CAAuB,KAAK0J,WAA5B,EAZ2D,CAYhB;;AAE3C,UAAIoQ,WAAWkxB,UAAUhG,GAAV,CAAcD,MAAd,CAAqBzsC,UAArB,CAAiC62E,QAAjC,CAAf;;AAEA,UAAKr1D,WAAWkxB,UAAUhnC,IAArB,IAA6B8V,WAAWkxB,UAAU/mC,GAAvD,EAA6D;;AAE7DknC,iBAAWriD,IAAX,CAAiB;;AAEhBgxB,iBAAUA,QAFM;AAGhB;AACA;AACAvH,cAAO28D,aAAan5E,KAAb,GAAqBiK,YAArB,CAAmC,KAAK0J,WAAxC,CALS;AAMhB1hB,cAAOuB,CANS;AAOhB2rC,aAAM,IAPU;AAQhBkW,kBAAW,IARK;AAShBn5B,eAAQ;;AATQ,OAAjB;AAaA;AAED,KArCD,MAqCO;;AAEN,UAAM,IAAI1oB,IAAI,CAAR,EAAWC,IAAIgsC,UAAUttC,MAAV,GAAmB,CAAnB,GAAuB,CAA5C,EAA+CqB,IAAIC,CAAnD,EAAsDD,KAAK6lF,IAA3D,EAAkE;;AAEjEJ,aAAO/1E,SAAP,CAAkBu8B,SAAlB,EAA6B,IAAIjsC,CAAjC;AACA0lF,WAAKh2E,SAAL,CAAgBu8B,SAAhB,EAA2B,IAAIjsC,CAAJ,GAAQ,CAAnC;;AAEA,UAAI8lF,SAASrqC,IAAIM,mBAAJ,CAAyB0pC,MAAzB,EAAiCC,IAAjC,EAAuCE,QAAvC,EAAiDD,YAAjD,CAAb;;AAEA,UAAKG,SAASN,WAAd,EAA4B;;AAE5BI,eAASnvE,YAAT,CAAuB,KAAK0J,WAA5B,EATiE,CAStB;;AAE3C,UAAIoQ,WAAWkxB,UAAUhG,GAAV,CAAcD,MAAd,CAAqBzsC,UAArB,CAAiC62E,QAAjC,CAAf;;AAEA,UAAKr1D,WAAWkxB,UAAUhnC,IAArB,IAA6B8V,WAAWkxB,UAAU/mC,GAAvD,EAA6D;;AAE7DknC,iBAAWriD,IAAX,CAAiB;;AAEhBgxB,iBAAUA,QAFM;AAGhB;AACA;AACAvH,cAAO28D,aAAan5E,KAAb,GAAqBiK,YAArB,CAAmC,KAAK0J,WAAxC,CALS;AAMhB1hB,cAAOuB,CANS;AAOhB2rC,aAAM,IAPU;AAQhBkW,kBAAW,IARK;AAShBn5B,eAAQ;;AATQ,OAAjB;AAaA;AAED;AAED,IA7ED,MA6EO,IAAKY,SAASC,UAAd,EAA2B;;AAEjC,QAAIC,WAAWF,SAASE,QAAxB;AACA,QAAIu8D,aAAav8D,SAAS7qB,MAA1B;;AAEA,SAAM,IAAIqB,IAAI,CAAd,EAAiBA,IAAI+lF,aAAa,CAAlC,EAAqC/lF,KAAK6lF,IAA1C,EAAiD;;AAEhD,SAAIC,SAASrqC,IAAIM,mBAAJ,CAAyBvyB,SAAUxpB,CAAV,CAAzB,EAAwCwpB,SAAUxpB,IAAI,CAAd,CAAxC,EAA2D4lF,QAA3D,EAAqED,YAArE,CAAb;;AAEA,SAAKG,SAASN,WAAd,EAA4B;;AAE5BI,cAASnvE,YAAT,CAAuB,KAAK0J,WAA5B,EANgD,CAML;;AAE3C,SAAIoQ,WAAWkxB,UAAUhG,GAAV,CAAcD,MAAd,CAAqBzsC,UAArB,CAAiC62E,QAAjC,CAAf;;AAEA,SAAKr1D,WAAWkxB,UAAUhnC,IAArB,IAA6B8V,WAAWkxB,UAAU/mC,GAAvD,EAA6D;;AAE7DknC,gBAAWriD,IAAX,CAAiB;;AAEhBgxB,gBAAUA,QAFM;AAGhB;AACA;AACAvH,aAAO28D,aAAan5E,KAAb,GAAqBiK,YAArB,CAAmC,KAAK0J,WAAxC,CALS;AAMhB1hB,aAAOuB,CANS;AAOhB2rC,YAAM,IAPU;AAQhBkW,iBAAW,IARK;AAShBn5B,cAAQ;;AATQ,MAAjB;AAaA;AAED;AAED,GA3ID;AA6IA,EAnJU,EAhEyD;;AAqNpElc,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAK6c,QAA3B,EAAqC,KAAKof,QAA1C,EAAqDh8B,IAArD,CAA2D,IAA3D,CAAP;AAEA;;AAzNmE,CAApD,CAAjB;;AA6NA;;;;AAIA,SAAS04E,YAAT,CAAuB97D,QAAvB,EAAiCof,QAAjC,EAA4C;;AAE3Cy8C,MAAKpmF,IAAL,CAAW,IAAX,EAAiBuqB,QAAjB,EAA2Bof,QAA3B;;AAEA,MAAKxpC,IAAL,GAAY,cAAZ;AAEA;;AAEDkmF,aAAarnF,SAAb,GAAyBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAemhE,KAAKpnF,SAApB,CAAf,EAAgD;;AAExE0O,cAAa24E,YAF2D;;AAIxE/H,iBAAgB,IAJwD;;AAMxEgI,uBAAwB,YAAY;;AAEnC,MAAIr3D,QAAQ,IAAI3b,OAAJ,EAAZ;AACA,MAAI+b,MAAM,IAAI/b,OAAJ,EAAV;;AAEA,SAAO,SAASgzE,oBAAT,GAAgC;;AAEtC,OAAI/7D,WAAW,KAAKA,QAApB;;AAEA,OAAKA,SAASG,gBAAd,EAAiC;;AAEhC;;AAEA,QAAKH,SAAS7qB,KAAT,KAAmB,IAAxB,EAA+B;;AAE9B,SAAI6mF,oBAAoBh8D,SAASI,UAAT,CAAoBlR,QAA5C;AACA,SAAIyyB,gBAAgB,EAApB;;AAEA,UAAM,IAAIjrC,IAAI,CAAR,EAAWC,IAAIqlF,kBAAkB/uE,KAAvC,EAA8CvW,IAAIC,CAAlD,EAAqDD,KAAK,CAA1D,EAA8D;;AAE7DguB,YAAMne,mBAAN,CAA2By1E,iBAA3B,EAA8CtlF,CAA9C;AACAouB,UAAIve,mBAAJ,CAAyBy1E,iBAAzB,EAA4CtlF,IAAI,CAAhD;;AAEAirC,oBAAejrC,CAAf,IAAuBA,MAAM,CAAR,GAAc,CAAd,GAAkBirC,cAAejrC,IAAI,CAAnB,CAAvC;AACAirC,oBAAejrC,IAAI,CAAnB,IAAyBirC,cAAejrC,CAAf,IAAqBguB,MAAMjf,UAAN,CAAkBqf,GAAlB,CAA9C;AAEA;;AAED9E,cAAS8qB,YAAT,CAAuB,cAAvB,EAAuC,IAAIpB,sBAAJ,CAA4B/H,aAA5B,EAA2C,CAA3C,CAAvC;AAEA,KAjBD,MAiBO;;AAENn+B,aAAQC,IAAR,CAAc,uGAAd;AAEA;AAED,IA3BD,MA2BO,IAAKuc,SAASC,UAAd,EAA2B;;AAEjC,QAAIC,WAAWF,SAASE,QAAxB;AACA,QAAIyhB,gBAAgB3hB,SAAS2hB,aAA7B;;AAEA,SAAM,IAAIjrC,IAAI,CAAR,EAAWC,IAAIupB,SAAS7qB,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,KAAK,CAAlD,EAAsD;;AAErDguB,WAAMthB,IAAN,CAAY8c,SAAUxpB,CAAV,CAAZ;AACAouB,SAAI1hB,IAAJ,CAAU8c,SAAUxpB,IAAI,CAAd,CAAV;;AAEAirC,mBAAejrC,CAAf,IAAuBA,MAAM,CAAR,GAAc,CAAd,GAAkBirC,cAAejrC,IAAI,CAAnB,CAAvC;AACAirC,mBAAejrC,IAAI,CAAnB,IAAyBirC,cAAejrC,CAAf,IAAqBguB,MAAMjf,UAAN,CAAkBqf,GAAlB,CAA9C;AAEA;AAED;;AAED,UAAO,IAAP;AAEA,GAlDD;AAoDA,EAzDuB;;AANgD,CAAhD,CAAzB;;AAmEA;;;;AAIA,SAAS43D,QAAT,CAAmB18D,QAAnB,EAA6Bof,QAA7B,EAAwC;;AAEvCy8C,MAAKpmF,IAAL,CAAW,IAAX,EAAiBuqB,QAAjB,EAA2Bof,QAA3B;;AAEA,MAAKxpC,IAAL,GAAY,UAAZ;AAEA;;AAED8mF,SAASjoF,SAAT,GAAqBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAemhE,KAAKpnF,SAApB,CAAf,EAAgD;;AAEpE0O,cAAau5E,QAFuD;;AAIpE1I,aAAY;;AAJwD,CAAhD,CAArB;;AAQA;;;;;;;;;;;;;;;;AAgBA,SAAShmB,cAAT,CAAyB9uB,UAAzB,EAAsC;;AAErCqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,gBAAZ;;AAEA,MAAKg6B,KAAL,GAAa,IAAIZ,KAAJ,CAAW,QAAX,CAAb;;AAEA,MAAKqC,GAAL,GAAW,IAAX;;AAEA,MAAKpS,IAAL,GAAY,CAAZ;AACA,MAAKuxB,eAAL,GAAuB,IAAvB;;AAEA,MAAKjP,YAAL,GAAoB,KAApB;;AAEA,MAAK1N,MAAL,GAAc,KAAd;;AAEA,MAAKsc,SAAL,CAAgBjR,UAAhB;AAEA;;AAED8uB,eAAev5D,SAAf,GAA2BC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAA3B;AACAu5D,eAAev5D,SAAf,CAAyB0O,WAAzB,GAAuC6qD,cAAvC;;AAEAA,eAAev5D,SAAf,CAAyBkjF,gBAAzB,GAA4C,IAA5C;;AAEA3pB,eAAev5D,SAAf,CAAyB2O,IAAzB,GAAgC,UAAW9N,MAAX,EAAoB;;AAEnDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKs6B,KAAL,CAAWxsB,IAAX,CAAiB9N,OAAOs6B,KAAxB;;AAEA,MAAKyB,GAAL,GAAW/7B,OAAO+7B,GAAlB;;AAEA,MAAKpS,IAAL,GAAY3pB,OAAO2pB,IAAnB;AACA,MAAKuxB,eAAL,GAAuBl7C,OAAOk7C,eAA9B;;AAEA,MAAKjP,YAAL,GAAoBjsC,OAAOisC,YAA3B;;AAEA,QAAO,IAAP;AAEA,CAfD;;AAiBA;;;;AAIA,SAASo7C,MAAT,CAAiB38D,QAAjB,EAA2Bof,QAA3B,EAAsC;;AAErC5D,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,QAAZ;;AAEA,MAAKoqB,QAAL,GAAgBA,aAAajsB,SAAb,GAAyBisB,QAAzB,GAAoC,IAAIyqB,cAAJ,EAApD;AACA,MAAKrL,QAAL,GAAgBA,aAAarrC,SAAb,GAAyBqrC,QAAzB,GAAoC,IAAI4uB,cAAJ,CAAoB,EAAEp+B,OAAO57B,KAAKiM,MAAL,KAAgB,QAAzB,EAApB,CAApD;AAEA;;AAED08E,OAAOloF,SAAP,GAAmBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAEtE0O,cAAaw5E,MAFyD;;AAItEtxC,WAAU,IAJ4D;;AAMtE/M,UAAW,YAAY;;AAEtB,MAAI+Y,gBAAgB,IAAIrwC,OAAJ,EAApB;AACA,MAAImrC,MAAM,IAAIF,GAAJ,EAAV;AACA,MAAIrxB,SAAS,IAAIuB,MAAJ,EAAb;;AAEA,SAAO,SAASmc,OAAT,CAAkB6Z,SAAlB,EAA6BG,UAA7B,EAA0C;;AAEhD,OAAIl5B,SAAS,IAAb;AACA,OAAIY,WAAW,KAAKA,QAApB;AACA,OAAInJ,cAAc,KAAKA,WAAvB;AACA,OAAI+lE,YAAYzkC,UAAU0kC,MAAV,CAAiBF,MAAjB,CAAwBC,SAAxC;;AAEA;;AAEA,OAAK58D,SAAS4G,cAAT,KAA4B,IAAjC,EAAwC5G,SAAS6G,qBAAT;;AAExCjG,UAAOxd,IAAP,CAAa4c,SAAS4G,cAAtB;AACAhG,UAAOzT,YAAP,CAAqB0J,WAArB;AACA+J,UAAO1I,MAAP,IAAiB0kE,SAAjB;;AAEA,OAAKzkC,UAAUhG,GAAV,CAAczxB,gBAAd,CAAgCE,MAAhC,MAA6C,KAAlD,EAA0D;;AAE1D;;AAEAy2B,iBAAc5pC,UAAd,CAA0BoJ,WAA1B;AACAs7B,OAAI/uC,IAAJ,CAAU+0C,UAAUhG,GAApB,EAA0BhlC,YAA1B,CAAwCkqC,aAAxC;;AAEA,OAAIylC,iBAAiBF,aAAc,CAAE,KAAK1uE,KAAL,CAAW3Z,CAAX,GAAe,KAAK2Z,KAAL,CAAW/M,CAA1B,GAA8B,KAAK+M,KAAL,CAAWrF,CAA3C,IAAiD,CAA/D,CAArB;AACA,OAAIk0E,mBAAmBD,iBAAiBA,cAAxC;AACA,OAAI5tE,WAAW,IAAInG,OAAJ,EAAf;AACA,OAAI4wE,iBAAiB,IAAI5wE,OAAJ,EAArB;;AAEA,YAASi0E,SAAT,CAAoBt9D,KAApB,EAA2BvqB,KAA3B,EAAmC;;AAElC,QAAI8nF,qBAAqB9qC,IAAIK,iBAAJ,CAAuB9yB,KAAvB,CAAzB;;AAEA,QAAKu9D,qBAAqBF,gBAA1B,EAA6C;;AAE5C5qC,SAAIG,mBAAJ,CAAyB5yB,KAAzB,EAAgCi6D,cAAhC;AACAA,oBAAexsE,YAAf,CAA6B0J,WAA7B;;AAEA,SAAIoQ,WAAWkxB,UAAUhG,GAAV,CAAcD,MAAd,CAAqBzsC,UAArB,CAAiCk0E,cAAjC,CAAf;;AAEA,SAAK1yD,WAAWkxB,UAAUhnC,IAArB,IAA6B8V,WAAWkxB,UAAU/mC,GAAvD,EAA6D;;AAE7DknC,gBAAWriD,IAAX,CAAiB;;AAEhBgxB,gBAAUA,QAFM;AAGhBi2D,qBAAelpF,KAAKmR,IAAL,CAAW83E,kBAAX,CAHC;AAIhBv9D,aAAOi6D,eAAez2E,KAAf,EAJS;AAKhB/N,aAAOA,KALS;AAMhBktC,YAAM,IANU;AAOhBjjB,cAAQA;;AAPQ,MAAjB;AAWA;AAED;;AAED,OAAKY,SAASG,gBAAd,EAAiC;;AAEhC,QAAIhrB,QAAQ6qB,SAAS7qB,KAArB;AACA,QAAIirB,aAAaJ,SAASI,UAA1B;AACA,QAAIuiB,YAAYviB,WAAWlR,QAAX,CAAoB1Y,KAApC;;AAEA,QAAKrB,UAAU,IAAf,EAAsB;;AAErB,SAAIutC,UAAUvtC,MAAMqB,KAApB;;AAEA,UAAM,IAAIE,IAAI,CAAR,EAAWooB,KAAK4jB,QAAQrtC,MAA9B,EAAsCqB,IAAIooB,EAA1C,EAA8CpoB,GAA9C,EAAqD;;AAEpD,UAAImN,IAAI6+B,QAAShsC,CAAT,CAAR;;AAEAwY,eAAS9I,SAAT,CAAoBu8B,SAApB,EAA+B9+B,IAAI,CAAnC;;AAEAm5E,gBAAW9tE,QAAX,EAAqBrL,CAArB;AAEA;AAED,KAdD,MAcO;;AAEN,UAAM,IAAInN,IAAI,CAAR,EAAWC,IAAIgsC,UAAUttC,MAAV,GAAmB,CAAxC,EAA2CqB,IAAIC,CAA/C,EAAkDD,GAAlD,EAAyD;;AAExDwY,eAAS9I,SAAT,CAAoBu8B,SAApB,EAA+BjsC,IAAI,CAAnC;;AAEAsmF,gBAAW9tE,QAAX,EAAqBxY,CAArB;AAEA;AAED;AAED,IAhCD,MAgCO;;AAEN,QAAIwpB,WAAWF,SAASE,QAAxB;;AAEA,SAAM,IAAIxpB,IAAI,CAAR,EAAWC,IAAIupB,SAAS7qB,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDsmF,eAAW98D,SAAUxpB,CAAV,CAAX,EAA0BA,CAA1B;AAEA;AAED;AAED,GAnGD;AAqGA,EA3GU,EAN2D;;AAmHtEwM,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,CAAsB,KAAK6c,QAA3B,EAAqC,KAAKof,QAA1C,EAAqDh8B,IAArD,CAA2D,IAA3D,CAAP;AAEA;;AAvHqE,CAApD,CAAnB;;AA2HA;;;;AAIA,SAAS+5E,KAAT,GAAiB;;AAEhB3hD,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,OAAZ;AAEA;;AAEDunF,MAAM1oF,SAAN,GAAkBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAErE0O,cAAag6E,KAFwD;;AAIrEC,UAAS;;AAJ4D,CAApD,CAAlB;;AAQA;;;;AAIA,SAASC,YAAT,CAAuBC,KAAvB,EAA8BhkE,OAA9B,EAAuCC,KAAvC,EAA8CC,KAA9C,EAAqDC,SAArD,EAAgEC,SAAhE,EAA2EC,MAA3E,EAAmF/jB,IAAnF,EAAyFgkB,UAAzF,EAAsG;;AAErGR,SAAQ3jB,IAAR,CAAc,IAAd,EAAoB6nF,KAApB,EAA2BhkE,OAA3B,EAAoCC,KAApC,EAA2CC,KAA3C,EAAkDC,SAAlD,EAA6DC,SAA7D,EAAwEC,MAAxE,EAAgF/jB,IAAhF,EAAsFgkB,UAAtF;;AAEA,MAAKQ,eAAL,GAAuB,KAAvB;AAEA;;AAEDijE,aAAa5oF,SAAb,GAAyBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAetB,QAAQ3kB,SAAvB,CAAf,EAAmD;;AAE3E0O,cAAak6E,YAF8D;;AAI3E7b,iBAAgB,IAJ2D;;AAM3EtuD,SAAQ,YAAY;;AAEnB,MAAIoqE,QAAQ,KAAKjkE,KAAjB;;AAEA,MAAKikE,MAAMC,UAAN,IAAoBD,MAAME,iBAA/B,EAAmD;;AAElD,QAAKpyC,WAAL,GAAmB,IAAnB;AAEA;AAED;;AAhB0E,CAAnD,CAAzB;;AAoBA;;;;AAIA,SAASqyC,iBAAT,CAA4BzjE,OAA5B,EAAqCsB,KAArC,EAA4CC,MAA5C,EAAoD5B,MAApD,EAA4D/jB,IAA5D,EAAkE0jB,OAAlE,EAA2EC,KAA3E,EAAkFC,KAAlF,EAAyFC,SAAzF,EAAoGC,SAApG,EAA+GE,UAA/G,EAA2HC,QAA3H,EAAsI;;AAErIT,SAAQ3jB,IAAR,CAAc,IAAd,EAAoB,IAApB,EAA0B6jB,OAA1B,EAAmCC,KAAnC,EAA0CC,KAA1C,EAAiDC,SAAjD,EAA4DC,SAA5D,EAAuEC,MAAvE,EAA+E/jB,IAA/E,EAAqFgkB,UAArF,EAAiGC,QAAjG;;AAEA,MAAKR,KAAL,GAAa,EAAEiC,OAAOA,KAAT,EAAgBC,QAAQA,MAAxB,EAAb;AACA,MAAKvB,OAAL,GAAeA,OAAf;;AAEA;AACA;;AAEA,MAAKM,KAAL,GAAa,KAAb;;AAEA;AACA;;AAEA,MAAKF,eAAL,GAAuB,KAAvB;AAEA;;AAEDqjE,kBAAkBhpF,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAetB,QAAQ3kB,SAAvB,CAA9B;AACAgpF,kBAAkBhpF,SAAlB,CAA4B0O,WAA5B,GAA0Cs6E,iBAA1C;;AAEAA,kBAAkBhpF,SAAlB,CAA4BouE,mBAA5B,GAAkD,IAAlD;;AAEA;;;;;AAKA,SAAS6a,YAAT,CAAuBpiE,KAAvB,EAA8BC,MAA9B,EAAsC3lB,IAAtC,EAA4C0jB,OAA5C,EAAqDC,KAArD,EAA4DC,KAA5D,EAAmEC,SAAnE,EAA8EC,SAA9E,EAAyFE,UAAzF,EAAqGD,MAArG,EAA8G;;AAE7GA,UAASA,WAAW5lB,SAAX,GAAuB4lB,MAAvB,GAAgChd,WAAzC;;AAEA,KAAKgd,WAAWhd,WAAX,IAA0Bgd,WAAW/c,kBAA1C,EAA+D;;AAE9D,QAAM,IAAIoG,KAAJ,CAAW,kFAAX,CAAN;AAEA;;AAED,KAAKpN,SAAS7B,SAAT,IAAsB4lB,WAAWhd,WAAtC,EAAoD/G,OAAOgG,iBAAP;AACpD,KAAKhG,SAAS7B,SAAT,IAAsB4lB,WAAW/c,kBAAtC,EAA2DhH,OAAOwG,kBAAP;;AAE3Dgd,SAAQ3jB,IAAR,CAAc,IAAd,EAAoB,IAApB,EAA0B6jB,OAA1B,EAAmCC,KAAnC,EAA0CC,KAA1C,EAAiDC,SAAjD,EAA4DC,SAA5D,EAAuEC,MAAvE,EAA+E/jB,IAA/E,EAAqFgkB,UAArF;;AAEA,MAAKP,KAAL,GAAa,EAAEiC,OAAOA,KAAT,EAAgBC,QAAQA,MAAxB,EAAb;;AAEA,MAAK9B,SAAL,GAAiBA,cAAc1lB,SAAd,GAA0B0lB,SAA1B,GAAsCte,aAAvD;AACA,MAAKue,SAAL,GAAiBA,cAAc3lB,SAAd,GAA0B2lB,SAA1B,GAAsCve,aAAvD;;AAEA,MAAKmf,KAAL,GAAa,KAAb;AACA,MAAKF,eAAL,GAAuB,KAAvB;AAEA;;AAEDsjE,aAAajpF,SAAb,GAAyBC,OAAOgmB,MAAP,CAAetB,QAAQ3kB,SAAvB,CAAzB;AACAipF,aAAajpF,SAAb,CAAuB0O,WAAvB,GAAqCu6E,YAArC;AACAA,aAAajpF,SAAb,CAAuBqvE,cAAvB,GAAwC,IAAxC;;AAEA;;;;;AAKA,SAAS6Z,iBAAT,CAA4B39D,QAA5B,EAAuC;;AAEtCyqB,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,mBAAZ;;AAEA;;AAEA,KAAIsqB,WAAW,EAAf;;AAEA;;AAEA,KAAIxpB,CAAJ,EAAOirB,CAAP,EAAUhrB,CAAV,EAAainF,CAAb,EAAgBC,EAAhB;AACA,KAAIC,OAAO,CAAE,CAAF,EAAK,CAAL,CAAX;AAAA,KAAqBC,QAAQ,EAA7B;AAAA,KAAiCv5E,CAAjC;AAAA,KAAoCiwC,KAApC;AAAA,KAA2CC,KAA3C;AACA,KAAIjV,GAAJ;AAAA,KAASgN,OAAO,CAAE,GAAF,EAAO,GAAP,EAAY,GAAZ,CAAhB;AACA,KAAIrK,MAAJ;;AAEA;;AAEA,KAAKpiB,YAAYA,SAASC,UAA1B,EAAuC;;AAEtC;;AAEA,MAAIohB,QAAQrhB,SAASqhB,KAArB;;AAEA,OAAM3qC,IAAI,CAAJ,EAAOC,IAAI0qC,MAAMhsC,MAAvB,EAA+BqB,IAAIC,CAAnC,EAAsCD,GAAtC,EAA6C;;AAE5C,OAAI2rC,OAAOhB,MAAO3qC,CAAP,CAAX;;AAEA,QAAMirB,IAAI,CAAV,EAAaA,IAAI,CAAjB,EAAoBA,GAApB,EAA2B;;AAE1B8yB,YAAQpS,KAAMoK,KAAM9qB,CAAN,CAAN,CAAR;AACA+yB,YAAQrS,KAAMoK,KAAM,CAAE9qB,IAAI,CAAN,IAAY,CAAlB,CAAN,CAAR;AACAm8D,SAAM,CAAN,IAAY9pF,KAAKwM,GAAL,CAAUi0C,KAAV,EAAiBC,KAAjB,CAAZ,CAJ0B,CAIY;AACtCopC,SAAM,CAAN,IAAY9pF,KAAKyM,GAAL,CAAUg0C,KAAV,EAAiBC,KAAjB,CAAZ;;AAEAjV,UAAMq+C,KAAM,CAAN,IAAY,GAAZ,GAAkBA,KAAM,CAAN,CAAxB;;AAEA,QAAKC,MAAOt+C,GAAP,MAAiB1rC,SAAtB,EAAkC;;AAEjCgqF,WAAOt+C,GAAP,IAAe,EAAE8I,QAAQu1C,KAAM,CAAN,CAAV,EAAqBt1C,QAAQs1C,KAAM,CAAN,CAA7B,EAAf;AAEA;AAED;AAED;;AAED;;AAEA,OAAMr+C,GAAN,IAAas+C,KAAb,EAAqB;;AAEpBv5E,OAAIu5E,MAAOt+C,GAAP,CAAJ;;AAEA2C,YAASpiB,SAASE,QAAT,CAAmB1b,EAAE+jC,MAArB,CAAT;AACAroB,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEAu5B,YAASpiB,SAASE,QAAT,CAAmB1b,EAAEgkC,MAArB,CAAT;AACAtoB,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;AAEA;AAED,EA3CD,MA2CO,IAAKmX,YAAYA,SAASG,gBAA1B,EAA6C;;AAEnD,MAAIjR,QAAJ,EAAcwzB,OAAd,EAAuBU,MAAvB;AACA,MAAIC,KAAJ,EAAW3e,KAAX,EAAkBzX,KAAlB;AACA,MAAIs7B,MAAJ,EAAYC,MAAZ;;AAEApG,WAAS,IAAIr5B,OAAJ,EAAT;;AAEA,MAAKiX,SAAS7qB,KAAT,KAAmB,IAAxB,EAA+B;;AAE9B;;AAEA+Z,cAAW8Q,SAASI,UAAT,CAAoBlR,QAA/B;AACAwzB,aAAU1iB,SAAS7qB,KAAnB;AACAiuC,YAASpjB,SAASojB,MAAlB;;AAEA,OAAKA,OAAO/tC,MAAP,KAAkB,CAAvB,EAA2B;;AAE1B+tC,aAAS,CAAE,EAAE1e,OAAO,CAAT,EAAYzX,OAAOy1B,QAAQz1B,KAA3B,EAAkC8zB,eAAe,CAAjD,EAAF,CAAT;AAEA;;AAED;;AAEA,QAAM68C,IAAI,CAAJ,EAAOC,KAAKz6C,OAAO/tC,MAAzB,EAAiCuoF,IAAIC,EAArC,EAAyC,EAAGD,CAA5C,EAAgD;;AAE/Cv6C,YAAQD,OAAQw6C,CAAR,CAAR;;AAEAl5D,YAAQ2e,MAAM3e,KAAd;AACAzX,YAAQo2B,MAAMp2B,KAAd;;AAEA,SAAMvW,IAAIguB,KAAJ,EAAW/tB,IAAM+tB,QAAQzX,KAA/B,EAAwCvW,IAAIC,CAA5C,EAA+CD,KAAK,CAApD,EAAwD;;AAEvD,UAAMirB,IAAI,CAAV,EAAaA,IAAI,CAAjB,EAAoBA,GAApB,EAA2B;;AAE1B8yB,cAAQ/R,QAAQj8B,IAAR,CAAc/P,IAAIirB,CAAlB,CAAR;AACA+yB,cAAQhS,QAAQj8B,IAAR,CAAc/P,IAAI,CAAEirB,IAAI,CAAN,IAAY,CAA9B,CAAR;AACAm8D,WAAM,CAAN,IAAY9pF,KAAKwM,GAAL,CAAUi0C,KAAV,EAAiBC,KAAjB,CAAZ,CAJ0B,CAIY;AACtCopC,WAAM,CAAN,IAAY9pF,KAAKyM,GAAL,CAAUg0C,KAAV,EAAiBC,KAAjB,CAAZ;;AAEAjV,YAAMq+C,KAAM,CAAN,IAAY,GAAZ,GAAkBA,KAAM,CAAN,CAAxB;;AAEA,UAAKC,MAAOt+C,GAAP,MAAiB1rC,SAAtB,EAAkC;;AAEjCgqF,aAAOt+C,GAAP,IAAe,EAAE8I,QAAQu1C,KAAM,CAAN,CAAV,EAAqBt1C,QAAQs1C,KAAM,CAAN,CAA7B,EAAf;AAEA;AAED;AAED;AAED;;AAED;;AAEA,QAAMr+C,GAAN,IAAas+C,KAAb,EAAqB;;AAEpBv5E,QAAIu5E,MAAOt+C,GAAP,CAAJ;;AAEA2C,WAAO77B,mBAAP,CAA4B2I,QAA5B,EAAsC1K,EAAE+jC,MAAxC;AACAroB,aAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEAu5B,WAAO77B,mBAAP,CAA4B2I,QAA5B,EAAsC1K,EAAEgkC,MAAxC;AACAtoB,aAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;AAEA;AAED,GA5DD,MA4DO;;AAEN;;AAEAqG,cAAW8Q,SAASI,UAAT,CAAoBlR,QAA/B;;AAEA,QAAMxY,IAAI,CAAJ,EAAOC,IAAMuY,SAASjC,KAAT,GAAiB,CAApC,EAAyCvW,IAAIC,CAA7C,EAAgDD,GAAhD,EAAuD;;AAEtD,SAAMirB,IAAI,CAAV,EAAaA,IAAI,CAAjB,EAAoBA,GAApB,EAA2B;;AAE1B;AACA;;AAEA4mB,cAAS,IAAI7xC,CAAJ,GAAQirB,CAAjB;AACAygB,YAAO77B,mBAAP,CAA4B2I,QAA5B,EAAsCq5B,MAAtC;AACAroB,cAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEA2/B,cAAS,IAAI9xC,CAAJ,GAAU,CAAEirB,IAAI,CAAN,IAAY,CAA/B;AACAygB,YAAO77B,mBAAP,CAA4B2I,QAA5B,EAAsCs5B,MAAtC;AACAtoB,cAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;AAEA;AAED;AAED;AAED;;AAED;;AAEA,MAAKiiC,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AAEA;;AAEDy9D,kBAAkBlpF,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAA9B;AACAkpF,kBAAkBlpF,SAAlB,CAA4B0O,WAA5B,GAA0Cw6E,iBAA1C;;AAEA;;;;;;;;AAQA;;AAEA,SAASK,kBAAT,CAA6BC,IAA7B,EAAmCC,MAAnC,EAA2CC,MAA3C,EAAoD;;AAEnDh9C,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,oBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB++C,QAAMA,IADW;AAEjBC,UAAQA,MAFS;AAGjBC,UAAQA;AAHS,EAAlB;;AAMA,MAAK17C,kBAAL,CAAyB,IAAI27C,wBAAJ,CAA8BH,IAA9B,EAAoCC,MAApC,EAA4CC,MAA5C,CAAzB;AACA,MAAKz4C,aAAL;AAEA;;AAEDs4C,mBAAmBvpF,SAAnB,GAA+BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA/B;AACAupF,mBAAmBvpF,SAAnB,CAA6B0O,WAA7B,GAA2C66E,kBAA3C;;AAEA;;AAEA,SAASI,wBAAT,CAAmCH,IAAnC,EAAyCC,MAAzC,EAAiDC,MAAjD,EAA0D;;AAEzD1zC,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,0BAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB++C,QAAMA,IADW;AAEjBC,UAAQA,MAFS;AAGjBC,UAAQA;AAHS,EAAlB;;AAMA;;AAEA,KAAIz7C,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;;AAEA,KAAItuB,MAAM,OAAV;;AAEA,KAAIoD,SAAS,IAAI5O,OAAJ,EAAb;;AAEA,KAAI6Y,KAAK,IAAI7Y,OAAJ,EAAT;AAAA,KAAwB8Y,KAAK,IAAI9Y,OAAJ,EAA7B;AACA,KAAIs1E,KAAK,IAAIt1E,OAAJ,EAAT;AAAA,KAAwBu1E,KAAK,IAAIv1E,OAAJ,EAA7B;;AAEA,KAAIrS,CAAJ,EAAOirB,CAAP;;AAEA,KAAKs8D,KAAK5oF,MAAL,GAAc,CAAnB,EAAuB;;AAEtBmO,UAAQyD,KAAR,CAAe,kFAAf;AAEA;;AAED;;AAEA,KAAIs3E,aAAaL,SAAS,CAA1B;;AAEA,MAAMxnF,IAAI,CAAV,EAAaA,KAAKynF,MAAlB,EAA0BznF,GAA1B,EAAiC;;AAEhC,MAAI2M,IAAI3M,IAAIynF,MAAZ;;AAEA,OAAMx8D,IAAI,CAAV,EAAaA,KAAKu8D,MAAlB,EAA0Bv8D,GAA1B,EAAiC;;AAEhC,OAAI6M,IAAI7M,IAAIu8D,MAAZ;;AAEA;;AAEAD,QAAMzvD,CAAN,EAASnrB,CAAT,EAAYue,EAAZ;AACA1B,YAASjqB,IAAT,CAAe2rB,GAAGrtB,CAAlB,EAAqBqtB,GAAGzgB,CAAxB,EAA2BygB,GAAG/Y,CAA9B;;AAEA;;AAEA;;AAEA,OAAK2lB,IAAIja,GAAJ,IAAW,CAAhB,EAAoB;;AAEnB0pE,SAAMzvD,IAAIja,GAAV,EAAelR,CAAf,EAAkBwe,EAAlB;AACAw8D,OAAGp6E,UAAH,CAAe2d,EAAf,EAAmBC,EAAnB;AAEA,IALD,MAKO;;AAENo8D,SAAMzvD,IAAIja,GAAV,EAAelR,CAAf,EAAkBwe,EAAlB;AACAw8D,OAAGp6E,UAAH,CAAe4d,EAAf,EAAmBD,EAAnB;AAEA;;AAED,OAAKve,IAAIkR,GAAJ,IAAW,CAAhB,EAAoB;;AAEnB0pE,SAAMzvD,CAAN,EAASnrB,IAAIkR,GAAb,EAAkBsN,EAAlB;AACAy8D,OAAGr6E,UAAH,CAAe2d,EAAf,EAAmBC,EAAnB;AAEA,IALD,MAKO;;AAENo8D,SAAMzvD,CAAN,EAASnrB,IAAIkR,GAAb,EAAkBsN,EAAlB;AACAy8D,OAAGr6E,UAAH,CAAe4d,EAAf,EAAmBD,EAAnB;AAEA;;AAED;;AAEAjK,UAAO9M,YAAP,CAAqBwzE,EAArB,EAAyBC,EAAzB,EAA8Bh5E,SAA9B;AACAs9B,WAAQ3sC,IAAR,CAAc0hB,OAAOpjB,CAArB,EAAwBojB,OAAOxW,CAA/B,EAAkCwW,OAAO9O,CAAzC;;AAEA;;AAEAg6B,OAAI5sC,IAAJ,CAAUu4B,CAAV,EAAanrB,CAAb;AAEA;AAED;;AAED;;AAEA,MAAM3M,IAAI,CAAV,EAAaA,IAAIynF,MAAjB,EAAyBznF,GAAzB,EAAgC;;AAE/B,OAAMirB,IAAI,CAAV,EAAaA,IAAIu8D,MAAjB,EAAyBv8D,GAAzB,EAAgC;;AAE/B,OAAI9d,IAAInN,IAAI6nF,UAAJ,GAAiB58D,CAAzB;AACA,OAAI7d,IAAIpN,IAAI6nF,UAAJ,GAAiB58D,CAAjB,GAAqB,CAA7B;AACA,OAAI9a,IAAI,CAAEnQ,IAAI,CAAN,IAAY6nF,UAAZ,GAAyB58D,CAAzB,GAA6B,CAArC;AACA,OAAIrY,IAAI,CAAE5S,IAAI,CAAN,IAAY6nF,UAAZ,GAAyB58D,CAAjC;;AAEA;;AAEA+gB,WAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBwF,CAApB;AACAo5B,WAAQzsC,IAAR,CAAc6N,CAAd,EAAiB+C,CAAjB,EAAoByC,CAApB;AAEA;AAED;;AAED;;AAEA,MAAKuhC,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;AAEA;;AAEDu7C,yBAAyB3pF,SAAzB,GAAqCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAArC;AACA2pF,yBAAyB3pF,SAAzB,CAAmC0O,WAAnC,GAAiDi7E,wBAAjD;;AAEA;;;;;;;AAOA;;AAEA,SAASI,kBAAT,CAA6Bt+D,QAA7B,EAAuCwiB,OAAvC,EAAgDxqB,MAAhD,EAAwDumE,MAAxD,EAAiE;;AAEhEt9C,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,oBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhf,YAAUA,QADO;AAEjBwiB,WAASA,OAFQ;AAGjBxqB,UAAQA,MAHS;AAIjBumE,UAAQA;AAJS,EAAlB;;AAOA,MAAKh8C,kBAAL,CAAyB,IAAIi8C,wBAAJ,CAA8Bx+D,QAA9B,EAAwCwiB,OAAxC,EAAiDxqB,MAAjD,EAAyDumE,MAAzD,CAAzB;AACA,MAAK/4C,aAAL;AAEA;;AAED84C,mBAAmB/pF,SAAnB,GAA+BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA/B;AACA+pF,mBAAmB/pF,SAAnB,CAA6B0O,WAA7B,GAA2Cq7E,kBAA3C;;AAEA;;AAEA,SAASE,wBAAT,CAAmCx+D,QAAnC,EAA6CwiB,OAA7C,EAAsDxqB,MAAtD,EAA8DumE,MAA9D,EAAuE;;AAEtEh0C,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,0BAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhf,YAAUA,QADO;AAEjBwiB,WAASA,OAFQ;AAGjBxqB,UAAQA,MAHS;AAIjBumE,UAAQA;AAJS,EAAlB;;AAOAvmE,UAASA,UAAU,CAAnB;AACAumE,UAASA,UAAU,CAAnB;;AAEA;;AAEA,KAAI/nB,eAAe,EAAnB;AACA,KAAIioB,WAAW,EAAf;;AAEA;;AAEAC,WAAWH,MAAX;;AAEA;;AAEAI,cAAc3mE,MAAd;;AAEA;;AAEA4mE;;AAEA;;AAEA,MAAKh0C,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BgtB,YAA5B,EAA0C,CAA1C,CAA/B;AACA,MAAK5rB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4BgtB,aAAajgE,KAAb,EAA5B,EAAkD,CAAlD,CAA7B;AACA,MAAKq0C,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4Bi1C,QAA5B,EAAsC,CAAtC,CAAzB;;AAEA,KAAKF,WAAW,CAAhB,EAAoB;;AAEnB,OAAK56C,oBAAL,GAFmB,CAEU;AAE7B,EAJD,MAIO;;AAEN,OAAKmI,gBAAL,GAFM,CAEmB;AAEzB;;AAED;;AAEA,UAAS4yC,SAAT,CAAoBH,MAApB,EAA6B;;AAE5B,MAAI56E,IAAI,IAAIkF,OAAJ,EAAR;AACA,MAAIjF,IAAI,IAAIiF,OAAJ,EAAR;AACA,MAAIlC,IAAI,IAAIkC,OAAJ,EAAR;;AAEA;;AAEA,OAAM,IAAIrS,IAAI,CAAd,EAAiBA,IAAIgsC,QAAQrtC,MAA7B,EAAqCqB,KAAK,CAA1C,EAA8C;;AAE7C;;AAEAqoF,oBAAkBr8C,QAAShsC,IAAI,CAAb,CAAlB,EAAoCmN,CAApC;AACAk7E,oBAAkBr8C,QAAShsC,IAAI,CAAb,CAAlB,EAAoCoN,CAApC;AACAi7E,oBAAkBr8C,QAAShsC,IAAI,CAAb,CAAlB,EAAoCmQ,CAApC;;AAEA;;AAEAm4E,iBAAen7E,CAAf,EAAkBC,CAAlB,EAAqB+C,CAArB,EAAwB43E,MAAxB;AAEA;AAED;;AAED,UAASO,aAAT,CAAwBn7E,CAAxB,EAA2BC,CAA3B,EAA8B+C,CAA9B,EAAiC43E,MAAjC,EAA0C;;AAEzC,MAAIQ,OAAOjrF,KAAKC,GAAL,CAAU,CAAV,EAAawqF,MAAb,CAAX;;AAEA;;AAEA,MAAIp7E,IAAI,EAAR;;AAEA,MAAI3M,CAAJ,EAAOirB,CAAP;;AAEA;;AAEA,OAAMjrB,IAAI,CAAV,EAAaA,KAAKuoF,IAAlB,EAAwBvoF,GAAxB,EAA+B;;AAE9B2M,KAAG3M,CAAH,IAAS,EAAT;;AAEA,OAAIwoF,KAAKr7E,EAAEX,KAAF,GAAUhC,IAAV,CAAgB2F,CAAhB,EAAmBnQ,IAAIuoF,IAAvB,CAAT;AACA,OAAIE,KAAKr7E,EAAEZ,KAAF,GAAUhC,IAAV,CAAgB2F,CAAhB,EAAmBnQ,IAAIuoF,IAAvB,CAAT;;AAEA,OAAIG,OAAOH,OAAOvoF,CAAlB;;AAEA,QAAMirB,IAAI,CAAV,EAAaA,KAAKy9D,IAAlB,EAAwBz9D,GAAxB,EAA+B;;AAE9B,QAAKA,MAAM,CAAN,IAAWjrB,MAAMuoF,IAAtB,EAA6B;;AAE5B57E,OAAG3M,CAAH,EAAQirB,CAAR,IAAcu9D,EAAd;AAEA,KAJD,MAIO;;AAEN77E,OAAG3M,CAAH,EAAQirB,CAAR,IAAcu9D,GAAGh8E,KAAH,GAAWhC,IAAX,CAAiBi+E,EAAjB,EAAqBx9D,IAAIy9D,IAAzB,CAAd;AAEA;AAED;AAED;;AAED;;AAEA,OAAM1oF,IAAI,CAAV,EAAaA,IAAIuoF,IAAjB,EAAuBvoF,GAAvB,EAA8B;;AAE7B,QAAMirB,IAAI,CAAV,EAAaA,IAAI,KAAMs9D,OAAOvoF,CAAb,IAAmB,CAApC,EAAuCirB,GAAvC,EAA8C;;AAE7C,QAAI8lB,IAAIzzC,KAAKK,KAAL,CAAYstB,IAAI,CAAhB,CAAR;;AAEA,QAAKA,IAAI,CAAJ,KAAU,CAAf,EAAmB;;AAElB09D,gBAAYh8E,EAAG3M,CAAH,EAAQ+wC,IAAI,CAAZ,CAAZ;AACA43C,gBAAYh8E,EAAG3M,IAAI,CAAP,EAAY+wC,CAAZ,CAAZ;AACA43C,gBAAYh8E,EAAG3M,CAAH,EAAQ+wC,CAAR,CAAZ;AAEA,KAND,MAMO;;AAEN43C,gBAAYh8E,EAAG3M,CAAH,EAAQ+wC,IAAI,CAAZ,CAAZ;AACA43C,gBAAYh8E,EAAG3M,IAAI,CAAP,EAAY+wC,IAAI,CAAhB,CAAZ;AACA43C,gBAAYh8E,EAAG3M,IAAI,CAAP,EAAY+wC,CAAZ,CAAZ;AAEA;AAED;AAED;AAED;;AAED,UAASo3C,YAAT,CAAuB3mE,MAAvB,EAAgC;;AAE/B,MAAIkqB,SAAS,IAAIr5B,OAAJ,EAAb;;AAEA;;AAEA,OAAM,IAAIrS,IAAI,CAAd,EAAiBA,IAAIggE,aAAarhE,MAAlC,EAA0CqB,KAAK,CAA/C,EAAmD;;AAElD0rC,UAAO7tC,CAAP,GAAWmiE,aAAchgE,IAAI,CAAlB,CAAX;AACA0rC,UAAOjhC,CAAP,GAAWu1D,aAAchgE,IAAI,CAAlB,CAAX;AACA0rC,UAAOv5B,CAAP,GAAW6tD,aAAchgE,IAAI,CAAlB,CAAX;;AAEA0rC,UAAO98B,SAAP,GAAmBlB,cAAnB,CAAmC8T,MAAnC;;AAEAw+C,gBAAchgE,IAAI,CAAlB,IAAwB0rC,OAAO7tC,CAA/B;AACAmiE,gBAAchgE,IAAI,CAAlB,IAAwB0rC,OAAOjhC,CAA/B;AACAu1D,gBAAchgE,IAAI,CAAlB,IAAwB0rC,OAAOv5B,CAA/B;AAEA;AAED;;AAED,UAASi2E,WAAT,GAAuB;;AAEtB,MAAI18C,SAAS,IAAIr5B,OAAJ,EAAb;;AAEA,OAAM,IAAIrS,IAAI,CAAd,EAAiBA,IAAIggE,aAAarhE,MAAlC,EAA0CqB,KAAK,CAA/C,EAAmD;;AAElD0rC,UAAO7tC,CAAP,GAAWmiE,aAAchgE,IAAI,CAAlB,CAAX;AACA0rC,UAAOjhC,CAAP,GAAWu1D,aAAchgE,IAAI,CAAlB,CAAX;AACA0rC,UAAOv5B,CAAP,GAAW6tD,aAAchgE,IAAI,CAAlB,CAAX;;AAEA,OAAI83B,IAAI8wD,QAASl9C,MAAT,IAAoB,CAApB,GAAwBpuC,KAAK4L,EAA7B,GAAkC,GAA1C;AACA,OAAIyD,IAAIk8E,YAAan9C,MAAb,IAAwBpuC,KAAK4L,EAA7B,GAAkC,GAA1C;AACA++E,YAAS1oF,IAAT,CAAeu4B,CAAf,EAAkB,IAAInrB,CAAtB;AAEA;;AAEDm8E;;AAEAC;AAEA;;AAED,UAASA,WAAT,GAAuB;;AAEtB;;AAEA,OAAM,IAAI/oF,IAAI,CAAd,EAAiBA,IAAIioF,SAAStpF,MAA9B,EAAsCqB,KAAK,CAA3C,EAA+C;;AAE9C;;AAEA,OAAI0b,KAAKusE,SAAUjoF,IAAI,CAAd,CAAT;AACA,OAAI8b,KAAKmsE,SAAUjoF,IAAI,CAAd,CAAT;AACA,OAAI8Y,KAAKmvE,SAAUjoF,IAAI,CAAd,CAAT;;AAEA,OAAI+J,MAAMzM,KAAKyM,GAAL,CAAU2R,EAAV,EAAcI,EAAd,EAAkBhD,EAAlB,CAAV;AACA,OAAIhP,MAAMxM,KAAKwM,GAAL,CAAU4R,EAAV,EAAcI,EAAd,EAAkBhD,EAAlB,CAAV;;AAEA;;AAEA,OAAK/O,MAAM,GAAN,IAAaD,MAAM,GAAxB,EAA8B;;AAE7B,QAAK4R,KAAK,GAAV,EAAgBusE,SAAUjoF,IAAI,CAAd,KAAqB,CAArB;AAChB,QAAK8b,KAAK,GAAV,EAAgBmsE,SAAUjoF,IAAI,CAAd,KAAqB,CAArB;AAChB,QAAK8Y,KAAK,GAAV,EAAgBmvE,SAAUjoF,IAAI,CAAd,KAAqB,CAArB;AAEhB;AAED;AAED;;AAED,UAAS2oF,UAAT,CAAqBj9C,MAArB,EAA8B;;AAE7Bs0B,eAAazgE,IAAb,CAAmBmsC,OAAO7tC,CAA1B,EAA6B6tC,OAAOjhC,CAApC,EAAuCihC,OAAOv5B,CAA9C;AAEA;;AAED,UAASk2E,gBAAT,CAA2B5pF,KAA3B,EAAkCitC,MAAlC,EAA2C;;AAE1C,MAAIiyC,SAASl/E,QAAQ,CAArB;;AAEAitC,SAAO7tC,CAAP,GAAW2rB,SAAUm0D,SAAS,CAAnB,CAAX;AACAjyC,SAAOjhC,CAAP,GAAW+e,SAAUm0D,SAAS,CAAnB,CAAX;AACAjyC,SAAOv5B,CAAP,GAAWqX,SAAUm0D,SAAS,CAAnB,CAAX;AAEA;;AAED,UAASmL,UAAT,GAAsB;;AAErB,MAAI37E,IAAI,IAAIkF,OAAJ,EAAR;AACA,MAAIjF,IAAI,IAAIiF,OAAJ,EAAR;AACA,MAAIlC,IAAI,IAAIkC,OAAJ,EAAR;;AAEA,MAAI22E,WAAW,IAAI32E,OAAJ,EAAf;;AAEA,MAAI0uC,MAAM,IAAIl1C,OAAJ,EAAV;AACA,MAAIm1C,MAAM,IAAIn1C,OAAJ,EAAV;AACA,MAAIo1C,MAAM,IAAIp1C,OAAJ,EAAV;;AAEA,OAAM,IAAI7L,IAAI,CAAR,EAAWirB,IAAI,CAArB,EAAwBjrB,IAAIggE,aAAarhE,MAAzC,EAAiDqB,KAAK,CAAL,EAAQirB,KAAK,CAA9D,EAAkE;;AAEjE9d,KAAEpB,GAAF,CAAOi0D,aAAchgE,IAAI,CAAlB,CAAP,EAA8BggE,aAAchgE,IAAI,CAAlB,CAA9B,EAAqDggE,aAAchgE,IAAI,CAAlB,CAArD;AACAoN,KAAErB,GAAF,CAAOi0D,aAAchgE,IAAI,CAAlB,CAAP,EAA8BggE,aAAchgE,IAAI,CAAlB,CAA9B,EAAqDggE,aAAchgE,IAAI,CAAlB,CAArD;AACAmQ,KAAEpE,GAAF,CAAOi0D,aAAchgE,IAAI,CAAlB,CAAP,EAA8BggE,aAAchgE,IAAI,CAAlB,CAA9B,EAAqDggE,aAAchgE,IAAI,CAAlB,CAArD;;AAEA+gD,OAAIh1C,GAAJ,CAASk8E,SAAUh9D,IAAI,CAAd,CAAT,EAA4Bg9D,SAAUh9D,IAAI,CAAd,CAA5B;AACA+1B,OAAIj1C,GAAJ,CAASk8E,SAAUh9D,IAAI,CAAd,CAAT,EAA4Bg9D,SAAUh9D,IAAI,CAAd,CAA5B;AACAg2B,OAAIl1C,GAAJ,CAASk8E,SAAUh9D,IAAI,CAAd,CAAT,EAA4Bg9D,SAAUh9D,IAAI,CAAd,CAA5B;;AAEA+9D,YAASt8E,IAAT,CAAeS,CAAf,EAAmBP,GAAnB,CAAwBQ,CAAxB,EAA4BR,GAA5B,CAAiCuD,CAAjC,EAAqCvC,YAArC,CAAmD,CAAnD;;AAEA,OAAIq7E,MAAML,QAASI,QAAT,CAAV;;AAEAE,aAAWnoC,GAAX,EAAgB91B,IAAI,CAApB,EAAuB9d,CAAvB,EAA0B87E,GAA1B;AACAC,aAAWloC,GAAX,EAAgB/1B,IAAI,CAApB,EAAuB7d,CAAvB,EAA0B67E,GAA1B;AACAC,aAAWjoC,GAAX,EAAgBh2B,IAAI,CAApB,EAAuB9a,CAAvB,EAA0B84E,GAA1B;AAEA;AAED;;AAED,UAASC,SAAT,CAAoBvjE,EAApB,EAAwBg4D,MAAxB,EAAgC7jE,MAAhC,EAAwC8uE,OAAxC,EAAkD;;AAEjD,MAAOA,UAAU,CAAZ,IAAqBjjE,GAAG9nB,CAAH,KAAS,CAAnC,EAAyC;;AAExCoqF,YAAUtK,MAAV,IAAqBh4D,GAAG9nB,CAAH,GAAO,CAA5B;AAEA;;AAED,MAAOic,OAAOjc,CAAP,KAAa,CAAf,IAAwBic,OAAO3H,CAAP,KAAa,CAA1C,EAAgD;;AAE/C81E,YAAUtK,MAAV,IAAqBiL,UAAU,CAAV,GAActrF,KAAK4L,EAAnB,GAAwB,GAA7C;AAEA;AAED;;AAED;;AAEA,UAAS0/E,OAAT,CAAkB9uE,MAAlB,EAA2B;;AAE1B,SAAOxc,KAAKwR,KAAL,CAAYgL,OAAO3H,CAAnB,EAAsB,CAAE2H,OAAOjc,CAA/B,CAAP;AAEA;;AAGD;;AAEA,UAASgrF,WAAT,CAAsB/uE,MAAtB,EAA+B;;AAE9B,SAAOxc,KAAKwR,KAAL,CAAY,CAAEgL,OAAOrP,CAArB,EAAwBnN,KAAKmR,IAAL,CAAaqL,OAAOjc,CAAP,GAAWic,OAAOjc,CAApB,GAA4Bic,OAAO3H,CAAP,GAAW2H,OAAO3H,CAAzD,CAAxB,CAAP;AAEA;AAED;;AAED61E,yBAAyBjqF,SAAzB,GAAqCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAArC;AACAiqF,yBAAyBjqF,SAAzB,CAAmC0O,WAAnC,GAAiDu7E,wBAAjD;;AAEA;;;;;AAKA;;AAEA,SAASmB,mBAAT,CAA8B3nE,MAA9B,EAAsCumE,MAAtC,EAA+C;;AAE9Ct9C,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,qBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBumE,UAAQA;AAFS,EAAlB;;AAKA,MAAKh8C,kBAAL,CAAyB,IAAIq9C,yBAAJ,CAA+B5nE,MAA/B,EAAuCumE,MAAvC,CAAzB;AACA,MAAK/4C,aAAL;AAEA;;AAEDm6C,oBAAoBprF,SAApB,GAAgCC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAAhC;AACAorF,oBAAoBprF,SAApB,CAA8B0O,WAA9B,GAA4C08E,mBAA5C;;AAEA;;AAEA,SAASC,yBAAT,CAAoC5nE,MAApC,EAA4CumE,MAA5C,EAAqD;;AAEpD,KAAIv+D,WAAW,CACd,CADc,EACX,CADW,EACR,CADQ,EACJ,CAAE,CADE,EACC,CAAE,CADH,EACM,CADN,EACU,CAAE,CADZ,EACe,CADf,EACkB,CAAE,CADpB,EACwB,CADxB,EAC2B,CAAE,CAD7B,EACgC,CAAE,CADlC,CAAf;;AAIA,KAAIwiB,UAAU,CACb,CADa,EACV,CADU,EACP,CADO,EACH,CADG,EACA,CADA,EACG,CADH,EACM,CADN,EACS,CADT,EACY,CADZ,EACe,CADf,EACkB,CADlB,EACqB,CADrB,CAAd;;AAIAg8C,0BAAyBjpF,IAAzB,CAA+B,IAA/B,EAAqCyqB,QAArC,EAA+CwiB,OAA/C,EAAwDxqB,MAAxD,EAAgEumE,MAAhE;;AAEA,MAAK7oF,IAAL,GAAY,2BAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBumE,UAAQA;AAFS,EAAlB;AAKA;;AAEDqB,0BAA0BrrF,SAA1B,GAAsCC,OAAOgmB,MAAP,CAAegkE,yBAAyBjqF,SAAxC,CAAtC;AACAqrF,0BAA0BrrF,SAA1B,CAAoC0O,WAApC,GAAkD28E,yBAAlD;;AAEA;;;;;AAKA;;AAEA,SAASC,kBAAT,CAA6B7nE,MAA7B,EAAqCumE,MAArC,EAA8C;;AAE7Ct9C,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,oBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBumE,UAAQA;AAFS,EAAlB;;AAKA,MAAKh8C,kBAAL,CAAyB,IAAIu9C,wBAAJ,CAA8B9nE,MAA9B,EAAsCumE,MAAtC,CAAzB;AACA,MAAK/4C,aAAL;AAEA;;AAEDq6C,mBAAmBtrF,SAAnB,GAA+BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA/B;AACAsrF,mBAAmBtrF,SAAnB,CAA6B0O,WAA7B,GAA2C48E,kBAA3C;;AAEA;;AAEA,SAASC,wBAAT,CAAmC9nE,MAAnC,EAA2CumE,MAA3C,EAAoD;;AAEnD,KAAIv+D,WAAW,CACd,CADc,EACX,CADW,EACR,CADQ,EACJ,CAAE,CADE,EACC,CADD,EACI,CADJ,EACO,CADP,EACU,CADV,EACa,CADb,EAEd,CAFc,EAEX,CAAE,CAFS,EAEN,CAFM,EAEF,CAFE,EAEC,CAFD,EAEI,CAFJ,EAEO,CAFP,EAEU,CAFV,EAEa,CAAE,CAFf,CAAf;;AAKA,KAAIwiB,UAAU,CACb,CADa,EACV,CADU,EACP,CADO,EACJ,CADI,EACD,CADC,EACE,CADF,EACK,CADL,EACQ,CADR,EACW,CADX,EAEb,CAFa,EAEV,CAFU,EAEP,CAFO,EAEJ,CAFI,EAED,CAFC,EAEE,CAFF,EAEK,CAFL,EAEQ,CAFR,EAEW,CAFX,EAGb,CAHa,EAGV,CAHU,EAGP,CAHO,EAGJ,CAHI,EAGD,CAHC,EAGE,CAHF,CAAd;;AAMAg8C,0BAAyBjpF,IAAzB,CAA+B,IAA/B,EAAqCyqB,QAArC,EAA+CwiB,OAA/C,EAAwDxqB,MAAxD,EAAgEumE,MAAhE;;AAEA,MAAK7oF,IAAL,GAAY,0BAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBumE,UAAQA;AAFS,EAAlB;AAKA;;AAEDuB,yBAAyBvrF,SAAzB,GAAqCC,OAAOgmB,MAAP,CAAegkE,yBAAyBjqF,SAAxC,CAArC;AACAurF,yBAAyBvrF,SAAzB,CAAmC0O,WAAnC,GAAiD68E,wBAAjD;;AAEA;;;;;AAKA;;AAEA,SAASC,mBAAT,CAA8B/nE,MAA9B,EAAsCumE,MAAtC,EAA+C;;AAE9Ct9C,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,qBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBumE,UAAQA;AAFS,EAAlB;;AAKA,MAAKh8C,kBAAL,CAAyB,IAAIy9C,yBAAJ,CAA+BhoE,MAA/B,EAAuCumE,MAAvC,CAAzB;AACA,MAAK/4C,aAAL;AAEA;;AAEDu6C,oBAAoBxrF,SAApB,GAAgCC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAAhC;AACAwrF,oBAAoBxrF,SAApB,CAA8B0O,WAA9B,GAA4C88E,mBAA5C;;AAEA;;AAEA,SAASC,yBAAT,CAAoChoE,MAApC,EAA4CumE,MAA5C,EAAqD;;AAEpD,KAAIr9E,IAAI,CAAE,IAAIpN,KAAKmR,IAAL,CAAW,CAAX,CAAN,IAAyB,CAAjC;;AAEA,KAAI+a,WAAW,CACd,CAAE,CADY,EACT9e,CADS,EACN,CADM,EACF,CADE,EACCA,CADD,EACI,CADJ,EACQ,CAAE,CADV,EACa,CAAEA,CADf,EACkB,CADlB,EACsB,CADtB,EACyB,CAAEA,CAD3B,EAC8B,CAD9B,EAEb,CAFa,EAEV,CAAE,CAFQ,EAELA,CAFK,EAED,CAFC,EAEE,CAFF,EAEKA,CAFL,EAEQ,CAFR,EAEW,CAAE,CAFb,EAEgB,CAAEA,CAFlB,EAEsB,CAFtB,EAEyB,CAFzB,EAE4B,CAAEA,CAF9B,EAGbA,CAHa,EAGV,CAHU,EAGP,CAAE,CAHK,EAGDA,CAHC,EAGE,CAHF,EAGK,CAHL,EAGS,CAAEA,CAHX,EAGc,CAHd,EAGiB,CAAE,CAHnB,EAGuB,CAAEA,CAHzB,EAG4B,CAH5B,EAG+B,CAH/B,CAAf;;AAMA,KAAIshC,UAAU,CACZ,CADY,EACT,EADS,EACL,CADK,EACD,CADC,EACE,CADF,EACK,CADL,EACS,CADT,EACY,CADZ,EACe,CADf,EACmB,CADnB,EACsB,CADtB,EACyB,EADzB,EAC8B,CAD9B,EACiC,EADjC,EACqC,EADrC,EAEZ,CAFY,EAET,CAFS,EAEN,CAFM,EAEF,CAFE,EAEC,EAFD,EAEK,CAFL,EAEQ,EAFR,EAEY,EAFZ,EAEgB,CAFhB,EAEmB,EAFnB,EAEuB,CAFvB,EAE0B,CAF1B,EAE6B,CAF7B,EAEgC,CAFhC,EAEmC,CAFnC,EAGZ,CAHY,EAGT,CAHS,EAGN,CAHM,EAGF,CAHE,EAGC,CAHD,EAGI,CAHJ,EAGO,CAHP,EAGU,CAHV,EAGa,CAHb,EAGgB,CAHhB,EAGmB,CAHnB,EAGsB,CAHtB,EAGyB,CAHzB,EAG4B,CAH5B,EAG+B,CAH/B,EAIZ,CAJY,EAIT,CAJS,EAIN,CAJM,EAIF,CAJE,EAIC,CAJD,EAII,EAJJ,EAIQ,CAJR,EAIW,CAJX,EAIc,EAJd,EAIkB,CAJlB,EAIqB,CAJrB,EAIwB,CAJxB,EAI2B,CAJ3B,EAI8B,CAJ9B,EAIiC,CAJjC,CAAd;;AAOAg8C,0BAAyBjpF,IAAzB,CAA+B,IAA/B,EAAqCyqB,QAArC,EAA+CwiB,OAA/C,EAAwDxqB,MAAxD,EAAgEumE,MAAhE;;AAEA,MAAK7oF,IAAL,GAAY,2BAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBumE,UAAQA;AAFS,EAAlB;AAKA;;AAEDyB,0BAA0BzrF,SAA1B,GAAsCC,OAAOgmB,MAAP,CAAegkE,yBAAyBjqF,SAAxC,CAAtC;AACAyrF,0BAA0BzrF,SAA1B,CAAoC0O,WAApC,GAAkD+8E,yBAAlD;;AAEA;;;;;AAKA;;AAEA,SAASC,oBAAT,CAA+BjoE,MAA/B,EAAuCumE,MAAvC,EAAgD;;AAE/Ct9C,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,sBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBumE,UAAQA;AAFS,EAAlB;;AAKA,MAAKh8C,kBAAL,CAAyB,IAAI29C,0BAAJ,CAAgCloE,MAAhC,EAAwCumE,MAAxC,CAAzB;AACA,MAAK/4C,aAAL;AAEA;;AAEDy6C,qBAAqB1rF,SAArB,GAAiCC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAAjC;AACA0rF,qBAAqB1rF,SAArB,CAA+B0O,WAA/B,GAA6Cg9E,oBAA7C;;AAEA;;AAEA,SAASC,0BAAT,CAAqCloE,MAArC,EAA6CumE,MAA7C,EAAsD;;AAErD,KAAIr9E,IAAI,CAAE,IAAIpN,KAAKmR,IAAL,CAAW,CAAX,CAAN,IAAyB,CAAjC;AACA,KAAImP,IAAI,IAAIlT,CAAZ;;AAEA,KAAI8e,WAAW;;AAEd;AACA,EAAE,CAHY,EAGT,CAAE,CAHO,EAGJ,CAAE,CAHE,EAGC,CAAE,CAHH,EAGM,CAAE,CAHR,EAGW,CAHX,EAId,CAAE,CAJY,EAIT,CAJS,EAIN,CAAE,CAJI,EAID,CAAE,CAJD,EAII,CAJJ,EAIO,CAJP,EAKd,CALc,EAKX,CAAE,CALS,EAKN,CAAE,CALI,EAKD,CALC,EAKE,CAAE,CALJ,EAKO,CALP,EAMd,CANc,EAMX,CANW,EAMR,CAAE,CANM,EAMH,CANG,EAMA,CANA,EAMG,CANH;;AAQd;AACC,EATa,EASV,CAAE5L,CATQ,EASL,CAAElT,CATG,EASA,CATA,EASG,CAAEkT,CATL,EASQlT,CATR,EAUb,CAVa,EAUVkT,CAVU,EAUP,CAAElT,CAVK,EAUF,CAVE,EAUCkT,CAVD,EAUIlT,CAVJ;;AAYd;AACA,EAAEkT,CAbY,EAaT,CAAElT,CAbO,EAaJ,CAbI,EAaD,CAAEkT,CAbD,EAaIlT,CAbJ,EAaO,CAbP,EAcbkT,CAda,EAcV,CAAElT,CAdQ,EAcL,CAdK,EAcFkT,CAdE,EAcClT,CAdD,EAcI,CAdJ;;AAgBd;AACA,EAAEA,CAjBY,EAiBT,CAjBS,EAiBN,CAAEkT,CAjBI,EAiBDlT,CAjBC,EAiBE,CAjBF,EAiBK,CAAEkT,CAjBP,EAkBd,CAAElT,CAlBY,EAkBT,CAlBS,EAkBNkT,CAlBM,EAkBHlT,CAlBG,EAkBA,CAlBA,EAkBGkT,CAlBH,CAAf;;AAqBA,KAAIouB,UAAU,CACb,CADa,EACV,EADU,EACN,CADM,EACF,CADE,EACC,CADD,EACI,EADJ,EACS,CADT,EACY,EADZ,EACgB,EADhB,EAEb,CAFa,EAEV,EAFU,EAEN,EAFM,EAED,CAFC,EAEE,EAFF,EAEM,CAFN,EAEU,CAFV,EAEa,CAFb,EAEgB,EAFhB,EAGb,EAHa,EAGT,CAHS,EAGN,CAHM,EAGF,EAHE,EAGE,CAHF,EAGK,EAHL,EAGU,EAHV,EAGc,EAHd,EAGkB,CAHlB,EAIb,CAJa,EAIV,CAJU,EAIP,EAJO,EAIF,CAJE,EAIC,EAJD,EAIK,CAJL,EAIS,CAJT,EAIY,CAJZ,EAIe,EAJf,EAKb,CALa,EAKV,EALU,EAKN,CALM,EAKF,CALE,EAKC,CALD,EAKI,EALJ,EAKS,CALT,EAKY,EALZ,EAKgB,EALhB,EAMb,CANa,EAMV,EANU,EAMN,CANM,EAMF,CANE,EAMC,CAND,EAMI,EANJ,EAMS,CANT,EAMY,EANZ,EAMgB,EANhB,EAOb,CAPa,EAOV,EAPU,EAON,EAPM,EAOD,CAPC,EAOE,EAPF,EAOM,CAPN,EAOU,CAPV,EAOa,CAPb,EAOgB,EAPhB,EAQb,EARa,EAQT,CARS,EAQN,CARM,EAQF,EARE,EAQE,CARF,EAQK,EARL,EAQU,EARV,EAQc,EARd,EAQkB,CARlB,EASb,CATa,EASV,EATU,EASN,EATM,EASD,CATC,EASE,EATF,EASM,CATN,EASU,CATV,EASa,CATb,EASgB,CAThB,EAUb,EAVa,EAUT,CAVS,EAUN,CAVM,EAUF,EAVE,EAUE,CAVF,EAUK,EAVL,EAUU,EAVV,EAUc,EAVd,EAUkB,CAVlB,EAWb,EAXa,EAWT,CAXS,EAWN,EAXM,EAWD,EAXC,EAWG,EAXH,EAWO,CAXP,EAWW,EAXX,EAWe,CAXf,EAWkB,EAXlB,EAYb,CAZa,EAYV,EAZU,EAYN,EAZM,EAYD,CAZC,EAYE,EAZF,EAYM,CAZN,EAYU,CAZV,EAYa,CAZb,EAYgB,CAZhB,CAAd;;AAeAg8C,0BAAyBjpF,IAAzB,CAA+B,IAA/B,EAAqCyqB,QAArC,EAA+CwiB,OAA/C,EAAwDxqB,MAAxD,EAAgEumE,MAAhE;;AAEA,MAAK7oF,IAAL,GAAY,4BAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBumE,UAAQA;AAFS,EAAlB;AAKA;;AAED2B,2BAA2B3rF,SAA3B,GAAuCC,OAAOgmB,MAAP,CAAegkE,yBAAyBjqF,SAAxC,CAAvC;AACA2rF,2BAA2B3rF,SAA3B,CAAqC0O,WAArC,GAAmDi9E,0BAAnD;;AAEA;;;;;;;;;;AAUA;;AAEA,SAASC,YAAT,CAAuBr6B,IAAvB,EAA6Bs6B,eAA7B,EAA8CpoE,MAA9C,EAAsDqoE,cAAtD,EAAsEC,MAAtE,EAA8EC,KAA9E,EAAsF;;AAErFt/C,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,cAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB8mB,QAAMA,IADW;AAEjBs6B,mBAAiBA,eAFA;AAGjBpoE,UAAQA,MAHS;AAIjBqoE,kBAAgBA,cAJC;AAKjBC,UAAQA;AALS,EAAlB;;AAQA,KAAKC,UAAU1sF,SAAf,EAA2ByP,QAAQC,IAAR,CAAc,6CAAd;;AAE3B,KAAIi9E,iBAAiB,IAAIC,kBAAJ,CAAwB36B,IAAxB,EAA8Bs6B,eAA9B,EAA+CpoE,MAA/C,EAAuDqoE,cAAvD,EAAuEC,MAAvE,CAArB;;AAEA;;AAEA,MAAKI,QAAL,GAAgBF,eAAeE,QAA/B;AACA,MAAKh+C,OAAL,GAAe89C,eAAe99C,OAA9B;AACA,MAAKi+C,SAAL,GAAiBH,eAAeG,SAAhC;;AAEA;;AAEA,MAAKp+C,kBAAL,CAAyBi+C,cAAzB;AACA,MAAKh7C,aAAL;AAEA;;AAED26C,aAAa5rF,SAAb,GAAyBC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAAzB;AACA4rF,aAAa5rF,SAAb,CAAuB0O,WAAvB,GAAqCk9E,YAArC;;AAEA;;AAEA,SAASM,kBAAT,CAA6B36B,IAA7B,EAAmCs6B,eAAnC,EAAoDpoE,MAApD,EAA4DqoE,cAA5D,EAA4EC,MAA5E,EAAqF;;AAEpF/1C,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,oBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB8mB,QAAMA,IADW;AAEjBs6B,mBAAiBA,eAFA;AAGjBpoE,UAAQA,MAHS;AAIjBqoE,kBAAgBA,cAJC;AAKjBC,UAAQA;AALS,EAAlB;;AAQAF,mBAAkBA,mBAAmB,EAArC;AACApoE,UAASA,UAAU,CAAnB;AACAqoE,kBAAiBA,kBAAkB,CAAnC;AACAC,UAASA,UAAU,KAAnB;;AAEA,KAAIM,SAAS96B,KAAK+6B,mBAAL,CAA0BT,eAA1B,EAA2CE,MAA3C,CAAb;;AAEA;;AAEA,MAAKI,QAAL,GAAgBE,OAAOF,QAAvB;AACA,MAAKh+C,OAAL,GAAek+C,OAAOl+C,OAAtB;AACA,MAAKi+C,SAAL,GAAiBC,OAAOD,SAAxB;;AAEA;;AAEA,KAAIz+C,SAAS,IAAIr5B,OAAJ,EAAb;AACA,KAAI4O,SAAS,IAAI5O,OAAJ,EAAb;AACA,KAAIsT,KAAK,IAAI9Z,OAAJ,EAAT;AACA,KAAIy+E,IAAI,IAAIj4E,OAAJ,EAAR;;AAEA,KAAIrS,CAAJ,EAAOirB,CAAP;;AAEA;;AAEA,KAAIzB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;AACA,KAAIH,UAAU,EAAd;;AAEA;;AAEAu+C;;AAEA;;AAEA,MAAKp2C,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;;AAEA;;AAEA,UAASo+C,kBAAT,GAA8B;;AAE7B,OAAMvqF,IAAI,CAAV,EAAaA,IAAI4pF,eAAjB,EAAkC5pF,GAAlC,EAAyC;;AAExCwqF,mBAAiBxqF,CAAjB;AAEA;;AAED;AACA;AACA;AACA;;AAEAwqF,kBAAmBV,WAAW,KAAb,GAAuBF,eAAvB,GAAyC,CAA1D;;AAEA;AACA;;AAEAxB;;AAEA;;AAEAqC;AAEA;;AAED,UAASD,eAAT,CAA0BxqF,CAA1B,EAA8B;;AAE7B;;AAEAsqF,MAAIh7B,KAAKo7B,UAAL,CAAiB1qF,IAAI4pF,eAArB,EAAsCU,CAAtC,CAAJ;;AAEA;;AAEA,MAAIK,IAAIP,OAAOl+C,OAAP,CAAgBlsC,CAAhB,CAAR;AACA,MAAI4qF,IAAIR,OAAOD,SAAP,CAAkBnqF,CAAlB,CAAR;;AAEA;;AAEA,OAAMirB,IAAI,CAAV,EAAaA,KAAK4+D,cAAlB,EAAkC5+D,GAAlC,EAAyC;;AAExC,OAAIte,IAAIse,IAAI4+D,cAAJ,GAAqBvsF,KAAK4L,EAA1B,GAA+B,CAAvC;;AAEA,OAAImH,MAAM/S,KAAK+S,GAAL,CAAU1D,CAAV,CAAV;AACA,OAAIyD,MAAM,CAAE9S,KAAK8S,GAAL,CAAUzD,CAAV,CAAZ;;AAEA;;AAEAsU,UAAOpjB,CAAP,GAAauS,MAAMu6E,EAAE9sF,CAAR,GAAYwS,MAAMu6E,EAAE/sF,CAAjC;AACAojB,UAAOxW,CAAP,GAAa2F,MAAMu6E,EAAElgF,CAAR,GAAY4F,MAAMu6E,EAAEngF,CAAjC;AACAwW,UAAO9O,CAAP,GAAa/B,MAAMu6E,EAAEx4E,CAAR,GAAY9B,MAAMu6E,EAAEz4E,CAAjC;AACA8O,UAAOrS,SAAP;;AAEAs9B,WAAQ3sC,IAAR,CAAc0hB,OAAOpjB,CAArB,EAAwBojB,OAAOxW,CAA/B,EAAkCwW,OAAO9O,CAAzC;;AAEA;;AAEAu5B,UAAO7tC,CAAP,GAAWysF,EAAEzsF,CAAF,GAAM2jB,SAASP,OAAOpjB,CAAjC;AACA6tC,UAAOjhC,CAAP,GAAW6/E,EAAE7/E,CAAF,GAAM+W,SAASP,OAAOxW,CAAjC;AACAihC,UAAOv5B,CAAP,GAAWm4E,EAAEn4E,CAAF,GAAMqP,SAASP,OAAO9O,CAAjC;;AAEAqX,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;AAEA;AAED;;AAED,UAASs4E,eAAT,GAA2B;;AAE1B,OAAMx/D,IAAI,CAAV,EAAaA,KAAK2+D,eAAlB,EAAmC3+D,GAAnC,EAA0C;;AAEzC,QAAMjrB,IAAI,CAAV,EAAaA,KAAK6pF,cAAlB,EAAkC7pF,GAAlC,EAAyC;;AAExC,QAAImN,IAAI,CAAE08E,iBAAiB,CAAnB,KAA2B5+D,IAAI,CAA/B,KAAuCjrB,IAAI,CAA3C,CAAR;AACA,QAAIoN,IAAI,CAAEy8E,iBAAiB,CAAnB,IAAyB5+D,CAAzB,IAA+BjrB,IAAI,CAAnC,CAAR;AACA,QAAImQ,IAAI,CAAE05E,iBAAiB,CAAnB,IAAyB5+D,CAAzB,GAA6BjrB,CAArC;AACA,QAAI4S,IAAI,CAAEi3E,iBAAiB,CAAnB,KAA2B5+D,IAAI,CAA/B,IAAqCjrB,CAA7C;;AAEA;;AAEAgsC,YAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBwF,CAApB;AACAo5B,YAAQzsC,IAAR,CAAc6N,CAAd,EAAiB+C,CAAjB,EAAoByC,CAApB;AAEA;AAED;AAED;;AAED,UAASw1E,WAAT,GAAuB;;AAEtB,OAAMpoF,IAAI,CAAV,EAAaA,KAAK4pF,eAAlB,EAAmC5pF,GAAnC,EAA0C;;AAEzC,QAAMirB,IAAI,CAAV,EAAaA,KAAK4+D,cAAlB,EAAkC5+D,GAAlC,EAAyC;;AAExCtF,OAAG9nB,CAAH,GAAOmC,IAAI4pF,eAAX;AACAjkE,OAAGlb,CAAH,GAAOwgB,IAAI4+D,cAAX;;AAEA19C,QAAI5sC,IAAJ,CAAUomB,GAAG9nB,CAAb,EAAgB8nB,GAAGlb,CAAnB;AAEA;AAED;AAED;AAED;;AAEDw/E,mBAAmBlsF,SAAnB,GAA+BC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAA/B;AACAksF,mBAAmBlsF,SAAnB,CAA6B0O,WAA7B,GAA2Cw9E,kBAA3C;;AAEA;;;;;;;AAOA;;AAEA,SAASY,iBAAT,CAA4BrpE,MAA5B,EAAoCspE,IAApC,EAA0ClB,eAA1C,EAA2DC,cAA3D,EAA2EhvE,CAA3E,EAA8E/G,CAA9E,EAAiFi3E,WAAjF,EAA+F;;AAE9FtgD,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,mBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBspE,QAAMA,IAFW;AAGjBlB,mBAAiBA,eAHA;AAIjBC,kBAAgBA,cAJC;AAKjBhvE,KAAGA,CALc;AAMjB/G,KAAGA;AANc,EAAlB;;AASA,KAAKi3E,gBAAgB1tF,SAArB,EAAiCyP,QAAQC,IAAR,CAAc,0FAAd;;AAEjC,MAAKg/B,kBAAL,CAAyB,IAAIi/C,uBAAJ,CAA6BxpE,MAA7B,EAAqCspE,IAArC,EAA2ClB,eAA3C,EAA4DC,cAA5D,EAA4EhvE,CAA5E,EAA+E/G,CAA/E,CAAzB;AACA,MAAKk7B,aAAL;AAEA;;AAED67C,kBAAkB9sF,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA9B;AACA8sF,kBAAkB9sF,SAAlB,CAA4B0O,WAA5B,GAA0Co+E,iBAA1C;;AAEA;;AAEA,SAASG,uBAAT,CAAkCxpE,MAAlC,EAA0CspE,IAA1C,EAAgDlB,eAAhD,EAAiEC,cAAjE,EAAiFhvE,CAAjF,EAAoF/G,CAApF,EAAwF;;AAEvFigC,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,yBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBspE,QAAMA,IAFW;AAGjBlB,mBAAiBA,eAHA;AAIjBC,kBAAgBA,cAJC;AAKjBhvE,KAAGA,CALc;AAMjB/G,KAAGA;AANc,EAAlB;;AASA0N,UAASA,UAAU,CAAnB;AACAspE,QAAOA,QAAQ,GAAf;AACAlB,mBAAkBtsF,KAAKK,KAAL,CAAYisF,eAAZ,KAAiC,EAAnD;AACAC,kBAAiBvsF,KAAKK,KAAL,CAAYksF,cAAZ,KAAgC,CAAjD;AACAhvE,KAAIA,KAAK,CAAT;AACA/G,KAAIA,KAAK,CAAT;;AAEA;;AAEA,KAAIk4B,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;;AAEA;;AAEA,KAAInsC,CAAJ,EAAOirB,CAAP;;AAEA,KAAIygB,SAAS,IAAIr5B,OAAJ,EAAb;AACA,KAAI4O,SAAS,IAAI5O,OAAJ,EAAb;;AAEA,KAAI44E,KAAK,IAAI54E,OAAJ,EAAT;AACA,KAAI64E,KAAK,IAAI74E,OAAJ,EAAT;;AAEA,KAAIu4E,IAAI,IAAIv4E,OAAJ,EAAR;AACA,KAAI84E,IAAI,IAAI94E,OAAJ,EAAR;AACA,KAAIs4E,IAAI,IAAIt4E,OAAJ,EAAR;;AAEA;;AAEA,MAAMrS,IAAI,CAAV,EAAaA,KAAK4pF,eAAlB,EAAmC,EAAG5pF,CAAtC,EAA0C;;AAEzC;;AAEA,MAAI83B,IAAI93B,IAAI4pF,eAAJ,GAAsB/uE,CAAtB,GAA0Bvd,KAAK4L,EAA/B,GAAoC,CAA5C;;AAEA;AACA;;AAEAkiF,2BAA0BtzD,CAA1B,EAA6Bjd,CAA7B,EAAgC/G,CAAhC,EAAmC0N,MAAnC,EAA2CypE,EAA3C;AACAG,2BAA0BtzD,IAAI,IAA9B,EAAoCjd,CAApC,EAAuC/G,CAAvC,EAA0C0N,MAA1C,EAAkD0pE,EAAlD;;AAEA;;AAEAC,IAAE59E,UAAF,CAAc29E,EAAd,EAAkBD,EAAlB;AACAN,IAAE39E,UAAF,CAAck+E,EAAd,EAAkBD,EAAlB;AACAL,IAAEz2E,YAAF,CAAgBg3E,CAAhB,EAAmBR,CAAnB;AACAA,IAAEx2E,YAAF,CAAgBy2E,CAAhB,EAAmBO,CAAnB;;AAEA;;AAEAP,IAAEh8E,SAAF;AACA+7E,IAAE/7E,SAAF;;AAEA,OAAMqc,IAAI,CAAV,EAAaA,KAAK4+D,cAAlB,EAAkC,EAAG5+D,CAArC,EAAyC;;AAExC;AACA;;AAEA,OAAIte,IAAIse,IAAI4+D,cAAJ,GAAqBvsF,KAAK4L,EAA1B,GAA+B,CAAvC;AACA,OAAImZ,KAAK,CAAEyoE,IAAF,GAASxtF,KAAK8S,GAAL,CAAUzD,CAAV,CAAlB;AACA,OAAI2V,KAAKwoE,OAAOxtF,KAAK+S,GAAL,CAAU1D,CAAV,CAAhB;;AAEA;AACA;;AAEA++B,UAAO7tC,CAAP,GAAWotF,GAAGptF,CAAH,IAASwkB,KAAKsoE,EAAE9sF,CAAP,GAAWykB,KAAKsoE,EAAE/sF,CAA3B,CAAX;AACA6tC,UAAOjhC,CAAP,GAAWwgF,GAAGxgF,CAAH,IAAS4X,KAAKsoE,EAAElgF,CAAP,GAAW6X,KAAKsoE,EAAEngF,CAA3B,CAAX;AACAihC,UAAOv5B,CAAP,GAAW84E,GAAG94E,CAAH,IAASkQ,KAAKsoE,EAAEx4E,CAAP,GAAWmQ,KAAKsoE,EAAEz4E,CAA3B,CAAX;;AAEAqX,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEA;;AAEA8O,UAAO1T,UAAP,CAAmBm+B,MAAnB,EAA2Bu/C,EAA3B,EAAgCr8E,SAAhC;;AAEAs9B,WAAQ3sC,IAAR,CAAc0hB,OAAOpjB,CAArB,EAAwBojB,OAAOxW,CAA/B,EAAkCwW,OAAO9O,CAAzC;;AAEA;;AAEAg6B,OAAI5sC,IAAJ,CAAUS,IAAI4pF,eAAd;AACAz9C,OAAI5sC,IAAJ,CAAU0rB,IAAI4+D,cAAd;AAEA;AAED;;AAED;;AAEA,MAAM5+D,IAAI,CAAV,EAAaA,KAAK2+D,eAAlB,EAAmC3+D,GAAnC,EAA0C;;AAEzC,OAAMjrB,IAAI,CAAV,EAAaA,KAAK6pF,cAAlB,EAAkC7pF,GAAlC,EAAyC;;AAExC;;AAEA,OAAImN,IAAI,CAAE08E,iBAAiB,CAAnB,KAA2B5+D,IAAI,CAA/B,KAAuCjrB,IAAI,CAA3C,CAAR;AACA,OAAIoN,IAAI,CAAEy8E,iBAAiB,CAAnB,IAAyB5+D,CAAzB,IAA+BjrB,IAAI,CAAnC,CAAR;AACA,OAAImQ,IAAI,CAAE05E,iBAAiB,CAAnB,IAAyB5+D,CAAzB,GAA6BjrB,CAArC;AACA,OAAI4S,IAAI,CAAEi3E,iBAAiB,CAAnB,KAA2B5+D,IAAI,CAA/B,IAAqCjrB,CAA7C;;AAEA;;AAEAgsC,WAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBwF,CAApB;AACAo5B,WAAQzsC,IAAR,CAAc6N,CAAd,EAAiB+C,CAAjB,EAAoByC,CAApB;AAEA;AAED;;AAED;;AAEA,MAAKuhC,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;;AAEA;;AAEA,UAASi/C,wBAAT,CAAmCtzD,CAAnC,EAAsCjd,CAAtC,EAAyC/G,CAAzC,EAA4C0N,MAA5C,EAAoDhJ,QAApD,EAA+D;;AAE9D,MAAI6yE,KAAK/tF,KAAK8S,GAAL,CAAU0nB,CAAV,CAAT;AACA,MAAIwzD,KAAKhuF,KAAK+S,GAAL,CAAUynB,CAAV,CAAT;AACA,MAAIyzD,UAAUz3E,IAAI+G,CAAJ,GAAQid,CAAtB;AACA,MAAI0zD,KAAKluF,KAAK8S,GAAL,CAAUm7E,OAAV,CAAT;;AAEA/yE,WAAS3a,CAAT,GAAa2jB,UAAW,IAAIgqE,EAAf,IAAsB,GAAtB,GAA4BH,EAAzC;AACA7yE,WAAS/N,CAAT,GAAa+W,UAAW,IAAIgqE,EAAf,IAAsBF,EAAtB,GAA2B,GAAxC;AACA9yE,WAASrG,CAAT,GAAaqP,SAASlkB,KAAK+S,GAAL,CAAUk7E,OAAV,CAAT,GAA+B,GAA5C;AAEA;AAED;;AAEDP,wBAAwBjtF,SAAxB,GAAoCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAApC;AACAitF,wBAAwBjtF,SAAxB,CAAkC0O,WAAlC,GAAgDu+E,uBAAhD;;AAEA;;;;;;AAMA;;AAEA,SAASS,aAAT,CAAwBjqE,MAAxB,EAAgCspE,IAAhC,EAAsCjB,cAAtC,EAAsDD,eAAtD,EAAuE8B,GAAvE,EAA6E;;AAE5EjhD,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,eAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBspE,QAAMA,IAFW;AAGjBjB,kBAAgBA,cAHC;AAIjBD,mBAAiBA,eAJA;AAKjB8B,OAAKA;AALY,EAAlB;;AAQA,MAAK3/C,kBAAL,CAAyB,IAAI4/C,mBAAJ,CAAyBnqE,MAAzB,EAAiCspE,IAAjC,EAAuCjB,cAAvC,EAAuDD,eAAvD,EAAwE8B,GAAxE,CAAzB;AACA,MAAK18C,aAAL;AAEA;;AAEDy8C,cAAc1tF,SAAd,GAA0BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA1B;AACA0tF,cAAc1tF,SAAd,CAAwB0O,WAAxB,GAAsCg/E,aAAtC;;AAEA;;AAEA,SAASE,mBAAT,CAA8BnqE,MAA9B,EAAsCspE,IAAtC,EAA4CjB,cAA5C,EAA4DD,eAA5D,EAA6E8B,GAA7E,EAAmF;;AAElF33C,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,qBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBspE,QAAMA,IAFW;AAGjBjB,kBAAgBA,cAHC;AAIjBD,mBAAiBA,eAJA;AAKjB8B,OAAKA;AALY,EAAlB;;AAQAlqE,UAASA,UAAU,CAAnB;AACAspE,QAAOA,QAAQ,GAAf;AACAjB,kBAAiBvsF,KAAKK,KAAL,CAAYksF,cAAZ,KAAgC,CAAjD;AACAD,mBAAkBtsF,KAAKK,KAAL,CAAYisF,eAAZ,KAAiC,CAAnD;AACA8B,OAAMA,OAAOpuF,KAAK4L,EAAL,GAAU,CAAvB;;AAEA;;AAEA,KAAI8iC,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;;AAEA;;AAEA,KAAIj8B,SAAS,IAAImC,OAAJ,EAAb;AACA,KAAIq5B,SAAS,IAAIr5B,OAAJ,EAAb;AACA,KAAI4O,SAAS,IAAI5O,OAAJ,EAAb;;AAEA,KAAI4Y,CAAJ,EAAOjrB,CAAP;;AAEA;;AAEA,MAAMirB,IAAI,CAAV,EAAaA,KAAK4+D,cAAlB,EAAkC5+D,GAAlC,EAAyC;;AAExC,OAAMjrB,IAAI,CAAV,EAAaA,KAAK4pF,eAAlB,EAAmC5pF,GAAnC,EAA0C;;AAEzC,OAAI83B,IAAI93B,IAAI4pF,eAAJ,GAAsB8B,GAA9B;AACA,OAAI/+E,IAAIse,IAAI4+D,cAAJ,GAAqBvsF,KAAK4L,EAA1B,GAA+B,CAAvC;;AAEA;;AAEAwiC,UAAO7tC,CAAP,GAAW,CAAE2jB,SAASspE,OAAOxtF,KAAK8S,GAAL,CAAUzD,CAAV,CAAlB,IAAoCrP,KAAK8S,GAAL,CAAU0nB,CAAV,CAA/C;AACA4T,UAAOjhC,CAAP,GAAW,CAAE+W,SAASspE,OAAOxtF,KAAK8S,GAAL,CAAUzD,CAAV,CAAlB,IAAoCrP,KAAK+S,GAAL,CAAUynB,CAAV,CAA/C;AACA4T,UAAOv5B,CAAP,GAAW24E,OAAOxtF,KAAK+S,GAAL,CAAU1D,CAAV,CAAlB;;AAEA6c,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEA;;AAEAjC,UAAOrS,CAAP,GAAW2jB,SAASlkB,KAAK8S,GAAL,CAAU0nB,CAAV,CAApB;AACA5nB,UAAOzF,CAAP,GAAW+W,SAASlkB,KAAK+S,GAAL,CAAUynB,CAAV,CAApB;AACA7W,UAAO1T,UAAP,CAAmBm+B,MAAnB,EAA2Bx7B,MAA3B,EAAoCtB,SAApC;;AAEAs9B,WAAQ3sC,IAAR,CAAc0hB,OAAOpjB,CAArB,EAAwBojB,OAAOxW,CAA/B,EAAkCwW,OAAO9O,CAAzC;;AAEA;;AAEAg6B,OAAI5sC,IAAJ,CAAUS,IAAI4pF,eAAd;AACAz9C,OAAI5sC,IAAJ,CAAU0rB,IAAI4+D,cAAd;AAEA;AAED;;AAED;;AAEA,MAAM5+D,IAAI,CAAV,EAAaA,KAAK4+D,cAAlB,EAAkC5+D,GAAlC,EAAyC;;AAExC,OAAMjrB,IAAI,CAAV,EAAaA,KAAK4pF,eAAlB,EAAmC5pF,GAAnC,EAA0C;;AAEzC;;AAEA,OAAImN,IAAI,CAAEy8E,kBAAkB,CAApB,IAA0B3+D,CAA1B,GAA8BjrB,CAA9B,GAAkC,CAA1C;AACA,OAAIoN,IAAI,CAAEw8E,kBAAkB,CAApB,KAA4B3+D,IAAI,CAAhC,IAAsCjrB,CAAtC,GAA0C,CAAlD;AACA,OAAImQ,IAAI,CAAEy5E,kBAAkB,CAApB,KAA4B3+D,IAAI,CAAhC,IAAsCjrB,CAA9C;AACA,OAAI4S,IAAI,CAAEg3E,kBAAkB,CAApB,IAA0B3+D,CAA1B,GAA8BjrB,CAAtC;;AAEA;;AAEAgsC,WAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBwF,CAApB;AACAo5B,WAAQzsC,IAAR,CAAc6N,CAAd,EAAiB+C,CAAjB,EAAoByC,CAApB;AAEA;AAED;;AAED;;AAEA,MAAKuhC,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;AAEA;;AAEDw/C,oBAAoB5tF,SAApB,GAAgCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAAhC;AACA4tF,oBAAoB5tF,SAApB,CAA8B0O,WAA9B,GAA4Ck/E,mBAA5C;;AAEA;;;;;AAKA,IAAIC,SAAS;;AAEZC,cAAa,UAAWzkE,IAAX,EAAiB0kE,WAAjB,EAA8BC,GAA9B,EAAoC;;AAEhDA,QAAMA,OAAO,CAAb;;AAEA,MAAIC,WAAWF,eAAeA,YAAYntF,MAA1C;AAAA,MACCstF,WAAWD,WAAWF,YAAa,CAAb,IAAmBC,GAA9B,GAAoC3kE,KAAKzoB,MADrD;AAAA,MAECutF,YAAYC,WAAY/kE,IAAZ,EAAkB,CAAlB,EAAqB6kE,QAArB,EAA+BF,GAA/B,EAAoC,IAApC,CAFb;AAAA,MAGCziC,YAAY,EAHb;;AAKA,MAAK,CAAE4iC,SAAP,EAAmB,OAAO5iC,SAAP;;AAEnB,MAAI5hC,IAAJ,EAAUC,IAAV,EAAgBE,IAAhB,EAAsBC,IAAtB,EAA4BjqB,CAA5B,EAA+B4M,CAA/B,EAAkC2hF,OAAlC;;AAEA,MAAKJ,QAAL,EAAgBE,YAAYG,eAAgBjlE,IAAhB,EAAsB0kE,WAAtB,EAAmCI,SAAnC,EAA8CH,GAA9C,CAAZ;;AAEhB;;AAEA,MAAK3kE,KAAKzoB,MAAL,GAAc,KAAKotF,GAAxB,EAA8B;;AAE7BrkE,UAAOG,OAAOT,KAAM,CAAN,CAAd;AACAO,UAAOG,OAAOV,KAAM,CAAN,CAAd;;AAEA,QAAM,IAAIpnB,IAAI+rF,GAAd,EAAmB/rF,IAAIisF,QAAvB,EAAiCjsF,KAAK+rF,GAAtC,EAA4C;;AAE3CluF,QAAIupB,KAAMpnB,CAAN,CAAJ;AACAyK,QAAI2c,KAAMpnB,IAAI,CAAV,CAAJ;AACA,QAAKnC,IAAI6pB,IAAT,EAAgBA,OAAO7pB,CAAP;AAChB,QAAK4M,IAAIkd,IAAT,EAAgBA,OAAOld,CAAP;AAChB,QAAK5M,IAAIgqB,IAAT,EAAgBA,OAAOhqB,CAAP;AAChB,QAAK4M,IAAIqd,IAAT,EAAgBA,OAAOrd,CAAP;AAEhB;;AAED;;AAEA2hF,aAAU9uF,KAAKyM,GAAL,CAAU8d,OAAOH,IAAjB,EAAuBI,OAAOH,IAA9B,CAAV;AACAykE,aAAUA,YAAY,CAAZ,GAAgB,IAAIA,OAApB,GAA8B,CAAxC;AAEA;;AAEDE,eAAcJ,SAAd,EAAyB5iC,SAAzB,EAAoCyiC,GAApC,EAAyCrkE,IAAzC,EAA+CC,IAA/C,EAAqDykE,OAArD;;AAEA,SAAO9iC,SAAP;AAEA;;AA9CW,CAAb;;AAkDA;;AAEA,SAAS6iC,UAAT,CAAqB/kE,IAArB,EAA2B4G,KAA3B,EAAkCI,GAAlC,EAAuC29D,GAAvC,EAA4CQ,SAA5C,EAAwD;;AAEvD,KAAIvsF,CAAJ,EAAOwsF,IAAP;;AAEA,KAAKD,cAAgBE,WAAYrlE,IAAZ,EAAkB4G,KAAlB,EAAyBI,GAAzB,EAA8B29D,GAA9B,IAAsC,CAA3D,EAAiE;;AAEhE,OAAM/rF,IAAIguB,KAAV,EAAiBhuB,IAAIouB,GAArB,EAA0BpuB,KAAK+rF,GAA/B,EAAqCS,OAAOE,WAAY1sF,CAAZ,EAAeonB,KAAMpnB,CAAN,CAAf,EAA0BonB,KAAMpnB,IAAI,CAAV,CAA1B,EAAyCwsF,IAAzC,CAAP;AAErC,EAJD,MAIO;;AAEN,OAAMxsF,IAAIouB,MAAM29D,GAAhB,EAAqB/rF,KAAKguB,KAA1B,EAAiChuB,KAAK+rF,GAAtC,EAA4CS,OAAOE,WAAY1sF,CAAZ,EAAeonB,KAAMpnB,CAAN,CAAf,EAA0BonB,KAAMpnB,IAAI,CAAV,CAA1B,EAAyCwsF,IAAzC,CAAP;AAE5C;;AAED,KAAKA,QAAQ/8E,OAAQ+8E,IAAR,EAAcA,KAAK58B,IAAnB,CAAb,EAAyC;;AAExC+8B,aAAYH,IAAZ;AACAA,SAAOA,KAAK58B,IAAZ;AAEA;;AAED,QAAO48B,IAAP;AAEA;;AAED;;AAEA,SAASI,YAAT,CAAuB5+D,KAAvB,EAA8BI,GAA9B,EAAoC;;AAEnC,KAAK,CAAEJ,KAAP,EAAe,OAAOA,KAAP;AACf,KAAK,CAAEI,GAAP,EAAaA,MAAMJ,KAAN;;AAEb,KAAInT,IAAImT,KAAR;AAAA,KAAe6+D,KAAf;;AAEA,IAAG;;AAEFA,UAAQ,KAAR;;AAEA,MAAK,CAAEhyE,EAAEiyE,OAAJ,KAAiBr9E,OAAQoL,CAAR,EAAWA,EAAE+0C,IAAb,KAAuBm9B,KAAMlyE,EAAEmyE,IAAR,EAAcnyE,CAAd,EAAiBA,EAAE+0C,IAAnB,MAA8B,CAAtE,CAAL,EAAiF;;AAEhF+8B,cAAY9xE,CAAZ;AACAA,OAAIuT,MAAMvT,EAAEmyE,IAAZ;AACA,OAAKnyE,MAAMA,EAAE+0C,IAAb,EAAoB;AACpBi9B,WAAQ,IAAR;AAEA,GAPD,MAOO;;AAENhyE,OAAIA,EAAE+0C,IAAN;AAEA;AAED,EAjBD,QAiBUi9B,SAAShyE,MAAMuT,GAjBzB;;AAmBA,QAAOA,GAAP;AAEA;;AAED;;AAEA,SAASk+D,YAAT,CAAuBW,GAAvB,EAA4B3jC,SAA5B,EAAuCyiC,GAAvC,EAA4CrkE,IAA5C,EAAkDC,IAAlD,EAAwDykE,OAAxD,EAAiEc,IAAjE,EAAwE;;AAEvE,KAAK,CAAED,GAAP,EAAa;;AAEb;;AAEA,KAAK,CAAEC,IAAF,IAAUd,OAAf,EAAyBe,WAAYF,GAAZ,EAAiBvlE,IAAjB,EAAuBC,IAAvB,EAA6BykE,OAA7B;;AAEzB,KAAIprD,OAAOisD,GAAX;AAAA,KAAgBD,IAAhB;AAAA,KAAsBp9B,IAAtB;;AAEA;;AAEA,QAAQq9B,IAAID,IAAJ,KAAaC,IAAIr9B,IAAzB,EAAgC;;AAE/Bo9B,SAAOC,IAAID,IAAX;AACAp9B,SAAOq9B,IAAIr9B,IAAX;;AAEA,MAAKw8B,UAAUgB,YAAaH,GAAb,EAAkBvlE,IAAlB,EAAwBC,IAAxB,EAA8BykE,OAA9B,CAAV,GAAoDiB,MAAOJ,GAAP,CAAzD,EAAwE;;AAEvE;AACA3jC,aAAU/pD,IAAV,CAAgBytF,KAAKhtF,CAAL,GAAS+rF,GAAzB;AACAziC,aAAU/pD,IAAV,CAAgB0tF,IAAIjtF,CAAJ,GAAQ+rF,GAAxB;AACAziC,aAAU/pD,IAAV,CAAgBqwD,KAAK5vD,CAAL,GAAS+rF,GAAzB;;AAEAY,cAAYM,GAAZ;;AAEA;AACAA,SAAMr9B,KAAKA,IAAX;AACA5uB,UAAO4uB,KAAKA,IAAZ;;AAEA;AAEA;;AAEDq9B,QAAMr9B,IAAN;;AAEA;;AAEA,MAAKq9B,QAAQjsD,IAAb,EAAoB;;AAEnB;;AAEA,OAAK,CAAEksD,IAAP,EAAc;;AAEbZ,iBAAcM,aAAcK,GAAd,CAAd,EAAmC3jC,SAAnC,EAA8CyiC,GAA9C,EAAmDrkE,IAAnD,EAAyDC,IAAzD,EAA+DykE,OAA/D,EAAwE,CAAxE;;AAEA;AAEA,IAND,MAMO,IAAKc,SAAS,CAAd,EAAkB;;AAExBD,UAAMK,uBAAwBL,GAAxB,EAA6B3jC,SAA7B,EAAwCyiC,GAAxC,CAAN;AACAO,iBAAcW,GAAd,EAAmB3jC,SAAnB,EAA8ByiC,GAA9B,EAAmCrkE,IAAnC,EAAyCC,IAAzC,EAA+CykE,OAA/C,EAAwD,CAAxD;;AAED;AAEC,IAPM,MAOA,IAAKc,SAAS,CAAd,EAAkB;;AAExBK,gBAAaN,GAAb,EAAkB3jC,SAAlB,EAA6ByiC,GAA7B,EAAkCrkE,IAAlC,EAAwCC,IAAxC,EAA8CykE,OAA9C;AAEA;;AAED;AAEA;AAED;AAED;;AAED;;AAEA,SAASiB,KAAT,CAAgBJ,GAAhB,EAAsB;;AAErB,KAAI9/E,IAAI8/E,IAAID,IAAZ;AAAA,KACC5/E,IAAI6/E,GADL;AAAA,KAEC98E,IAAI88E,IAAIr9B,IAFT;;AAIA,KAAKm9B,KAAM5/E,CAAN,EAASC,CAAT,EAAY+C,CAAZ,KAAmB,CAAxB,EAA4B,OAAO,KAAP,CANP,CAMqB;;AAE1C;AACA,KAAI0K,IAAIoyE,IAAIr9B,IAAJ,CAASA,IAAjB;;AAEA,QAAQ/0C,MAAMoyE,IAAID,IAAlB,EAAyB;;AAExB,MAAKQ,gBAAiBrgF,EAAEtP,CAAnB,EAAsBsP,EAAE1C,CAAxB,EAA2B2C,EAAEvP,CAA7B,EAAgCuP,EAAE3C,CAAlC,EAAqC0F,EAAEtS,CAAvC,EAA0CsS,EAAE1F,CAA5C,EAA+CoQ,EAAEhd,CAAjD,EAAoDgd,EAAEpQ,CAAtD,KAA6DsiF,KAAMlyE,EAAEmyE,IAAR,EAAcnyE,CAAd,EAAiBA,EAAE+0C,IAAnB,KAA6B,CAA/F,EAAmG;;AAElG,UAAO,KAAP;AAEA;;AAED/0C,MAAIA,EAAE+0C,IAAN;AAEA;;AAED,QAAO,IAAP;AAEA;;AAED,SAASw9B,WAAT,CAAsBH,GAAtB,EAA2BvlE,IAA3B,EAAiCC,IAAjC,EAAuCykE,OAAvC,EAAiD;;AAEhD,KAAIj/E,IAAI8/E,IAAID,IAAZ;AAAA,KACC5/E,IAAI6/E,GADL;AAAA,KAEC98E,IAAI88E,IAAIr9B,IAFT;;AAIA,KAAKm9B,KAAM5/E,CAAN,EAASC,CAAT,EAAY+C,CAAZ,KAAmB,CAAxB,EAA4B,OAAO,KAAP,CANoB,CAMN;;AAE1C;;AAEA,KAAIs9E,QAAQtgF,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAR,GAAcsP,EAAEtP,CAAF,GAAMsS,EAAEtS,CAAR,GAAYsP,EAAEtP,CAAd,GAAkBsS,EAAEtS,CAAlC,GAA0CuP,EAAEvP,CAAF,GAAMsS,EAAEtS,CAAR,GAAYuP,EAAEvP,CAAd,GAAkBsS,EAAEtS,CAA1E;AAAA,KACC6vF,QAAQvgF,EAAE1C,CAAF,GAAM2C,EAAE3C,CAAR,GAAc0C,EAAE1C,CAAF,GAAM0F,EAAE1F,CAAR,GAAY0C,EAAE1C,CAAd,GAAkB0F,EAAE1F,CAAlC,GAA0C2C,EAAE3C,CAAF,GAAM0F,EAAE1F,CAAR,GAAY2C,EAAE3C,CAAd,GAAkB0F,EAAE1F,CADvE;AAAA,KAECkjF,QAAQxgF,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAR,GAAcsP,EAAEtP,CAAF,GAAMsS,EAAEtS,CAAR,GAAYsP,EAAEtP,CAAd,GAAkBsS,EAAEtS,CAAlC,GAA0CuP,EAAEvP,CAAF,GAAMsS,EAAEtS,CAAR,GAAYuP,EAAEvP,CAAd,GAAkBsS,EAAEtS,CAFvE;AAAA,KAGC+vF,QAAQzgF,EAAE1C,CAAF,GAAM2C,EAAE3C,CAAR,GAAc0C,EAAE1C,CAAF,GAAM0F,EAAE1F,CAAR,GAAY0C,EAAE1C,CAAd,GAAkB0F,EAAE1F,CAAlC,GAA0C2C,EAAE3C,CAAF,GAAM0F,EAAE1F,CAAR,GAAY2C,EAAE3C,CAAd,GAAkB0F,EAAE1F,CAHvE;;AAKA;;AAEA,KAAImd,OAAOimE,OAAQJ,KAAR,EAAeC,KAAf,EAAsBhmE,IAAtB,EAA4BC,IAA5B,EAAkCykE,OAAlC,CAAX;AAAA,KACCrkE,OAAO8lE,OAAQF,KAAR,EAAeC,KAAf,EAAsBlmE,IAAtB,EAA4BC,IAA5B,EAAkCykE,OAAlC,CADR;;AAGA;;AAEA,KAAIvxE,IAAIoyE,IAAIa,KAAZ;;AAEA,QAAQjzE,KAAKA,EAAE1I,CAAF,IAAO4V,IAApB,EAA2B;;AAE1B,MAAKlN,MAAMoyE,IAAID,IAAV,IAAkBnyE,MAAMoyE,IAAIr9B,IAA5B,IACH49B,gBAAiBrgF,EAAEtP,CAAnB,EAAsBsP,EAAE1C,CAAxB,EAA2B2C,EAAEvP,CAA7B,EAAgCuP,EAAE3C,CAAlC,EAAqC0F,EAAEtS,CAAvC,EAA0CsS,EAAE1F,CAA5C,EAA+CoQ,EAAEhd,CAAjD,EAAoDgd,EAAEpQ,CAAtD,CADG,IAEHsiF,KAAMlyE,EAAEmyE,IAAR,EAAcnyE,CAAd,EAAiBA,EAAE+0C,IAAnB,KAA6B,CAF/B,EAEmC,OAAO,KAAP;AACnC/0C,MAAIA,EAAEizE,KAAN;AAEA;;AAED;;AAEAjzE,KAAIoyE,IAAIc,KAAR;;AAEA,QAAQlzE,KAAKA,EAAE1I,CAAF,IAAOyV,IAApB,EAA2B;;AAE1B,MAAK/M,MAAMoyE,IAAID,IAAV,IAAkBnyE,MAAMoyE,IAAIr9B,IAA5B,IACH49B,gBAAiBrgF,EAAEtP,CAAnB,EAAsBsP,EAAE1C,CAAxB,EAA2B2C,EAAEvP,CAA7B,EAAgCuP,EAAE3C,CAAlC,EAAqC0F,EAAEtS,CAAvC,EAA0CsS,EAAE1F,CAA5C,EAA+CoQ,EAAEhd,CAAjD,EAAoDgd,EAAEpQ,CAAtD,CADG,IAEHsiF,KAAMlyE,EAAEmyE,IAAR,EAAcnyE,CAAd,EAAiBA,EAAE+0C,IAAnB,KAA6B,CAF/B,EAEmC,OAAO,KAAP;;AAEnC/0C,MAAIA,EAAEkzE,KAAN;AAEA;;AAED,QAAO,IAAP;AAEA;;AAED;;AAEA,SAAST,sBAAT,CAAiCt/D,KAAjC,EAAwCs7B,SAAxC,EAAmDyiC,GAAnD,EAAyD;;AAExD,KAAIlxE,IAAImT,KAAR;;AAEA,IAAG;;AAEF,MAAI7gB,IAAI0N,EAAEmyE,IAAV;AAAA,MAAgB5/E,IAAIyN,EAAE+0C,IAAF,CAAOA,IAA3B;;AAEA,MAAK,CAAEngD,OAAQtC,CAAR,EAAWC,CAAX,CAAF,IAAoBw0C,WAAYz0C,CAAZ,EAAe0N,CAAf,EAAkBA,EAAE+0C,IAApB,EAA0BxiD,CAA1B,CAApB,IAAqD4gF,cAAe7gF,CAAf,EAAkBC,CAAlB,CAArD,IAA8E4gF,cAAe5gF,CAAf,EAAkBD,CAAlB,CAAnF,EAA2G;;AAE1Gm8C,aAAU/pD,IAAV,CAAgB4N,EAAEnN,CAAF,GAAM+rF,GAAtB;AACAziC,aAAU/pD,IAAV,CAAgBsb,EAAE7a,CAAF,GAAM+rF,GAAtB;AACAziC,aAAU/pD,IAAV,CAAgB6N,EAAEpN,CAAF,GAAM+rF,GAAtB;;AAEA;;AAEAY,cAAY9xE,CAAZ;AACA8xE,cAAY9xE,EAAE+0C,IAAd;;AAEA/0C,OAAImT,QAAQ5gB,CAAZ;AAEA;;AAEDyN,MAAIA,EAAE+0C,IAAN;AAEA,EArBD,QAqBU/0C,MAAMmT,KArBhB;;AAuBA,QAAOnT,CAAP;AAEA;;AAED;;AAEA,SAAS0yE,WAAT,CAAsBv/D,KAAtB,EAA6Bs7B,SAA7B,EAAwCyiC,GAAxC,EAA6CrkE,IAA7C,EAAmDC,IAAnD,EAAyDykE,OAAzD,EAAmE;;AAElE;;AAEA,KAAIj/E,IAAI6gB,KAAR;;AAEA,IAAG;;AAEF,MAAI5gB,IAAID,EAAEyiD,IAAF,CAAOA,IAAf;;AAEA,SAAQxiD,MAAMD,EAAE6/E,IAAhB,EAAuB;;AAEtB,OAAK7/E,EAAEnN,CAAF,KAAQoN,EAAEpN,CAAV,IAAeiuF,gBAAiB9gF,CAAjB,EAAoBC,CAApB,CAApB,EAA8C;;AAE7C;;AAEA,QAAI+C,IAAI+9E,aAAc/gF,CAAd,EAAiBC,CAAjB,CAAR;;AAEA;;AAEAD,QAAIy/E,aAAcz/E,CAAd,EAAiBA,EAAEyiD,IAAnB,CAAJ;AACAz/C,QAAIy8E,aAAcz8E,CAAd,EAAiBA,EAAEy/C,IAAnB,CAAJ;;AAEA;;AAEA08B,iBAAcn/E,CAAd,EAAiBm8C,SAAjB,EAA4ByiC,GAA5B,EAAiCrkE,IAAjC,EAAuCC,IAAvC,EAA6CykE,OAA7C;AACAE,iBAAcn8E,CAAd,EAAiBm5C,SAAjB,EAA4ByiC,GAA5B,EAAiCrkE,IAAjC,EAAuCC,IAAvC,EAA6CykE,OAA7C;AACA;AAEA;;AAEDh/E,OAAIA,EAAEwiD,IAAN;AAEA;;AAEDziD,MAAIA,EAAEyiD,IAAN;AAEA,EA/BD,QA+BUziD,MAAM6gB,KA/BhB;AAiCA;;AAED;;AAEA,SAASq+D,cAAT,CAAyBjlE,IAAzB,EAA+B0kE,WAA/B,EAA4CI,SAA5C,EAAuDH,GAAvD,EAA6D;;AAE5D,KAAIoC,QAAQ,EAAZ;AAAA,KAAgBnuF,CAAhB;AAAA,KAAmBoc,GAAnB;AAAA,KAAwB4R,KAAxB;AAAA,KAA+BI,GAA/B;AAAA,KAAoC+rC,IAApC;;AAEA,MAAMn6D,IAAI,CAAJ,EAAOoc,MAAM0vE,YAAYntF,MAA/B,EAAuCqB,IAAIoc,GAA3C,EAAgDpc,GAAhD,EAAuD;;AAEtDguB,UAAQ89D,YAAa9rF,CAAb,IAAmB+rF,GAA3B;AACA39D,QAAMpuB,IAAIoc,MAAM,CAAV,GAAc0vE,YAAa9rF,IAAI,CAAjB,IAAuB+rF,GAArC,GAA2C3kE,KAAKzoB,MAAtD;AACAw7D,SAAOgyB,WAAY/kE,IAAZ,EAAkB4G,KAAlB,EAAyBI,GAAzB,EAA8B29D,GAA9B,EAAmC,KAAnC,CAAP;AACA,MAAK5xB,SAASA,KAAKvK,IAAnB,EAA0BuK,KAAK2yB,OAAL,GAAe,IAAf;AAC1BqB,QAAM5uF,IAAN,CAAY6uF,YAAaj0B,IAAb,CAAZ;AAEA;;AAEDg0B,OAAMv+C,IAAN,CAAYy+C,QAAZ;;AAEA;;AAEA,MAAMruF,IAAI,CAAV,EAAaA,IAAImuF,MAAMxvF,MAAvB,EAA+BqB,GAA/B,EAAsC;;AAErCsuF,gBAAeH,MAAOnuF,CAAP,CAAf,EAA2BksF,SAA3B;AACAA,cAAYU,aAAcV,SAAd,EAAyBA,UAAUt8B,IAAnC,CAAZ;AAEA;;AAED,QAAOs8B,SAAP;AAEA;;AAED,SAASmC,QAAT,CAAmBlhF,CAAnB,EAAsBC,CAAtB,EAA0B;;AAEzB,QAAOD,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAf;AAEA;;AAED;;AAEA,SAASywF,aAAT,CAAwBC,IAAxB,EAA8BrC,SAA9B,EAA0C;;AAEzCA,aAAYsC,eAAgBD,IAAhB,EAAsBrC,SAAtB,CAAZ;;AAEA,KAAKA,SAAL,EAAiB;;AAEhB,MAAI9+E,IAAI8gF,aAAchC,SAAd,EAAyBqC,IAAzB,CAAR;;AAEA3B,eAAcx/E,CAAd,EAAiBA,EAAEwiD,IAAnB;AAEA;AAED;;AAED;;AAEA,SAAS4+B,cAAT,CAAyBD,IAAzB,EAA+BrC,SAA/B,EAA2C;;AAE1C,KAAIrxE,IAAIqxE,SAAR;AAAA,KACCuC,KAAKF,KAAK1wF,CADX;AAAA,KAEC6wF,KAAKH,KAAK9jF,CAFX;AAAA,KAGC+U,KAAK,CAAE+H,QAHR;AAAA,KAICrd,CAJD;;AAMA;AACA;;AAEA,IAAG;;AAEF,MAAKwkF,MAAM7zE,EAAEpQ,CAAR,IAAaikF,MAAM7zE,EAAE+0C,IAAF,CAAOnlD,CAA1B,IAA+BoQ,EAAE+0C,IAAF,CAAOnlD,CAAP,KAAaoQ,EAAEpQ,CAAnD,EAAuD;;AAEtD,OAAI5M,IAAIgd,EAAEhd,CAAF,GAAM,CAAE6wF,KAAK7zE,EAAEpQ,CAAT,KAAiBoQ,EAAE+0C,IAAF,CAAO/xD,CAAP,GAAWgd,EAAEhd,CAA9B,KAAsCgd,EAAE+0C,IAAF,CAAOnlD,CAAP,GAAWoQ,EAAEpQ,CAAnD,CAAd;;AAEA,OAAK5M,KAAK4wF,EAAL,IAAW5wF,IAAI2hB,EAApB,EAAyB;;AAExBA,SAAK3hB,CAAL;;AAEA,QAAKA,MAAM4wF,EAAX,EAAgB;;AAEf,SAAKC,OAAO7zE,EAAEpQ,CAAd,EAAkB,OAAOoQ,CAAP;AAClB,SAAK6zE,OAAO7zE,EAAE+0C,IAAF,CAAOnlD,CAAnB,EAAuB,OAAOoQ,EAAE+0C,IAAT;AAEvB;;AAED1lD,QAAI2Q,EAAEhd,CAAF,GAAMgd,EAAE+0C,IAAF,CAAO/xD,CAAb,GAAiBgd,CAAjB,GAAqBA,EAAE+0C,IAA3B;AAEA;AAED;;AAED/0C,MAAIA,EAAE+0C,IAAN;AAEA,EAzBD,QAyBU/0C,MAAMqxE,SAzBhB;;AA2BA,KAAK,CAAEhiF,CAAP,EAAW,OAAO,IAAP;;AAEX,KAAKukF,OAAOjvE,EAAZ,EAAiB,OAAOtV,EAAE8iF,IAAT,CAxCyB,CAwCV;;AAEhC;AACA;AACA;;AAEA,KAAIhsD,OAAO92B,CAAX;AAAA,KACCykF,KAAKzkF,EAAErM,CADR;AAAA,KAEC+wF,KAAK1kF,EAAEO,CAFR;AAAA,KAGCokF,SAAStnE,QAHV;AAAA,KAIC4qD,GAJD;;AAMAt3D,KAAI3Q,EAAE0lD,IAAN;;AAEA,QAAQ/0C,MAAMmmB,IAAd,EAAqB;;AAEpB,MAAKytD,MAAM5zE,EAAEhd,CAAR,IAAagd,EAAEhd,CAAF,IAAO8wF,EAApB,IAA0BF,OAAO5zE,EAAEhd,CAAnC,IACD2vF,gBAAiBkB,KAAKE,EAAL,GAAUH,EAAV,GAAejvE,EAAhC,EAAoCkvE,EAApC,EAAwCC,EAAxC,EAA4CC,EAA5C,EAAgDF,KAAKE,EAAL,GAAUpvE,EAAV,GAAeivE,EAA/D,EAAmEC,EAAnE,EAAuE7zE,EAAEhd,CAAzE,EAA4Egd,EAAEpQ,CAA9E,CADJ,EACwF;;AAEvF0nE,SAAM70E,KAAKqR,GAAL,CAAU+/E,KAAK7zE,EAAEpQ,CAAjB,KAAyBgkF,KAAK5zE,EAAEhd,CAAhC,CAAN,CAFuF,CAE5C;;AAE3C,OAAK,CAAEs0E,MAAM0c,MAAN,IAAkB1c,QAAQ0c,MAAR,IAAkBh0E,EAAEhd,CAAF,GAAMqM,EAAErM,CAA9C,KAAuDmwF,cAAenzE,CAAf,EAAkB0zE,IAAlB,CAA5D,EAAuF;;AAEtFrkF,QAAI2Q,CAAJ;AACAg0E,aAAS1c,GAAT;AAEA;AAED;;AAEDt3D,MAAIA,EAAE+0C,IAAN;AAEA;;AAED,QAAO1lD,CAAP;AAEA;;AAED;;AAEA,SAASijF,UAAT,CAAqBn/D,KAArB,EAA4BtG,IAA5B,EAAkCC,IAAlC,EAAwCykE,OAAxC,EAAkD;;AAEjD,KAAIvxE,IAAImT,KAAR;;AAEA,IAAG;;AAEF,MAAKnT,EAAE1I,CAAF,KAAQ,IAAb,EAAoB0I,EAAE1I,CAAF,GAAM07E,OAAQhzE,EAAEhd,CAAV,EAAagd,EAAEpQ,CAAf,EAAkBid,IAAlB,EAAwBC,IAAxB,EAA8BykE,OAA9B,CAAN;AACpBvxE,IAAEkzE,KAAF,GAAUlzE,EAAEmyE,IAAZ;AACAnyE,IAAEizE,KAAF,GAAUjzE,EAAE+0C,IAAZ;AACA/0C,MAAIA,EAAE+0C,IAAN;AAEA,EAPD,QAOU/0C,MAAMmT,KAPhB;;AASAnT,GAAEkzE,KAAF,CAAQD,KAAR,GAAgB,IAAhB;AACAjzE,GAAEkzE,KAAF,GAAU,IAAV;;AAEAe,YAAYj0E,CAAZ;AAEA;;AAED;AACA;;AAEA,SAASi0E,UAAT,CAAqB30B,IAArB,EAA4B;;AAE3B,KAAIn6D,CAAJ;AAAA,KAAO6a,CAAP;AAAA,KAAU/G,CAAV;AAAA,KAAahG,CAAb;AAAA,KAAgBihF,IAAhB;AAAA,KAAsBC,SAAtB;AAAA,KAAiCC,KAAjC;AAAA,KAAwCC,KAAxC;AAAA,KAA+CC,SAAS,CAAxD;;AAEA,IAAG;;AAEFt0E,MAAIs/C,IAAJ;AACAA,SAAO,IAAP;AACA40B,SAAO,IAAP;AACAC,cAAY,CAAZ;;AAEA,SAAQn0E,CAAR,EAAY;;AAEXm0E;AACAl7E,OAAI+G,CAAJ;AACAo0E,WAAQ,CAAR;;AAEA,QAAMjvF,IAAI,CAAV,EAAaA,IAAImvF,MAAjB,EAAyBnvF,GAAzB,EAAgC;;AAE/BivF;AACAn7E,QAAIA,EAAEg6E,KAAN;AACA,QAAK,CAAEh6E,CAAP,EAAW;AAEX;;AAEDo7E,WAAQC,MAAR;;AAEA,UAAQF,QAAQ,CAAR,IAAeC,QAAQ,CAAR,IAAap7E,CAApC,EAA0C;;AAEzC,QAAKm7E,UAAU,CAAV,KAAiBC,UAAU,CAAV,IAAe,CAAEp7E,CAAjB,IAAsB+G,EAAE1I,CAAF,IAAO2B,EAAE3B,CAAhD,CAAL,EAA2D;;AAE1DrE,SAAI+M,CAAJ;AACAA,SAAIA,EAAEizE,KAAN;AACAmB;AAEA,KAND,MAMO;;AAENnhF,SAAIgG,CAAJ;AACAA,SAAIA,EAAEg6E,KAAN;AACAoB;AAEA;;AAED,QAAKH,IAAL,EAAYA,KAAKjB,KAAL,GAAahgF,CAAb,CAAZ,KACKqsD,OAAOrsD,CAAP;;AAELA,MAAEigF,KAAF,GAAUgB,IAAV;AACAA,WAAOjhF,CAAP;AAEA;;AAED+M,OAAI/G,CAAJ;AAEA;;AAEDi7E,OAAKjB,KAAL,GAAa,IAAb;AACAqB,YAAU,CAAV;AAEA,EAtDD,QAsDUH,YAAY,CAtDtB;;AAwDA,QAAO70B,IAAP;AAEA;;AAED;;AAEA,SAAS0zB,MAAT,CAAiBhwF,CAAjB,EAAoB4M,CAApB,EAAuBid,IAAvB,EAA6BC,IAA7B,EAAmCykE,OAAnC,EAA6C;;AAE5C;;AAEAvuF,KAAI,SAAUA,IAAI6pB,IAAd,IAAuB0kE,OAA3B;AACA3hF,KAAI,SAAUA,IAAIkd,IAAd,IAAuBykE,OAA3B;;AAEAvuF,KAAI,CAAEA,IAAMA,KAAK,CAAb,IAAqB,UAAzB;AACAA,KAAI,CAAEA,IAAMA,KAAK,CAAb,IAAqB,UAAzB;AACAA,KAAI,CAAEA,IAAMA,KAAK,CAAb,IAAqB,UAAzB;AACAA,KAAI,CAAEA,IAAMA,KAAK,CAAb,IAAqB,UAAzB;;AAEA4M,KAAI,CAAEA,IAAMA,KAAK,CAAb,IAAqB,UAAzB;AACAA,KAAI,CAAEA,IAAMA,KAAK,CAAb,IAAqB,UAAzB;AACAA,KAAI,CAAEA,IAAMA,KAAK,CAAb,IAAqB,UAAzB;AACAA,KAAI,CAAEA,IAAMA,KAAK,CAAb,IAAqB,UAAzB;;AAEA,QAAO5M,IAAM4M,KAAK,CAAlB;AAEA;;AAED;;AAEA,SAAS2jF,WAAT,CAAsBpgE,KAAtB,EAA8B;;AAE7B,KAAInT,IAAImT,KAAR;AAAA,KAAeohE,WAAWphE,KAA1B;;AAEA,IAAG;;AAEF,MAAKnT,EAAEhd,CAAF,GAAMuxF,SAASvxF,CAApB,EAAwBuxF,WAAWv0E,CAAX;AACxBA,MAAIA,EAAE+0C,IAAN;AAEA,EALD,QAKU/0C,MAAMmT,KALhB;;AAOA,QAAOohE,QAAP;AAEA;;AAED;;AAEA,SAAS5B,eAAT,CAA0BjtE,EAA1B,EAA8BC,EAA9B,EAAkCE,EAAlC,EAAsCC,EAAtC,EAA0C0B,EAA1C,EAA8CC,EAA9C,EAAkD+sE,EAAlD,EAAsDC,EAAtD,EAA2D;;AAE1D,QAAO,CAAEjtE,KAAKgtE,EAAP,KAAgB7uE,KAAK8uE,EAArB,IAA4B,CAAE/uE,KAAK8uE,EAAP,KAAgB/sE,KAAKgtE,EAArB,CAA5B,IAAyD,CAAzD,IACN,CAAE/uE,KAAK8uE,EAAP,KAAgB1uE,KAAK2uE,EAArB,IAA4B,CAAE5uE,KAAK2uE,EAAP,KAAgB7uE,KAAK8uE,EAArB,CAA5B,IAAyD,CADnD,IAEN,CAAE5uE,KAAK2uE,EAAP,KAAgB/sE,KAAKgtE,EAArB,IAA4B,CAAEjtE,KAAKgtE,EAAP,KAAgB1uE,KAAK2uE,EAArB,CAA5B,IAAyD,CAF1D;AAIA;;AAED;;AAEA,SAASrB,eAAT,CAA0B9gF,CAA1B,EAA6BC,CAA7B,EAAiC;;AAEhC,QAAOD,EAAEyiD,IAAF,CAAO5vD,CAAP,KAAaoN,EAAEpN,CAAf,IAAoBmN,EAAE6/E,IAAF,CAAOhtF,CAAP,KAAaoN,EAAEpN,CAAnC,IAAwC,CAAEuvF,kBAAmBpiF,CAAnB,EAAsBC,CAAtB,CAA1C,IACN4gF,cAAe7gF,CAAf,EAAkBC,CAAlB,CADM,IACmB4gF,cAAe5gF,CAAf,EAAkBD,CAAlB,CADnB,IAC4CqiF,aAAcriF,CAAd,EAAiBC,CAAjB,CADnD;AAGA;;AAED;;AAEA,SAAS2/E,IAAT,CAAelyE,CAAf,EAAkB/G,CAAlB,EAAqB8J,CAArB,EAAyB;;AAExB,QAAO,CAAE9J,EAAErJ,CAAF,GAAMoQ,EAAEpQ,CAAV,KAAkBmT,EAAE/f,CAAF,GAAMiW,EAAEjW,CAA1B,IAAgC,CAAEiW,EAAEjW,CAAF,GAAMgd,EAAEhd,CAAV,KAAkB+f,EAAEnT,CAAF,GAAMqJ,EAAErJ,CAA1B,CAAvC;AAEA;;AAED;;AAEA,SAASgF,MAAT,CAAiB0b,EAAjB,EAAqBC,EAArB,EAA0B;;AAEzB,QAAOD,GAAGttB,CAAH,KAASutB,GAAGvtB,CAAZ,IAAiBstB,GAAG1gB,CAAH,KAAS2gB,GAAG3gB,CAApC;AAEA;;AAED;;AAEA,SAASm3C,UAAT,CAAqBz2B,EAArB,EAAyBob,EAAzB,EAA6Bnb,EAA7B,EAAiCqkE,EAAjC,EAAsC;;AAErC,KAAOhgF,OAAQ0b,EAAR,EAAYob,EAAZ,KAAoB92B,OAAQ2b,EAAR,EAAYqkE,EAAZ,CAAtB,IACDhgF,OAAQ0b,EAAR,EAAYskE,EAAZ,KAAoBhgF,OAAQ2b,EAAR,EAAYmb,EAAZ,CADxB,EAC6C,OAAO,IAAP;;AAE7C,QAAOwmD,KAAM5hE,EAAN,EAAUob,EAAV,EAAcnb,EAAd,IAAqB,CAArB,KAA2B2hE,KAAM5hE,EAAN,EAAUob,EAAV,EAAckpD,EAAd,IAAqB,CAAhD,IACH1C,KAAM3hE,EAAN,EAAUqkE,EAAV,EAActkE,EAAd,IAAqB,CAArB,KAA2B4hE,KAAM3hE,EAAN,EAAUqkE,EAAV,EAAclpD,EAAd,IAAqB,CADpD;AAGA;;AAED;;AAEA,SAASgpD,iBAAT,CAA4BpiF,CAA5B,EAA+BC,CAA/B,EAAmC;;AAElC,KAAIyN,IAAI1N,CAAR;;AAEA,IAAG;;AAEF,MAAK0N,EAAE7a,CAAF,KAAQmN,EAAEnN,CAAV,IAAe6a,EAAE+0C,IAAF,CAAO5vD,CAAP,KAAamN,EAAEnN,CAA9B,IAAmC6a,EAAE7a,CAAF,KAAQoN,EAAEpN,CAA7C,IAAkD6a,EAAE+0C,IAAF,CAAO5vD,CAAP,KAAaoN,EAAEpN,CAAjE,IACD4hD,WAAY/mC,CAAZ,EAAeA,EAAE+0C,IAAjB,EAAuBziD,CAAvB,EAA0BC,CAA1B,CADJ,EACoC;;AAEnC,UAAO,IAAP;AAEA;;AAEDyN,MAAIA,EAAE+0C,IAAN;AAEA,EAXD,QAWU/0C,MAAM1N,CAXhB;;AAaA,QAAO,KAAP;AAEA;;AAED;;AAEA,SAAS6gF,aAAT,CAAwB7gF,CAAxB,EAA2BC,CAA3B,EAA+B;;AAE9B,QAAO2/E,KAAM5/E,EAAE6/E,IAAR,EAAc7/E,CAAd,EAAiBA,EAAEyiD,IAAnB,IAA4B,CAA5B,GACNm9B,KAAM5/E,CAAN,EAASC,CAAT,EAAYD,EAAEyiD,IAAd,KAAwB,CAAxB,IAA6Bm9B,KAAM5/E,CAAN,EAASA,EAAE6/E,IAAX,EAAiB5/E,CAAjB,KAAwB,CAD/C,GAEN2/E,KAAM5/E,CAAN,EAASC,CAAT,EAAYD,EAAE6/E,IAAd,IAAuB,CAAvB,IAA4BD,KAAM5/E,CAAN,EAASA,EAAEyiD,IAAX,EAAiBxiD,CAAjB,IAAuB,CAFpD;AAIA;;AAED;;AAEA,SAASoiF,YAAT,CAAuBriF,CAAvB,EAA0BC,CAA1B,EAA8B;;AAE7B,KAAIyN,IAAI1N,CAAR;AAAA,KACCuiF,SAAS,KADV;AAAA,KAECL,KAAK,CAAEliF,EAAEtP,CAAF,GAAMuP,EAAEvP,CAAV,IAAgB,CAFtB;AAAA,KAGCyxF,KAAK,CAAEniF,EAAE1C,CAAF,GAAM2C,EAAE3C,CAAV,IAAgB,CAHtB;;AAKA,IAAG;;AAEF,MAASoQ,EAAEpQ,CAAF,GAAM6kF,EAAR,KAAmBz0E,EAAE+0C,IAAF,CAAOnlD,CAAP,GAAW6kF,EAAhC,IAA0Cz0E,EAAE+0C,IAAF,CAAOnlD,CAAP,KAAaoQ,EAAEpQ,CAAzD,IACC4kF,KAAK,CAAEx0E,EAAE+0C,IAAF,CAAO/xD,CAAP,GAAWgd,EAAEhd,CAAf,KAAuByxF,KAAKz0E,EAAEpQ,CAA9B,KAAsCoQ,EAAE+0C,IAAF,CAAOnlD,CAAP,GAAWoQ,EAAEpQ,CAAnD,IAAyDoQ,EAAEhd,CADtE,EAC4E;;AAE3E6xF,YAAS,CAAEA,MAAX;AAEA;;AAED70E,MAAIA,EAAE+0C,IAAN;AAEA,EAXD,QAWU/0C,MAAM1N,CAXhB;;AAaA,QAAOuiF,MAAP;AAEA;;AAED;AACA;;AAEA,SAASxB,YAAT,CAAuB/gF,CAAvB,EAA0BC,CAA1B,EAA8B;;AAE7B,KAAI/C,KAAK,IAAIslF,IAAJ,CAAUxiF,EAAEnN,CAAZ,EAAemN,EAAEtP,CAAjB,EAAoBsP,EAAE1C,CAAtB,CAAT;AAAA,KACCF,KAAK,IAAIolF,IAAJ,CAAUviF,EAAEpN,CAAZ,EAAeoN,EAAEvP,CAAjB,EAAoBuP,EAAE3C,CAAtB,CADN;AAAA,KAECmlF,KAAKziF,EAAEyiD,IAFR;AAAA,KAGCigC,KAAKziF,EAAE4/E,IAHR;;AAKA7/E,GAAEyiD,IAAF,GAASxiD,CAAT;AACAA,GAAE4/E,IAAF,GAAS7/E,CAAT;;AAEA9C,IAAGulD,IAAH,GAAUggC,EAAV;AACAA,IAAG5C,IAAH,GAAU3iF,EAAV;;AAEAE,IAAGqlD,IAAH,GAAUvlD,EAAV;AACAA,IAAG2iF,IAAH,GAAUziF,EAAV;;AAEAslF,IAAGjgC,IAAH,GAAUrlD,EAAV;AACAA,IAAGyiF,IAAH,GAAU6C,EAAV;;AAEA,QAAOtlF,EAAP;AAEA;;AAED;;AAEA,SAASmiF,UAAT,CAAqB1sF,CAArB,EAAwBnC,CAAxB,EAA2B4M,CAA3B,EAA8B+hF,IAA9B,EAAqC;;AAEpC,KAAI3xE,IAAI,IAAI80E,IAAJ,CAAU3vF,CAAV,EAAanC,CAAb,EAAgB4M,CAAhB,CAAR;;AAEA,KAAK,CAAE+hF,IAAP,EAAc;;AAEb3xE,IAAEmyE,IAAF,GAASnyE,CAAT;AACAA,IAAE+0C,IAAF,GAAS/0C,CAAT;AAEA,EALD,MAKO;;AAENA,IAAE+0C,IAAF,GAAS48B,KAAK58B,IAAd;AACA/0C,IAAEmyE,IAAF,GAASR,IAAT;AACAA,OAAK58B,IAAL,CAAUo9B,IAAV,GAAiBnyE,CAAjB;AACA2xE,OAAK58B,IAAL,GAAY/0C,CAAZ;AAEA;;AAED,QAAOA,CAAP;AAEA;;AAED,SAAS8xE,UAAT,CAAqB9xE,CAArB,EAAyB;;AAExBA,GAAE+0C,IAAF,CAAOo9B,IAAP,GAAcnyE,EAAEmyE,IAAhB;AACAnyE,GAAEmyE,IAAF,CAAOp9B,IAAP,GAAc/0C,EAAE+0C,IAAhB;;AAEA,KAAK/0C,EAAEkzE,KAAP,EAAelzE,EAAEkzE,KAAF,CAAQD,KAAR,GAAgBjzE,EAAEizE,KAAlB;AACf,KAAKjzE,EAAEizE,KAAP,EAAejzE,EAAEizE,KAAF,CAAQC,KAAR,GAAgBlzE,EAAEkzE,KAAlB;AAEf;;AAED,SAAS4B,IAAT,CAAe3vF,CAAf,EAAkBnC,CAAlB,EAAqB4M,CAArB,EAAyB;;AAExB;AACA,MAAKzK,CAAL,GAASA,CAAT;;AAEA;AACA,MAAKnC,CAAL,GAASA,CAAT;AACA,MAAK4M,CAAL,GAASA,CAAT;;AAEA;AACA,MAAKuiF,IAAL,GAAY,IAAZ;AACA,MAAKp9B,IAAL,GAAY,IAAZ;;AAEA;AACA,MAAKz9C,CAAL,GAAS,IAAT;;AAEA;AACA,MAAK47E,KAAL,GAAa,IAAb;AACA,MAAKD,KAAL,GAAa,IAAb;;AAEA;AACA,MAAKhB,OAAL,GAAe,KAAf;AAEA;;AAED,SAASL,UAAT,CAAqBrlE,IAArB,EAA2B4G,KAA3B,EAAkCI,GAAlC,EAAuC29D,GAAvC,EAA6C;;AAE5C,KAAI+D,MAAM,CAAV;;AAEA,MAAM,IAAI9vF,IAAIguB,KAAR,EAAe/C,IAAImD,MAAM29D,GAA/B,EAAoC/rF,IAAIouB,GAAxC,EAA6CpuB,KAAK+rF,GAAlD,EAAwD;;AAEvD+D,SAAO,CAAE1oE,KAAM6D,CAAN,IAAY7D,KAAMpnB,CAAN,CAAd,KAA8BonB,KAAMpnB,IAAI,CAAV,IAAgBonB,KAAM6D,IAAI,CAAV,CAA9C,CAAP;AACAA,MAAIjrB,CAAJ;AAEA;;AAED,QAAO8vF,GAAP;AAEA;;AAED;;;;AAIA,IAAIC,aAAa;;AAEhB;;AAEAhD,OAAM,UAAWiD,OAAX,EAAqB;;AAE1B,MAAI/lF,IAAI+lF,QAAQrxF,MAAhB;AACA,MAAIwO,IAAI,GAAR;;AAEA,OAAM,IAAI0N,IAAI5Q,IAAI,CAAZ,EAAe6J,IAAI,CAAzB,EAA4BA,IAAI7J,CAAhC,EAAmC4Q,IAAI/G,GAAvC,EAA8C;;AAE7C3G,QAAK6iF,QAASn1E,CAAT,EAAahd,CAAb,GAAiBmyF,QAASl8E,CAAT,EAAarJ,CAA9B,GAAkCulF,QAASl8E,CAAT,EAAajW,CAAb,GAAiBmyF,QAASn1E,CAAT,EAAapQ,CAArE;AAEA;;AAED,SAAO0C,IAAI,GAAX;AAEA,EAjBe;;AAmBhB8iF,cAAa,UAAWC,GAAX,EAAiB;;AAE7B,SAAOH,WAAWhD,IAAX,CAAiBmD,GAAjB,IAAyB,CAAhC;AAEA,EAvBe;;AAyBhBC,mBAAkB,UAAWH,OAAX,EAAoBI,KAApB,EAA4B;;AAE7C,MAAI5mE,WAAW,EAAf,CAF6C,CAE1B;AACnB,MAAIsiE,cAAc,EAAlB,CAH6C,CAGvB;AACtB,MAAInhD,QAAQ,EAAZ,CAJ6C,CAI7B;;AAEhB0lD,kBAAiBL,OAAjB;AACAM,aAAY9mE,QAAZ,EAAsBwmE,OAAtB;;AAEA;;AAEA,MAAIO,YAAYP,QAAQrxF,MAAxB;;AAEAyxF,QAAMI,OAAN,CAAeH,eAAf;;AAEA,OAAM,IAAIrwF,IAAI,CAAd,EAAiBA,IAAIowF,MAAMzxF,MAA3B,EAAmCqB,GAAnC,EAA0C;;AAEzC8rF,eAAYvsF,IAAZ,CAAkBgxF,SAAlB;AACAA,gBAAaH,MAAOpwF,CAAP,EAAWrB,MAAxB;AACA2xF,cAAY9mE,QAAZ,EAAsB4mE,MAAOpwF,CAAP,CAAtB;AAEA;;AAED;;AAEA,MAAIspD,YAAYsiC,OAAOC,WAAP,CAAoBriE,QAApB,EAA8BsiE,WAA9B,CAAhB;;AAEA;;AAEA,OAAM,IAAI9rF,IAAI,CAAd,EAAiBA,IAAIspD,UAAU3qD,MAA/B,EAAuCqB,KAAK,CAA5C,EAAgD;;AAE/C2qC,SAAMprC,IAAN,CAAY+pD,UAAUvpD,KAAV,CAAiBC,CAAjB,EAAoBA,IAAI,CAAxB,CAAZ;AAEA;;AAED,SAAO2qC,KAAP;AAEA;;AA9De,CAAjB;;AAkEA,SAAS0lD,eAAT,CAA0BnoE,MAA1B,EAAmC;;AAElC,KAAIjoB,IAAIioB,OAAOvpB,MAAf;;AAEA,KAAKsB,IAAI,CAAJ,IAASioB,OAAQjoB,IAAI,CAAZ,EAAgBwP,MAAhB,CAAwByY,OAAQ,CAAR,CAAxB,CAAd,EAAsD;;AAErDA,SAAOsxC,GAAP;AAEA;AAED;;AAED,SAAS82B,UAAT,CAAqB9mE,QAArB,EAA+BwmE,OAA/B,EAAyC;;AAExC,MAAM,IAAIhwF,IAAI,CAAd,EAAiBA,IAAIgwF,QAAQrxF,MAA7B,EAAqCqB,GAArC,EAA4C;;AAE3CwpB,WAASjqB,IAAT,CAAeywF,QAAShwF,CAAT,EAAanC,CAA5B;AACA2rB,WAASjqB,IAAT,CAAeywF,QAAShwF,CAAT,EAAayK,CAA5B;AAEA;AAED;;AAED;;;;;;;;;;;;;;;;;;;;;;;AAuBA;;AAEA,SAASgmF,eAAT,CAA0BvoD,MAA1B,EAAkC7hB,OAAlC,EAA4C;;AAE3CokB,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,iBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBN,UAAQA,MADS;AAEjB7hB,WAASA;AAFQ,EAAlB;;AAKA,MAAK0lB,kBAAL,CAAyB,IAAI2kD,qBAAJ,CAA2BxoD,MAA3B,EAAmC7hB,OAAnC,CAAzB;AACA,MAAK2oB,aAAL;AAEA;;AAEDyhD,gBAAgB1yF,SAAhB,GAA4BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA5B;AACA0yF,gBAAgB1yF,SAAhB,CAA0B0O,WAA1B,GAAwCgkF,eAAxC;;AAEAA,gBAAgB1yF,SAAhB,CAA0BomB,MAA1B,GAAmC,YAAY;;AAE9C,KAAIiD,OAAOqjB,SAAS1sC,SAAT,CAAmBomB,MAAnB,CAA0BplB,IAA1B,CAAgC,IAAhC,CAAX;;AAEA,KAAImpC,SAAS,KAAKM,UAAL,CAAgBN,MAA7B;AACA,KAAI7hB,UAAU,KAAKmiB,UAAL,CAAgBniB,OAA9B;;AAEA,QAAOlC,OAAQ+jB,MAAR,EAAgB7hB,OAAhB,EAAyBe,IAAzB,CAAP;AAEA,CATD;;AAWA;;AAEA,SAASspE,qBAAT,CAAgCxoD,MAAhC,EAAwC7hB,OAAxC,EAAkD;;AAEjD0tB,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,uBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBN,UAAQA,MADS;AAEjB7hB,WAASA;AAFQ,EAAlB;;AAKA6hB,UAAS/P,MAAMC,OAAN,CAAe8P,MAAf,IAA0BA,MAA1B,GAAmC,CAAEA,MAAF,CAA5C;;AAEA,KAAI/e,QAAQ,IAAZ;;AAEA,KAAIwnE,gBAAgB,EAApB;AACA,KAAInU,UAAU,EAAd;;AAEA,MAAM,IAAIx8E,IAAI,CAAR,EAAWC,IAAIioC,OAAOvpC,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,MAAIyoC,QAAQP,OAAQloC,CAAR,CAAZ;AACA4wF,WAAUnoD,KAAV;AAEA;;AAED;;AAEA,MAAK2L,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4B29C,aAA5B,EAA2C,CAA3C,CAA/B;AACA,MAAKv8C,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4BwpC,OAA5B,EAAqC,CAArC,CAAzB;;AAEA,MAAKrvC,oBAAL;;AAEA;;AAEA,UAASyjD,QAAT,CAAmBnoD,KAAnB,EAA2B;;AAE1B,MAAIooD,cAAc,EAAlB;;AAEA;;AAEA,MAAIC,gBAAgBzqE,QAAQyqE,aAAR,KAA0BzzF,SAA1B,GAAsCgpB,QAAQyqE,aAA9C,GAA8D,EAAlF;AACA,MAAIC,QAAQ1qE,QAAQ0qE,KAAR,KAAkB1zF,SAAlB,GAA8BgpB,QAAQ0qE,KAAtC,GAA8C,CAA1D;AACA,MAAInxD,QAAQvZ,QAAQuZ,KAAR,KAAkBviC,SAAlB,GAA8BgpB,QAAQuZ,KAAtC,GAA8C,GAA1D;;AAEA,MAAIoxD,eAAe3qE,QAAQ2qE,YAAR,KAAyB3zF,SAAzB,GAAqCgpB,QAAQ2qE,YAA7C,GAA4D,IAA/E;AACA,MAAIC,iBAAiB5qE,QAAQ4qE,cAAR,KAA2B5zF,SAA3B,GAAuCgpB,QAAQ4qE,cAA/C,GAAgE,CAArF;AACA,MAAIC,YAAY7qE,QAAQ6qE,SAAR,KAAsB7zF,SAAtB,GAAkCgpB,QAAQ6qE,SAA1C,GAAsDD,iBAAiB,CAAvF;AACA,MAAIE,gBAAgB9qE,QAAQ8qE,aAAR,KAA0B9zF,SAA1B,GAAsCgpB,QAAQ8qE,aAA9C,GAA8D,CAAlF;;AAEA,MAAIC,cAAc/qE,QAAQ+qE,WAA1B;;AAEA,MAAIC,QAAQhrE,QAAQirE,WAAR,KAAwBj0F,SAAxB,GAAoCgpB,QAAQirE,WAA5C,GAA0DC,gBAAtE;;AAEA;;AAEA,MAAKlrE,QAAQmrE,MAAR,KAAmBn0F,SAAxB,EAAoC;;AAEnCyP,WAAQC,IAAR,CAAc,gEAAd;AACA6yB,WAAQvZ,QAAQmrE,MAAhB;AAEA;;AAED;;AAEA,MAAIC,UAAJ;AAAA,MAAgBC,gBAAgB,KAAhC;AACA,MAAIC,UAAJ,EAAgBC,QAAhB,EAA0B3wE,MAA1B,EAAkC4wE,SAAlC;;AAEA,MAAKT,WAAL,EAAmB;;AAElBK,gBAAaL,YAAYU,eAAZ,CAA6Bf,KAA7B,CAAb;;AAEAW,mBAAgB,IAAhB;AACAV,kBAAe,KAAf,CALkB,CAKI;;AAEtB;;AAEA;;AAEAW,gBAAaP,YAAY/G,mBAAZ,CAAiC0G,KAAjC,EAAwC,KAAxC,CAAb;;AAEA;;AAEAa,cAAW,IAAIv/E,OAAJ,EAAX;AACA4O,YAAS,IAAI5O,OAAJ,EAAT;AACAw/E,eAAY,IAAIx/E,OAAJ,EAAZ;AAEA;;AAED;;AAEA,MAAK,CAAE2+E,YAAP,EAAsB;;AAErBG,mBAAgB,CAAhB;AACAF,oBAAiB,CAAjB;AACAC,eAAY,CAAZ;AAEA;;AAED;;AAEA,MAAIa,KAAJ,EAAWn3E,CAAX,EAAco3E,EAAd,CAlE0B,CAkER;;AAElB,MAAIC,cAAcxpD,MAAMypD,aAAN,CAAqBpB,aAArB,CAAlB;;AAEA,MAAItnE,WAAWyoE,YAAYxpD,KAA3B;AACA,MAAI2nD,QAAQ6B,YAAY7B,KAAxB;;AAEA,MAAI+B,UAAU,CAAEpC,WAAWE,WAAX,CAAwBzmE,QAAxB,CAAhB;;AAEA,MAAK2oE,OAAL,EAAe;;AAEd3oE,cAAWA,SAAS2oE,OAAT,EAAX;;AAEA;;AAEA,QAAMv3E,IAAI,CAAJ,EAAOo3E,KAAK5B,MAAMzxF,MAAxB,EAAgCic,IAAIo3E,EAApC,EAAwCp3E,GAAxC,EAA+C;;AAE9Cm3E,YAAQ3B,MAAOx1E,CAAP,CAAR;;AAEA,QAAKm1E,WAAWE,WAAX,CAAwB8B,KAAxB,CAAL,EAAuC;;AAEtC3B,WAAOx1E,CAAP,IAAam3E,MAAMI,OAAN,EAAb;AAEA;AAED;AAED;;AAGD,MAAIxnD,QAAQolD,WAAWI,gBAAX,CAA6B3mE,QAA7B,EAAuC4mE,KAAvC,CAAZ;;AAEA;;AAEA,MAAIJ,UAAUxmE,QAAd,CApG0B,CAoGF;;AAExB,OAAM5O,IAAI,CAAJ,EAAOo3E,KAAK5B,MAAMzxF,MAAxB,EAAgCic,IAAIo3E,EAApC,EAAwCp3E,GAAxC,EAA+C;;AAE9Cm3E,WAAQ3B,MAAOx1E,CAAP,CAAR;;AAEA4O,cAAWA,SAAS4oE,MAAT,CAAiBL,KAAjB,CAAX;AAEA;;AAGD,WAASM,QAAT,CAAmBC,EAAnB,EAAuBvN,GAAvB,EAA4Bx8D,IAA5B,EAAmC;;AAElC,OAAK,CAAEw8D,GAAP,EAAaj4E,QAAQyD,KAAR,CAAe,2CAAf;;AAEb,UAAOw0E,IAAIv4E,KAAJ,GAAYkB,cAAZ,CAA4B6a,IAA5B,EAAmC3b,GAAnC,CAAwC0lF,EAAxC,CAAP;AAEA;;AAED,MAAIllF,CAAJ;AAAA,MAAOmlF,EAAP;AAAA,MAAW7nF,CAAX;AAAA,MAAcyH,CAAd;AAAA,MACCqgF,IADD;AAAA,MACOC,OAAOjpE,SAAS7qB,MADvB;AAAA,MAECgtC,IAFD;AAAA,MAEO+mD,OAAO/nD,MAAMhsC,MAFpB;;AAKA;;;AAGA,WAASg0F,WAAT,CAAsBC,IAAtB,EAA4BC,MAA5B,EAAoCC,MAApC,EAA6C;;AAE5C;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAIC,SAAJ,EAAeC,SAAf,EAA0BC,SAA1B,CAT4C,CASP;;AAErC;AACA;;AAEA,OAAIC,WAAWN,KAAK/0F,CAAL,GAASg1F,OAAOh1F,CAA/B;AAAA,OACCs1F,WAAWP,KAAKnoF,CAAL,GAASooF,OAAOpoF,CAD5B;AAEA,OAAI2oF,WAAWN,OAAOj1F,CAAP,GAAW+0F,KAAK/0F,CAA/B;AAAA,OACCw1F,WAAWP,OAAOroF,CAAP,GAAWmoF,KAAKnoF,CAD5B;;AAGA,OAAI6oF,eAAiBJ,WAAWA,QAAX,GAAsBC,WAAWA,QAAtD;;AAEA;AACA,OAAII,aAAeL,WAAWG,QAAX,GAAsBF,WAAWC,QAApD;;AAEA,OAAK91F,KAAKqR,GAAL,CAAU4kF,UAAV,IAAyBp2F,OAAOC,OAArC,EAA+C;;AAE9C;;AAEA;;AAEA,QAAIo2F,aAAal2F,KAAKmR,IAAL,CAAW6kF,YAAX,CAAjB;AACA,QAAIG,aAAan2F,KAAKmR,IAAL,CAAW2kF,WAAWA,QAAX,GAAsBC,WAAWA,QAA5C,CAAjB;;AAEA;;AAEA,QAAIK,gBAAkBb,OAAOh1F,CAAP,GAAWs1F,WAAWK,UAA5C;AACA,QAAIG,gBAAkBd,OAAOpoF,CAAP,GAAWyoF,WAAWM,UAA5C;;AAEA,QAAII,gBAAkBd,OAAOj1F,CAAP,GAAWw1F,WAAWI,UAA5C;AACA,QAAII,gBAAkBf,OAAOroF,CAAP,GAAW2oF,WAAWK,UAA5C;;AAEA;;AAEA,QAAIK,KAAK,CAAE,CAAEF,gBAAgBF,aAAlB,IAAoCL,QAApC,GACT,CAAEQ,gBAAgBF,aAAlB,IAAoCP,QAD7B,KAENF,WAAWG,QAAX,GAAsBF,WAAWC,QAF3B,CAAT;;AAIA;;AAEAL,gBAAcW,gBAAgBR,WAAWY,EAA3B,GAAgClB,KAAK/0F,CAAnD;AACAm1F,gBAAcW,gBAAgBR,WAAWW,EAA3B,GAAgClB,KAAKnoF,CAAnD;;AAEA;AACA;AACA,QAAIspF,gBAAkBhB,YAAYA,SAAZ,GAAwBC,YAAYA,SAA1D;AACA,QAAKe,iBAAiB,CAAtB,EAA0B;;AAEzB,YAAO,IAAIloF,OAAJ,CAAaknF,SAAb,EAAwBC,SAAxB,CAAP;AAEA,KAJD,MAIO;;AAENC,iBAAY31F,KAAKmR,IAAL,CAAWslF,gBAAgB,CAA3B,CAAZ;AAEA;AAED,IAzCD,MAyCO;;AAEN;;AAEA,QAAIC,eAAe,KAAnB,CAJM,CAIoB;AAC1B,QAAKd,WAAW/1F,OAAOC,OAAvB,EAAiC;;AAEhC,SAAKg2F,WAAWj2F,OAAOC,OAAvB,EAAiC;;AAEhC42F,qBAAe,IAAf;AAEA;AAED,KARD,MAQO;;AAEN,SAAKd,WAAW,CAAE/1F,OAAOC,OAAzB,EAAmC;;AAElC,UAAKg2F,WAAW,CAAEj2F,OAAOC,OAAzB,EAAmC;;AAElC42F,sBAAe,IAAf;AAEA;AAED,MARD,MAQO;;AAEN,UAAK12F,KAAKM,IAAL,CAAWu1F,QAAX,MAA0B71F,KAAKM,IAAL,CAAWy1F,QAAX,CAA/B,EAAuD;;AAEtDW,sBAAe,IAAf;AAEA;AAED;AAED;;AAED,QAAKA,YAAL,EAAoB;;AAEnB;AACAjB,iBAAY,CAAEI,QAAd;AACAH,iBAAYE,QAAZ;AACAD,iBAAY31F,KAAKmR,IAAL,CAAW6kF,YAAX,CAAZ;AAEA,KAPD,MAOO;;AAEN;AACAP,iBAAYG,QAAZ;AACAF,iBAAYG,QAAZ;AACAF,iBAAY31F,KAAKmR,IAAL,CAAW6kF,eAAe,CAA1B,CAAZ;AAEA;AAED;;AAED,UAAO,IAAIznF,OAAJ,CAAaknF,YAAYE,SAAzB,EAAoCD,YAAYC,SAAhD,CAAP;AAEA;;AAGD,MAAIgB,mBAAmB,EAAvB;;AAEA,OAAM,IAAIj0F,IAAI,CAAR,EAAWooB,KAAK4nE,QAAQrxF,MAAxB,EAAgCssB,IAAI7C,KAAK,CAAzC,EAA4C2oB,IAAI/wC,IAAI,CAA1D,EAA6DA,IAAIooB,EAAjE,EAAqEpoB,KAAMirB,GAAN,EAAY8lB,GAAjF,EAAwF;;AAEvF,OAAK9lB,MAAM7C,EAAX,EAAgB6C,IAAI,CAAJ;AAChB,OAAK8lB,MAAM3oB,EAAX,EAAgB2oB,IAAI,CAAJ;;AAEhB;AACA;;AAEAkjD,oBAAkBj0F,CAAlB,IAAwB2yF,YAAa3C,QAAShwF,CAAT,CAAb,EAA2BgwF,QAAS/kE,CAAT,CAA3B,EAAyC+kE,QAASj/C,CAAT,CAAzC,CAAxB;AAEA;;AAED,MAAImjD,iBAAiB,EAArB;AAAA,MACCC,gBADD;AAAA,MACmBC,oBAAoBH,iBAAiB7B,MAAjB,EADvC;;AAGA,OAAMx3E,IAAI,CAAJ,EAAOo3E,KAAK5B,MAAMzxF,MAAxB,EAAgCic,IAAIo3E,EAApC,EAAwCp3E,GAAxC,EAA+C;;AAE9Cm3E,WAAQ3B,MAAOx1E,CAAP,CAAR;;AAEAu5E,sBAAmB,EAAnB;;AAEA,QAAMn0F,IAAI,CAAJ,EAAOooB,KAAK2pE,MAAMpzF,MAAlB,EAA0BssB,IAAI7C,KAAK,CAAnC,EAAsC2oB,IAAI/wC,IAAI,CAApD,EAAuDA,IAAIooB,EAA3D,EAA+DpoB,KAAMirB,GAAN,EAAY8lB,GAA3E,EAAkF;;AAEjF,QAAK9lB,MAAM7C,EAAX,EAAgB6C,IAAI,CAAJ;AAChB,QAAK8lB,MAAM3oB,EAAX,EAAgB2oB,IAAI,CAAJ;;AAEhB;AACAojD,qBAAkBn0F,CAAlB,IAAwB2yF,YAAaZ,MAAO/xF,CAAP,CAAb,EAAyB+xF,MAAO9mE,CAAP,CAAzB,EAAqC8mE,MAAOhhD,CAAP,CAArC,CAAxB;AAEA;;AAEDmjD,kBAAe30F,IAAf,CAAqB40F,gBAArB;AACAC,uBAAoBA,kBAAkBhC,MAAlB,CAA0B+B,gBAA1B,CAApB;AAEA;;AAGD;;AAEA,OAAM/mF,IAAI,CAAV,EAAaA,IAAI+jF,aAAjB,EAAgC/jF,GAAhC,EAAuC;;AAEtC;;AAEA1C,OAAI0C,IAAI+jF,aAAR;AACAh/E,OAAI8+E,iBAAiB3zF,KAAK8S,GAAL,CAAU1F,IAAIpN,KAAK4L,EAAT,GAAc,CAAxB,CAArB;AACAqpF,QAAKrB,YAAY5zF,KAAK+S,GAAL,CAAU3F,IAAIpN,KAAK4L,EAAT,GAAc,CAAxB,CAAjB;;AAEA;;AAEA,QAAMlJ,IAAI,CAAJ,EAAOooB,KAAK4nE,QAAQrxF,MAA1B,EAAkCqB,IAAIooB,EAAtC,EAA0CpoB,GAA1C,EAAiD;;AAEhDwyF,WAAOH,SAAUrC,QAAShwF,CAAT,CAAV,EAAwBi0F,iBAAkBj0F,CAAlB,CAAxB,EAA+CuyF,EAA/C,CAAP;;AAEA5lF,MAAG6lF,KAAK30F,CAAR,EAAW20F,KAAK/nF,CAAhB,EAAmB,CAAE0H,CAArB;AAEA;;AAED;;AAEA,QAAMyI,IAAI,CAAJ,EAAOo3E,KAAK5B,MAAMzxF,MAAxB,EAAgCic,IAAIo3E,EAApC,EAAwCp3E,GAAxC,EAA+C;;AAE9Cm3E,YAAQ3B,MAAOx1E,CAAP,CAAR;AACAu5E,uBAAmBD,eAAgBt5E,CAAhB,CAAnB;;AAEA,SAAM5a,IAAI,CAAJ,EAAOooB,KAAK2pE,MAAMpzF,MAAxB,EAAgCqB,IAAIooB,EAApC,EAAwCpoB,GAAxC,EAA+C;;AAE9CwyF,YAAOH,SAAUN,MAAO/xF,CAAP,CAAV,EAAsBm0F,iBAAkBn0F,CAAlB,CAAtB,EAA6CuyF,EAA7C,CAAP;;AAEA5lF,OAAG6lF,KAAK30F,CAAR,EAAW20F,KAAK/nF,CAAhB,EAAmB,CAAE0H,CAArB;AAEA;AAED;AAED;;AAEDogF,OAAKrB,SAAL;;AAEA;;AAEA,OAAMlxF,IAAI,CAAV,EAAaA,IAAIyyF,IAAjB,EAAuBzyF,GAAvB,EAA8B;;AAE7BwyF,UAAOxB,eAAeqB,SAAU7oE,SAAUxpB,CAAV,CAAV,EAAyBo0F,kBAAmBp0F,CAAnB,CAAzB,EAAiDuyF,EAAjD,CAAf,GAAuE/oE,SAAUxpB,CAAV,CAA9E;;AAEA,OAAK,CAAE0xF,aAAP,EAAuB;;AAEtB/kF,MAAG6lF,KAAK30F,CAAR,EAAW20F,KAAK/nF,CAAhB,EAAmB,CAAnB;AAEA,IAJD,MAIO;;AAEN;;AAEAwW,WAAOvU,IAAP,CAAailF,WAAWzlD,OAAX,CAAoB,CAApB,CAAb,EAAuCx+B,cAAvC,CAAuD8kF,KAAK30F,CAA5D;AACA+zF,aAASllF,IAAT,CAAeilF,WAAWxH,SAAX,CAAsB,CAAtB,CAAf,EAA2Cz8E,cAA3C,CAA2D8kF,KAAK/nF,CAAhE;;AAEAonF,cAAUnlF,IAAV,CAAgB+kF,WAAY,CAAZ,CAAhB,EAAkC7kF,GAAlC,CAAuCqU,MAAvC,EAAgDrU,GAAhD,CAAqDglF,QAArD;;AAEAjlF,MAAGklF,UAAUh0F,CAAb,EAAgBg0F,UAAUpnF,CAA1B,EAA6BonF,UAAU1/E,CAAvC;AAEA;AAED;;AAED;AACA;;AAEA,MAAIjF,CAAJ;;AAEA,OAAMA,IAAI,CAAV,EAAaA,KAAK6jF,KAAlB,EAAyB7jF,GAAzB,EAAgC;;AAE/B,QAAMlN,IAAI,CAAV,EAAaA,IAAIyyF,IAAjB,EAAuBzyF,GAAvB,EAA8B;;AAE7BwyF,WAAOxB,eAAeqB,SAAU7oE,SAAUxpB,CAAV,CAAV,EAAyBo0F,kBAAmBp0F,CAAnB,CAAzB,EAAiDuyF,EAAjD,CAAf,GAAuE/oE,SAAUxpB,CAAV,CAA9E;;AAEA,QAAK,CAAE0xF,aAAP,EAAuB;;AAEtB/kF,OAAG6lF,KAAK30F,CAAR,EAAW20F,KAAK/nF,CAAhB,EAAmBm1B,QAAQmxD,KAAR,GAAgB7jF,CAAnC;AAEA,KAJD,MAIO;;AAEN;;AAEA+T,YAAOvU,IAAP,CAAailF,WAAWzlD,OAAX,CAAoBh/B,CAApB,CAAb,EAAuCQ,cAAvC,CAAuD8kF,KAAK30F,CAA5D;AACA+zF,cAASllF,IAAT,CAAeilF,WAAWxH,SAAX,CAAsBj9E,CAAtB,CAAf,EAA2CQ,cAA3C,CAA2D8kF,KAAK/nF,CAAhE;;AAEAonF,eAAUnlF,IAAV,CAAgB+kF,WAAYvkF,CAAZ,CAAhB,EAAkCN,GAAlC,CAAuCqU,MAAvC,EAAgDrU,GAAhD,CAAqDglF,QAArD;;AAEAjlF,OAAGklF,UAAUh0F,CAAb,EAAgBg0F,UAAUpnF,CAA1B,EAA6BonF,UAAU1/E,CAAvC;AAEA;AAED;AAED;;AAGD;;AAEA;AACA,OAAM/E,IAAI+jF,gBAAgB,CAA1B,EAA6B/jF,KAAK,CAAlC,EAAqCA,GAArC,EAA4C;;AAE3C1C,OAAI0C,IAAI+jF,aAAR;AACAh/E,OAAI8+E,iBAAiB3zF,KAAK8S,GAAL,CAAU1F,IAAIpN,KAAK4L,EAAT,GAAc,CAAxB,CAArB;AACAqpF,QAAKrB,YAAY5zF,KAAK+S,GAAL,CAAU3F,IAAIpN,KAAK4L,EAAT,GAAc,CAAxB,CAAjB;;AAEA;;AAEA,QAAMlJ,IAAI,CAAJ,EAAOooB,KAAK4nE,QAAQrxF,MAA1B,EAAkCqB,IAAIooB,EAAtC,EAA0CpoB,GAA1C,EAAiD;;AAEhDwyF,WAAOH,SAAUrC,QAAShwF,CAAT,CAAV,EAAwBi0F,iBAAkBj0F,CAAlB,CAAxB,EAA+CuyF,EAA/C,CAAP;AACA5lF,MAAG6lF,KAAK30F,CAAR,EAAW20F,KAAK/nF,CAAhB,EAAmBm1B,QAAQztB,CAA3B;AAEA;;AAED;;AAEA,QAAMyI,IAAI,CAAJ,EAAOo3E,KAAK5B,MAAMzxF,MAAxB,EAAgCic,IAAIo3E,EAApC,EAAwCp3E,GAAxC,EAA+C;;AAE9Cm3E,YAAQ3B,MAAOx1E,CAAP,CAAR;AACAu5E,uBAAmBD,eAAgBt5E,CAAhB,CAAnB;;AAEA,SAAM5a,IAAI,CAAJ,EAAOooB,KAAK2pE,MAAMpzF,MAAxB,EAAgCqB,IAAIooB,EAApC,EAAwCpoB,GAAxC,EAA+C;;AAE9CwyF,YAAOH,SAAUN,MAAO/xF,CAAP,CAAV,EAAsBm0F,iBAAkBn0F,CAAlB,CAAtB,EAA6CuyF,EAA7C,CAAP;;AAEA,SAAK,CAAEb,aAAP,EAAuB;;AAEtB/kF,QAAG6lF,KAAK30F,CAAR,EAAW20F,KAAK/nF,CAAhB,EAAmBm1B,QAAQztB,CAA3B;AAEA,MAJD,MAIO;;AAENxF,QAAG6lF,KAAK30F,CAAR,EAAW20F,KAAK/nF,CAAL,GAASgnF,WAAYV,QAAQ,CAApB,EAAwBtmF,CAA5C,EAA+CgnF,WAAYV,QAAQ,CAApB,EAAwBlzF,CAAxB,GAA4BsU,CAA3E;AAEA;AAED;AAED;AAED;;AAED;;AAEA;;AAEAkiF;;AAEA;;AAEAC;;AAGA;;AAEA,WAASD,aAAT,GAAyB;;AAExB,OAAIrmE,QAAQ2iE,cAAchyF,MAAd,GAAuB,CAAnC;;AAEA,OAAKqyF,YAAL,EAAoB;;AAEnB,QAAI3b,QAAQ,CAAZ,CAFmB,CAEJ;AACf,QAAI1lE,SAAS8iF,OAAOpd,KAApB;;AAEA;;AAEA,SAAMr1E,IAAI,CAAV,EAAaA,IAAI0yF,IAAjB,EAAuB1yF,GAAvB,EAA8B;;AAE7B2rC,YAAOhB,MAAO3qC,CAAP,CAAP;AACAu0F,QAAI5oD,KAAM,CAAN,IAAYh8B,MAAhB,EAAwBg8B,KAAM,CAAN,IAAYh8B,MAApC,EAA4Cg8B,KAAM,CAAN,IAAYh8B,MAAxD;AAEA;;AAED0lE,YAAQ0b,QAAQI,gBAAgB,CAAhC;AACAxhF,aAAS8iF,OAAOpd,KAAhB;;AAEA;;AAEA,SAAMr1E,IAAI,CAAV,EAAaA,IAAI0yF,IAAjB,EAAuB1yF,GAAvB,EAA8B;;AAE7B2rC,YAAOhB,MAAO3qC,CAAP,CAAP;AACAu0F,QAAI5oD,KAAM,CAAN,IAAYh8B,MAAhB,EAAwBg8B,KAAM,CAAN,IAAYh8B,MAApC,EAA4Cg8B,KAAM,CAAN,IAAYh8B,MAAxD;AAEA;AAED,IA1BD,MA0BO;;AAEN;;AAEA,SAAM3P,IAAI,CAAV,EAAaA,IAAI0yF,IAAjB,EAAuB1yF,GAAvB,EAA8B;;AAE7B2rC,YAAOhB,MAAO3qC,CAAP,CAAP;AACAu0F,QAAI5oD,KAAM,CAAN,CAAJ,EAAeA,KAAM,CAAN,CAAf,EAA0BA,KAAM,CAAN,CAA1B;AAEA;;AAED;;AAEA,SAAM3rC,IAAI,CAAV,EAAaA,IAAI0yF,IAAjB,EAAuB1yF,GAAvB,EAA8B;;AAE7B2rC,YAAOhB,MAAO3qC,CAAP,CAAP;AACAu0F,QAAI5oD,KAAM,CAAN,IAAY8mD,OAAO1B,KAAvB,EAA8BplD,KAAM,CAAN,IAAY8mD,OAAO1B,KAAjD,EAAwDplD,KAAM,CAAN,IAAY8mD,OAAO1B,KAA3E;AAEA;AAED;;AAED5nE,SAAMorB,QAAN,CAAgBvmB,KAAhB,EAAuB2iE,cAAchyF,MAAd,GAAuB,CAAvB,GAA2BqvB,KAAlD,EAAyD,CAAzD;AAEA;;AAED;;AAEA,WAASsmE,cAAT,GAA0B;;AAEzB,OAAItmE,QAAQ2iE,cAAchyF,MAAd,GAAuB,CAAnC;AACA,OAAI61F,cAAc,CAAlB;AACAC,aAAWzE,OAAX,EAAoBwE,WAApB;AACAA,kBAAexE,QAAQrxF,MAAvB;;AAEA,QAAMic,IAAI,CAAJ,EAAOo3E,KAAK5B,MAAMzxF,MAAxB,EAAgCic,IAAIo3E,EAApC,EAAwCp3E,GAAxC,EAA+C;;AAE9Cm3E,YAAQ3B,MAAOx1E,CAAP,CAAR;AACA65E,cAAW1C,KAAX,EAAkByC,WAAlB;;AAEA;AACAA,mBAAezC,MAAMpzF,MAArB;AAEA;;AAGDwqB,SAAMorB,QAAN,CAAgBvmB,KAAhB,EAAuB2iE,cAAchyF,MAAd,GAAuB,CAAvB,GAA2BqvB,KAAlD,EAAyD,CAAzD;AAGA;;AAED,WAASymE,SAAT,CAAoBzE,OAApB,EAA6BwE,WAA7B,EAA2C;;AAE1C,OAAIvpE,CAAJ,EAAO8lB,CAAP;AACA/wC,OAAIgwF,QAAQrxF,MAAZ;;AAEA,UAAQ,EAAGqB,CAAH,IAAQ,CAAhB,EAAoB;;AAEnBirB,QAAIjrB,CAAJ;AACA+wC,QAAI/wC,IAAI,CAAR;AACA,QAAK+wC,IAAI,CAAT,EAAaA,IAAIi/C,QAAQrxF,MAAR,GAAiB,CAArB;;AAEb;;AAEA,QAAIuO,IAAI,CAAR;AAAA,QACCwnF,KAAK3D,QAAQI,gBAAgB,CAD9B;;AAGA,SAAMjkF,IAAI,CAAV,EAAaA,IAAIwnF,EAAjB,EAAqBxnF,GAArB,EAA4B;;AAE3B,SAAIynF,QAAQlC,OAAOvlF,CAAnB;AACA,SAAI0nF,QAAQnC,QAASvlF,IAAI,CAAb,CAAZ;;AAEA,SAAIC,IAAIqnF,cAAcvpE,CAAd,GAAkB0pE,KAA1B;AAAA,SACCvnF,IAAIonF,cAAczjD,CAAd,GAAkB4jD,KADvB;AAAA,SAECxkF,IAAIqkF,cAAczjD,CAAd,GAAkB6jD,KAFvB;AAAA,SAGChiF,IAAI4hF,cAAcvpE,CAAd,GAAkB2pE,KAHvB;;AAKAC,QAAI1nF,CAAJ,EAAOC,CAAP,EAAU+C,CAAV,EAAayC,CAAb;AAEA;AAED;AAED;;AAED,WAASjG,CAAT,CAAY9O,CAAZ,EAAe4M,CAAf,EAAkB0H,CAAlB,EAAsB;;AAErB0+E,eAAYtxF,IAAZ,CAAkB1B,CAAlB;AACAgzF,eAAYtxF,IAAZ,CAAkBkL,CAAlB;AACAomF,eAAYtxF,IAAZ,CAAkB4S,CAAlB;AAEA;;AAGD,WAASoiF,EAAT,CAAapnF,CAAb,EAAgBC,CAAhB,EAAmB+C,CAAnB,EAAuB;;AAEtB2kF,aAAW3nF,CAAX;AACA2nF,aAAW1nF,CAAX;AACA0nF,aAAW3kF,CAAX;;AAEA,OAAI4kF,YAAYpE,cAAchyF,MAAd,GAAuB,CAAvC;AACA,OAAIwtC,MAAMklD,MAAM2D,aAAN,CAAqB7rE,KAArB,EAA4BwnE,aAA5B,EAA2CoE,YAAY,CAAvD,EAA0DA,YAAY,CAAtE,EAAyEA,YAAY,CAArF,CAAV;;AAEAE,SAAO9oD,IAAK,CAAL,CAAP;AACA8oD,SAAO9oD,IAAK,CAAL,CAAP;AACA8oD,SAAO9oD,IAAK,CAAL,CAAP;AAEA;;AAED,WAAS0oD,EAAT,CAAa1nF,CAAb,EAAgBC,CAAhB,EAAmB+C,CAAnB,EAAsByC,CAAtB,EAA0B;;AAEzBkiF,aAAW3nF,CAAX;AACA2nF,aAAW1nF,CAAX;AACA0nF,aAAWliF,CAAX;;AAEAkiF,aAAW1nF,CAAX;AACA0nF,aAAW3kF,CAAX;AACA2kF,aAAWliF,CAAX;;AAGA,OAAImiF,YAAYpE,cAAchyF,MAAd,GAAuB,CAAvC;AACA,OAAIwtC,MAAMklD,MAAM6D,kBAAN,CAA0B/rE,KAA1B,EAAiCwnE,aAAjC,EAAgDoE,YAAY,CAA5D,EAA+DA,YAAY,CAA3E,EAA8EA,YAAY,CAA1F,EAA6FA,YAAY,CAAzG,CAAV;;AAEAE,SAAO9oD,IAAK,CAAL,CAAP;AACA8oD,SAAO9oD,IAAK,CAAL,CAAP;AACA8oD,SAAO9oD,IAAK,CAAL,CAAP;;AAEA8oD,SAAO9oD,IAAK,CAAL,CAAP;AACA8oD,SAAO9oD,IAAK,CAAL,CAAP;AACA8oD,SAAO9oD,IAAK,CAAL,CAAP;AAEA;;AAED,WAAS2oD,SAAT,CAAoBr2F,KAApB,EAA4B;;AAE3BkyF,iBAAcpxF,IAAd,CAAoBsxF,YAAapyF,QAAQ,CAAR,GAAY,CAAzB,CAApB;AACAkyF,iBAAcpxF,IAAd,CAAoBsxF,YAAapyF,QAAQ,CAAR,GAAY,CAAzB,CAApB;AACAkyF,iBAAcpxF,IAAd,CAAoBsxF,YAAapyF,QAAQ,CAAR,GAAY,CAAzB,CAApB;AAEA;;AAGD,WAASw2F,KAAT,CAAgBE,OAAhB,EAA0B;;AAEzB3Y,WAAQj9E,IAAR,CAAc41F,QAAQt3F,CAAtB;AACA2+E,WAAQj9E,IAAR,CAAc41F,QAAQ1qF,CAAtB;AAEA;AAED;AAED;;AAEDimF,sBAAsB3yF,SAAtB,GAAkCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAAlC;AACA2yF,sBAAsB3yF,SAAtB,CAAgC0O,WAAhC,GAA8CikF,qBAA9C;;AAEAA,sBAAsB3yF,SAAtB,CAAgComB,MAAhC,GAAyC,YAAY;;AAEpD,KAAIiD,OAAO2sB,eAAeh2C,SAAf,CAAyBomB,MAAzB,CAAgCplB,IAAhC,CAAsC,IAAtC,CAAX;;AAEA,KAAImpC,SAAS,KAAKM,UAAL,CAAgBN,MAA7B;AACA,KAAI7hB,UAAU,KAAKmiB,UAAL,CAAgBniB,OAA9B;;AAEA,QAAOlC,OAAQ+jB,MAAR,EAAgB7hB,OAAhB,EAAyBe,IAAzB,CAAP;AAEA,CATD;;AAWA;;AAEA,IAAImqE,mBAAmB;;AAEtByD,gBAAe,UAAW1rE,QAAX,EAAqBE,QAArB,EAA+B4rE,MAA/B,EAAuCC,MAAvC,EAA+CC,MAA/C,EAAwD;;AAEtE,MAAIC,MAAM/rE,SAAU4rE,SAAS,CAAnB,CAAV;AACA,MAAII,MAAMhsE,SAAU4rE,SAAS,CAAT,GAAa,CAAvB,CAAV;AACA,MAAIK,MAAMjsE,SAAU6rE,SAAS,CAAnB,CAAV;AACA,MAAIK,MAAMlsE,SAAU6rE,SAAS,CAAT,GAAa,CAAvB,CAAV;AACA,MAAIM,MAAMnsE,SAAU8rE,SAAS,CAAnB,CAAV;AACA,MAAIM,MAAMpsE,SAAU8rE,SAAS,CAAT,GAAa,CAAvB,CAAV;;AAEA,SAAO,CACN,IAAIzpF,OAAJ,CAAa0pF,GAAb,EAAkBC,GAAlB,CADM,EAEN,IAAI3pF,OAAJ,CAAa4pF,GAAb,EAAkBC,GAAlB,CAFM,EAGN,IAAI7pF,OAAJ,CAAa8pF,GAAb,EAAkBC,GAAlB,CAHM,CAAP;AAMA,EAjBqB;;AAmBtBV,qBAAoB,UAAW5rE,QAAX,EAAqBE,QAArB,EAA+B4rE,MAA/B,EAAuCC,MAAvC,EAA+CC,MAA/C,EAAuDO,MAAvD,EAAgE;;AAEnF,MAAIN,MAAM/rE,SAAU4rE,SAAS,CAAnB,CAAV;AACA,MAAII,MAAMhsE,SAAU4rE,SAAS,CAAT,GAAa,CAAvB,CAAV;AACA,MAAIU,MAAMtsE,SAAU4rE,SAAS,CAAT,GAAa,CAAvB,CAAV;AACA,MAAIK,MAAMjsE,SAAU6rE,SAAS,CAAnB,CAAV;AACA,MAAIK,MAAMlsE,SAAU6rE,SAAS,CAAT,GAAa,CAAvB,CAAV;AACA,MAAIU,MAAMvsE,SAAU6rE,SAAS,CAAT,GAAa,CAAvB,CAAV;AACA,MAAIM,MAAMnsE,SAAU8rE,SAAS,CAAnB,CAAV;AACA,MAAIM,MAAMpsE,SAAU8rE,SAAS,CAAT,GAAa,CAAvB,CAAV;AACA,MAAIU,MAAMxsE,SAAU8rE,SAAS,CAAT,GAAa,CAAvB,CAAV;AACA,MAAIW,MAAMzsE,SAAUqsE,SAAS,CAAnB,CAAV;AACA,MAAIK,MAAM1sE,SAAUqsE,SAAS,CAAT,GAAa,CAAvB,CAAV;AACA,MAAIM,MAAM3sE,SAAUqsE,SAAS,CAAT,GAAa,CAAvB,CAAV;;AAEA,MAAKv4F,KAAKqR,GAAL,CAAU6mF,MAAME,GAAhB,IAAwB,IAA7B,EAAoC;;AAEnC,UAAO,CACN,IAAI7pF,OAAJ,CAAa0pF,GAAb,EAAkB,IAAIO,GAAtB,CADM,EAEN,IAAIjqF,OAAJ,CAAa4pF,GAAb,EAAkB,IAAIM,GAAtB,CAFM,EAGN,IAAIlqF,OAAJ,CAAa8pF,GAAb,EAAkB,IAAIK,GAAtB,CAHM,EAIN,IAAInqF,OAAJ,CAAaoqF,GAAb,EAAkB,IAAIE,GAAtB,CAJM,CAAP;AAOA,GATD,MASO;;AAEN,UAAO,CACN,IAAItqF,OAAJ,CAAa2pF,GAAb,EAAkB,IAAIM,GAAtB,CADM,EAEN,IAAIjqF,OAAJ,CAAa6pF,GAAb,EAAkB,IAAIK,GAAtB,CAFM,EAGN,IAAIlqF,OAAJ,CAAa+pF,GAAb,EAAkB,IAAII,GAAtB,CAHM,EAIN,IAAInqF,OAAJ,CAAaqqF,GAAb,EAAkB,IAAIC,GAAtB,CAJM,CAAP;AAOA;AAED;AAtDqB,CAAvB;;AAyDA,SAAShyE,MAAT,CAAiB+jB,MAAjB,EAAyB7hB,OAAzB,EAAkCe,IAAlC,EAAyC;;AAExC;;AAEAA,MAAK8gB,MAAL,GAAc,EAAd;;AAEA,KAAK/P,MAAMC,OAAN,CAAe8P,MAAf,CAAL,EAA+B;;AAE9B,OAAM,IAAIloC,IAAI,CAAR,EAAWC,IAAIioC,OAAOvpC,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAIyoC,QAAQP,OAAQloC,CAAR,CAAZ;;AAEAonB,QAAK8gB,MAAL,CAAY3oC,IAAZ,CAAkBkpC,MAAM9+B,IAAxB;AAEA;AAED,EAVD,MAUO;;AAENyd,OAAK8gB,MAAL,CAAY3oC,IAAZ,CAAkB2oC,OAAOv+B,IAAzB;AAEA;;AAED;;AAEA,KAAK0c,QAAQ+qE,WAAR,KAAwB/zF,SAA7B,EAAyC+pB,KAAKf,OAAL,CAAa+qE,WAAb,GAA2B/qE,QAAQ+qE,WAAR,CAAoBjtE,MAApB,EAA3B;;AAEzC,QAAOiD,IAAP;AAEA;;AAED;;;;;;;;;;;;;;;;;;;AAmBA;;AAEA,SAASgvE,YAAT,CAAuBC,IAAvB,EAA6B7tD,UAA7B,EAA0C;;AAEzCiC,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,cAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB6tD,QAAMA,IADW;AAEjB7tD,cAAYA;AAFK,EAAlB;;AAKA,MAAKuD,kBAAL,CAAyB,IAAIuqD,kBAAJ,CAAwBD,IAAxB,EAA8B7tD,UAA9B,CAAzB;AACA,MAAKwG,aAAL;AAEA;;AAEDonD,aAAar4F,SAAb,GAAyBC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAAzB;AACAq4F,aAAar4F,SAAb,CAAuB0O,WAAvB,GAAqC2pF,YAArC;;AAEA;;AAEA,SAASE,kBAAT,CAA6BD,IAA7B,EAAmC7tD,UAAnC,EAAgD;;AAE/CA,cAAaA,cAAc,EAA3B;;AAEA,KAAI+tD,OAAO/tD,WAAW+tD,IAAtB;;AAEA,KAAK,EAAIA,QAAQA,KAAKC,MAAjB,CAAL,EAAiC;;AAEhC1pF,UAAQyD,KAAR,CAAe,sEAAf;AACA,SAAO,IAAIk6B,QAAJ,EAAP;AAEA;;AAED,KAAIvC,SAASquD,KAAKE,cAAL,CAAqBJ,IAArB,EAA2B7tD,WAAWjgB,IAAtC,EAA4CigB,WAAWsoD,aAAvD,CAAb;;AAEA;;AAEAtoD,YAAW5I,KAAX,GAAmB4I,WAAW3jB,MAAX,KAAsBxnB,SAAtB,GAAkCmrC,WAAW3jB,MAA7C,GAAsD,EAAzE;;AAEA;;AAEA,KAAK2jB,WAAWyoD,cAAX,KAA8B5zF,SAAnC,EAA+CmrC,WAAWyoD,cAAX,GAA4B,EAA5B;AAC/C,KAAKzoD,WAAW0oD,SAAX,KAAyB7zF,SAA9B,EAA0CmrC,WAAW0oD,SAAX,GAAuB,CAAvB;AAC1C,KAAK1oD,WAAWwoD,YAAX,KAA4B3zF,SAAjC,EAA6CmrC,WAAWwoD,YAAX,GAA0B,KAA1B;;AAE7CN,uBAAsB3xF,IAAtB,CAA4B,IAA5B,EAAkCmpC,MAAlC,EAA0CM,UAA1C;;AAEA,MAAKtpC,IAAL,GAAY,oBAAZ;AAEA;;AAEDo3F,mBAAmBv4F,SAAnB,GAA+BC,OAAOgmB,MAAP,CAAe0sE,sBAAsB3yF,SAArC,CAA/B;AACAu4F,mBAAmBv4F,SAAnB,CAA6B0O,WAA7B,GAA2C6pF,kBAA3C;;AAEA;;;;;;AAMA;;AAEA,SAASI,cAAT,CAAyBl1E,MAAzB,EAAiC00B,aAAjC,EAAgDC,cAAhD,EAAgEwgD,QAAhE,EAA0EC,SAA1E,EAAqFC,UAArF,EAAiGC,WAAjG,EAA+G;;AAE9GrsD,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,gBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjB00B,iBAAeA,aAFE;AAGjBC,kBAAgBA,cAHC;AAIjBwgD,YAAUA,QAJO;AAKjBC,aAAWA,SALM;AAMjBC,cAAYA,UANK;AAOjBC,eAAaA;AAPI,EAAlB;;AAUA,MAAK/qD,kBAAL,CAAyB,IAAIgrD,oBAAJ,CAA0Bv1E,MAA1B,EAAkC00B,aAAlC,EAAiDC,cAAjD,EAAiEwgD,QAAjE,EAA2EC,SAA3E,EAAsFC,UAAtF,EAAkGC,WAAlG,CAAzB;AACA,MAAK9nD,aAAL;AAEA;;AAED0nD,eAAe34F,SAAf,GAA2BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA3B;AACA24F,eAAe34F,SAAf,CAAyB0O,WAAzB,GAAuCiqF,cAAvC;;AAEA;;AAEA,SAASK,oBAAT,CAA+Bv1E,MAA/B,EAAuC00B,aAAvC,EAAsDC,cAAtD,EAAsEwgD,QAAtE,EAAgFC,SAAhF,EAA2FC,UAA3F,EAAuGC,WAAvG,EAAqH;;AAEpH/iD,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,sBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjB00B,iBAAeA,aAFE;AAGjBC,kBAAgBA,cAHC;AAIjBwgD,YAAUA,QAJO;AAKjBC,aAAWA,SALM;AAMjBC,cAAYA,UANK;AAOjBC,eAAaA;AAPI,EAAlB;;AAUAt1E,UAASA,UAAU,CAAnB;;AAEA00B,iBAAgB54C,KAAKyM,GAAL,CAAU,CAAV,EAAazM,KAAKK,KAAL,CAAYu4C,aAAZ,KAA+B,CAA5C,CAAhB;AACAC,kBAAiB74C,KAAKyM,GAAL,CAAU,CAAV,EAAazM,KAAKK,KAAL,CAAYw4C,cAAZ,KAAgC,CAA7C,CAAjB;;AAEAwgD,YAAWA,aAAat5F,SAAb,GAAyBs5F,QAAzB,GAAoC,CAA/C;AACAC,aAAYA,cAAcv5F,SAAd,GAA0Bu5F,SAA1B,GAAsCt5F,KAAK4L,EAAL,GAAU,CAA5D;;AAEA2tF,cAAaA,eAAex5F,SAAf,GAA2Bw5F,UAA3B,GAAwC,CAArD;AACAC,eAAcA,gBAAgBz5F,SAAhB,GAA4By5F,WAA5B,GAA0Cx5F,KAAK4L,EAA7D;;AAEA,KAAI8tF,WAAWH,aAAaC,WAA5B;;AAEA,KAAIl3E,EAAJ,EAAQC,EAAR;;AAEA,KAAIphB,QAAQ,CAAZ;AACA,KAAIw4F,OAAO,EAAX;;AAEA,KAAIvrD,SAAS,IAAIr5B,OAAJ,EAAb;AACA,KAAI4O,SAAS,IAAI5O,OAAJ,EAAb;;AAEA;;AAEA,KAAI25B,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;;AAEA;;AAEA,MAAMtsB,KAAK,CAAX,EAAcA,MAAMs2B,cAApB,EAAoCt2B,IAApC,EAA4C;;AAE3C,MAAIq3E,cAAc,EAAlB;;AAEA,MAAIvqF,IAAIkT,KAAKs2B,cAAb;;AAEA,OAAMv2B,KAAK,CAAX,EAAcA,MAAMs2B,aAApB,EAAmCt2B,IAAnC,EAA2C;;AAE1C,OAAIkY,IAAIlY,KAAKs2B,aAAb;;AAEA;;AAEAxK,UAAO7tC,CAAP,GAAW,CAAE2jB,MAAF,GAAWlkB,KAAK8S,GAAL,CAAUumF,WAAW7+D,IAAI8+D,SAAzB,CAAX,GAAkDt5F,KAAK+S,GAAL,CAAUwmF,aAAalqF,IAAImqF,WAA3B,CAA7D;AACAprD,UAAOjhC,CAAP,GAAW+W,SAASlkB,KAAK8S,GAAL,CAAUymF,aAAalqF,IAAImqF,WAA3B,CAApB;AACAprD,UAAOv5B,CAAP,GAAWqP,SAASlkB,KAAK+S,GAAL,CAAUsmF,WAAW7+D,IAAI8+D,SAAzB,CAAT,GAAgDt5F,KAAK+S,GAAL,CAAUwmF,aAAalqF,IAAImqF,WAA3B,CAA3D;;AAEAttE,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEA;;AAEA8O,UAAOlV,GAAP,CAAY2/B,OAAO7tC,CAAnB,EAAsB6tC,OAAOjhC,CAA7B,EAAgCihC,OAAOv5B,CAAvC,EAA2CvD,SAA3C;AACAs9B,WAAQ3sC,IAAR,CAAc0hB,OAAOpjB,CAArB,EAAwBojB,OAAOxW,CAA/B,EAAkCwW,OAAO9O,CAAzC;;AAEA;;AAEAg6B,OAAI5sC,IAAJ,CAAUu4B,CAAV,EAAa,IAAInrB,CAAjB;;AAEAuqF,eAAY33F,IAAZ,CAAkBd,OAAlB;AAEA;;AAEDw4F,OAAK13F,IAAL,CAAW23F,WAAX;AAEA;;AAED;;AAEA,MAAMr3E,KAAK,CAAX,EAAcA,KAAKs2B,cAAnB,EAAmCt2B,IAAnC,EAA2C;;AAE1C,OAAMD,KAAK,CAAX,EAAcA,KAAKs2B,aAAnB,EAAkCt2B,IAAlC,EAA0C;;AAEzC,OAAIzS,IAAI8pF,KAAMp3E,EAAN,EAAYD,KAAK,CAAjB,CAAR;AACA,OAAIxS,IAAI6pF,KAAMp3E,EAAN,EAAYD,EAAZ,CAAR;AACA,OAAIzP,IAAI8mF,KAAMp3E,KAAK,CAAX,EAAgBD,EAAhB,CAAR;AACA,OAAIhN,IAAIqkF,KAAMp3E,KAAK,CAAX,EAAgBD,KAAK,CAArB,CAAR;;AAEA,OAAKC,OAAO,CAAP,IAAYg3E,aAAa,CAA9B,EAAkC7qD,QAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBwF,CAApB;AAClC,OAAKiN,OAAOs2B,iBAAiB,CAAxB,IAA6B6gD,WAAW15F,KAAK4L,EAAlD,EAAuD8iC,QAAQzsC,IAAR,CAAc6N,CAAd,EAAiB+C,CAAjB,EAAoByC,CAApB;AAEvD;AAED;;AAED;;AAEA,MAAKuhC,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;AAEA;;AAED4qD,qBAAqBh5F,SAArB,GAAiCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAAjC;AACAg5F,qBAAqBh5F,SAArB,CAA+B0O,WAA/B,GAA6CsqF,oBAA7C;;AAEA;;;;;AAKA;;AAEA,SAASI,YAAT,CAAuBC,WAAvB,EAAoCC,WAApC,EAAiDC,aAAjD,EAAgEC,WAAhE,EAA6EV,UAA7E,EAAyFC,WAAzF,EAAuG;;AAEtGrsD,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,cAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB4uD,eAAaA,WADI;AAEjBC,eAAaA,WAFI;AAGjBC,iBAAeA,aAHE;AAIjBC,eAAaA,WAJI;AAKjBV,cAAYA,UALK;AAMjBC,eAAaA;AANI,EAAlB;;AASA,MAAK/qD,kBAAL,CAAyB,IAAIyrD,kBAAJ,CAAwBJ,WAAxB,EAAqCC,WAArC,EAAkDC,aAAlD,EAAiEC,WAAjE,EAA8EV,UAA9E,EAA0FC,WAA1F,CAAzB;AACA,MAAK9nD,aAAL;AAEA;;AAEDmoD,aAAap5F,SAAb,GAAyBC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAAzB;AACAo5F,aAAap5F,SAAb,CAAuB0O,WAAvB,GAAqC0qF,YAArC;;AAEA;;AAEA,SAASK,kBAAT,CAA6BJ,WAA7B,EAA0CC,WAA1C,EAAuDC,aAAvD,EAAsEC,WAAtE,EAAmFV,UAAnF,EAA+FC,WAA/F,EAA6G;;AAE5G/iD,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,oBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjB4uD,eAAaA,WADI;AAEjBC,eAAaA,WAFI;AAGjBC,iBAAeA,aAHE;AAIjBC,eAAaA,WAJI;AAKjBV,cAAYA,UALK;AAMjBC,eAAaA;AANI,EAAlB;;AASAM,eAAcA,eAAe,GAA7B;AACAC,eAAcA,eAAe,CAA7B;;AAEAR,cAAaA,eAAex5F,SAAf,GAA2Bw5F,UAA3B,GAAwC,CAArD;AACAC,eAAcA,gBAAgBz5F,SAAhB,GAA4By5F,WAA5B,GAA0Cx5F,KAAK4L,EAAL,GAAU,CAAlE;;AAEAouF,iBAAgBA,kBAAkBj6F,SAAlB,GAA8BC,KAAKyM,GAAL,CAAU,CAAV,EAAautF,aAAb,CAA9B,GAA6D,CAA7E;AACAC,eAAcA,gBAAgBl6F,SAAhB,GAA4BC,KAAKyM,GAAL,CAAU,CAAV,EAAawtF,WAAb,CAA5B,GAAyD,CAAvE;;AAEA;;AAEA,KAAIvrD,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;;AAEA;;AAEA,KAAIsrD,OAAJ;AACA,KAAIj2E,SAAS41E,WAAb;AACA,KAAIM,aAAe,CAAEL,cAAcD,WAAhB,IAAgCG,WAAnD;AACA,KAAI7rD,SAAS,IAAIr5B,OAAJ,EAAb;AACA,KAAIsT,KAAK,IAAI9Z,OAAJ,EAAT;AACA,KAAIof,CAAJ,EAAOjrB,CAAP;;AAEA;;AAEA,MAAMirB,IAAI,CAAV,EAAaA,KAAKssE,WAAlB,EAA+BtsE,GAA/B,EAAsC;;AAErC,OAAMjrB,IAAI,CAAV,EAAaA,KAAKs3F,aAAlB,EAAiCt3F,GAAjC,EAAwC;;AAEvC;;AAEAy3F,aAAUZ,aAAa72F,IAAIs3F,aAAJ,GAAoBR,WAA3C;;AAEA;;AAEAprD,UAAO7tC,CAAP,GAAW2jB,SAASlkB,KAAK8S,GAAL,CAAUqnF,OAAV,CAApB;AACA/rD,UAAOjhC,CAAP,GAAW+W,SAASlkB,KAAK+S,GAAL,CAAUonF,OAAV,CAApB;;AAEAjuE,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEA;;AAEA+5B,WAAQ3sC,IAAR,CAAc,CAAd,EAAiB,CAAjB,EAAoB,CAApB;;AAEA;;AAEAomB,MAAG9nB,CAAH,GAAO,CAAE6tC,OAAO7tC,CAAP,GAAWw5F,WAAX,GAAyB,CAA3B,IAAiC,CAAxC;AACA1xE,MAAGlb,CAAH,GAAO,CAAEihC,OAAOjhC,CAAP,GAAW4sF,WAAX,GAAyB,CAA3B,IAAiC,CAAxC;;AAEAlrD,OAAI5sC,IAAJ,CAAUomB,GAAG9nB,CAAb,EAAgB8nB,GAAGlb,CAAnB;AAEA;;AAED;;AAEA+W,YAAUk2E,UAAV;AAEA;;AAED;;AAEA,MAAMzsE,IAAI,CAAV,EAAaA,IAAIssE,WAAjB,EAA8BtsE,GAA9B,EAAqC;;AAEpC,MAAI0sE,oBAAoB1sE,KAAMqsE,gBAAgB,CAAtB,CAAxB;;AAEA,OAAMt3F,IAAI,CAAV,EAAaA,IAAIs3F,aAAjB,EAAgCt3F,GAAhC,EAAuC;;AAEtCy3F,aAAUz3F,IAAI23F,iBAAd;;AAEA,OAAIxqF,IAAIsqF,OAAR;AACA,OAAIrqF,IAAIqqF,UAAUH,aAAV,GAA0B,CAAlC;AACA,OAAInnF,IAAIsnF,UAAUH,aAAV,GAA0B,CAAlC;AACA,OAAI1kF,IAAI6kF,UAAU,CAAlB;;AAEA;;AAEAzrD,WAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBwF,CAApB;AACAo5B,WAAQzsC,IAAR,CAAc6N,CAAd,EAAiB+C,CAAjB,EAAoByC,CAApB;AAEA;AAED;;AAED;;AAEA,MAAKuhC,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;AAEA;;AAEDqrD,mBAAmBz5F,SAAnB,GAA+BC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAA/B;AACAy5F,mBAAmBz5F,SAAnB,CAA6B0O,WAA7B,GAA2C+qF,kBAA3C;;AAEA;;;;;;;AAOA;;AAEA,SAASI,aAAT,CAAwB1vE,MAAxB,EAAgC2vE,QAAhC,EAA0ClB,QAA1C,EAAoDC,SAApD,EAAgE;;AAE/DnsD,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,eAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBtgB,UAAQA,MADS;AAEjB2vE,YAAUA,QAFO;AAGjBlB,YAAUA,QAHO;AAIjBC,aAAWA;AAJM,EAAlB;;AAOA,MAAK7qD,kBAAL,CAAyB,IAAI+rD,mBAAJ,CAAyB5vE,MAAzB,EAAiC2vE,QAAjC,EAA2ClB,QAA3C,EAAqDC,SAArD,CAAzB;AACA,MAAK5nD,aAAL;AAEA;;AAED4oD,cAAc75F,SAAd,GAA0BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA1B;AACA65F,cAAc75F,SAAd,CAAwB0O,WAAxB,GAAsCmrF,aAAtC;;AAEA;;AAEA,SAASE,mBAAT,CAA8B5vE,MAA9B,EAAsC2vE,QAAtC,EAAgDlB,QAAhD,EAA0DC,SAA1D,EAAsE;;AAErE7iD,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,qBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBtgB,UAAQA,MADS;AAEjB2vE,YAAUA,QAFO;AAGjBlB,YAAUA,QAHO;AAIjBC,aAAWA;AAJM,EAAlB;;AAOAiB,YAAWv6F,KAAKK,KAAL,CAAYk6F,QAAZ,KAA0B,EAArC;AACAlB,YAAWA,YAAY,CAAvB;AACAC,aAAYA,aAAat5F,KAAK4L,EAAL,GAAU,CAAnC;;AAEA;;AAEA0tF,aAAY5tF,MAAMa,KAAN,CAAa+sF,SAAb,EAAwB,CAAxB,EAA2Bt5F,KAAK4L,EAAL,GAAU,CAArC,CAAZ;;AAGA;;AAEA,KAAI8iC,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI2iB,MAAM,EAAV;;AAEA;;AAEA,KAAI4rD,IAAJ;AACA,KAAIC,kBAAkB,MAAMH,QAA5B;AACA,KAAInsD,SAAS,IAAIr5B,OAAJ,EAAb;AACA,KAAIsT,KAAK,IAAI9Z,OAAJ,EAAT;AACA,KAAI7L,CAAJ,EAAOirB,CAAP;;AAEA;;AAEA,MAAMjrB,IAAI,CAAV,EAAaA,KAAK63F,QAAlB,EAA4B73F,GAA5B,EAAmC;;AAElC,MAAIuhB,MAAMo1E,WAAW32F,IAAIg4F,eAAJ,GAAsBpB,SAA3C;;AAEA,MAAIvmF,MAAM/S,KAAK+S,GAAL,CAAUkR,GAAV,CAAV;AACA,MAAInR,MAAM9S,KAAK8S,GAAL,CAAUmR,GAAV,CAAV;;AAEA,OAAM0J,IAAI,CAAV,EAAaA,KAAO/C,OAAOvpB,MAAP,GAAgB,CAApC,EAAyCssB,GAAzC,EAAgD;;AAE/C;;AAEAygB,UAAO7tC,CAAP,GAAWqqB,OAAQ+C,CAAR,EAAYptB,CAAZ,GAAgBwS,GAA3B;AACAq7B,UAAOjhC,CAAP,GAAWyd,OAAQ+C,CAAR,EAAYxgB,CAAvB;AACAihC,UAAOv5B,CAAP,GAAW+V,OAAQ+C,CAAR,EAAYptB,CAAZ,GAAgBuS,GAA3B;;AAEAoZ,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEA;;AAEAwT,MAAG9nB,CAAH,GAAOmC,IAAI63F,QAAX;AACAlyE,MAAGlb,CAAH,GAAOwgB,KAAM/C,OAAOvpB,MAAP,GAAgB,CAAtB,CAAP;;AAEAwtC,OAAI5sC,IAAJ,CAAUomB,GAAG9nB,CAAb,EAAgB8nB,GAAGlb,CAAnB;AAGA;AAED;;AAED;;AAEA,MAAMzK,IAAI,CAAV,EAAaA,IAAI63F,QAAjB,EAA2B73F,GAA3B,EAAkC;;AAEjC,OAAMirB,IAAI,CAAV,EAAaA,IAAM/C,OAAOvpB,MAAP,GAAgB,CAAnC,EAAwCssB,GAAxC,EAA+C;;AAE9C8sE,UAAO9sE,IAAIjrB,IAAIkoB,OAAOvpB,MAAtB;;AAEA,OAAIwO,IAAI4qF,IAAR;AACA,OAAI3qF,IAAI2qF,OAAO7vE,OAAOvpB,MAAtB;AACA,OAAIwR,IAAI4nF,OAAO7vE,OAAOvpB,MAAd,GAAuB,CAA/B;AACA,OAAIiU,IAAImlF,OAAO,CAAf;;AAEA;;AAEA/rD,WAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBwF,CAApB;AACAo5B,WAAQzsC,IAAR,CAAc6N,CAAd,EAAiB+C,CAAjB,EAAoByC,CAApB;AAEA;AAED;;AAED;;AAEA,MAAKuhC,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;;AAEA;;AAEA,MAAKgB,oBAAL;;AAEA;AACA;;AAEA,KAAKypD,cAAct5F,KAAK4L,EAAL,GAAU,CAA7B,EAAiC;;AAEhC,MAAIgjC,UAAU,KAAKxiB,UAAL,CAAgBzI,MAAhB,CAAuBnhB,KAArC;AACA,MAAIm4F,KAAK,IAAI5lF,OAAJ,EAAT;AACA,MAAI6lF,KAAK,IAAI7lF,OAAJ,EAAT;AACA,MAAIpI,IAAI,IAAIoI,OAAJ,EAAR;;AAEA;;AAEA0lF,SAAOF,WAAW3vE,OAAOvpB,MAAlB,GAA2B,CAAlC;;AAEA,OAAMqB,IAAI,CAAJ,EAAOirB,IAAI,CAAjB,EAAoBjrB,IAAIkoB,OAAOvpB,MAA/B,EAAuCqB,KAAMirB,KAAK,CAAlD,EAAsD;;AAErD;;AAEAgtE,MAAGp6F,CAAH,GAAOquC,QAASjhB,IAAI,CAAb,CAAP;AACAgtE,MAAGxtF,CAAH,GAAOyhC,QAASjhB,IAAI,CAAb,CAAP;AACAgtE,MAAG9lF,CAAH,GAAO+5B,QAASjhB,IAAI,CAAb,CAAP;;AAEA;;AAEAitE,MAAGr6F,CAAH,GAAOquC,QAAS6rD,OAAO9sE,CAAP,GAAW,CAApB,CAAP;AACAitE,MAAGztF,CAAH,GAAOyhC,QAAS6rD,OAAO9sE,CAAP,GAAW,CAApB,CAAP;AACAitE,MAAG/lF,CAAH,GAAO+5B,QAAS6rD,OAAO9sE,CAAP,GAAW,CAApB,CAAP;;AAEA;;AAEAhhB,KAAE+C,UAAF,CAAcirF,EAAd,EAAkBC,EAAlB,EAAuBtpF,SAAvB;;AAEA;;AAEAs9B,WAASjhB,IAAI,CAAb,IAAmBihB,QAAS6rD,OAAO9sE,CAAP,GAAW,CAApB,IAA0BhhB,EAAEpM,CAA/C;AACAquC,WAASjhB,IAAI,CAAb,IAAmBihB,QAAS6rD,OAAO9sE,CAAP,GAAW,CAApB,IAA0BhhB,EAAEQ,CAA/C;AACAyhC,WAASjhB,IAAI,CAAb,IAAmBihB,QAAS6rD,OAAO9sE,CAAP,GAAW,CAApB,IAA0BhhB,EAAEkI,CAA/C;AAEA;AAED;AAED;;AAED2lF,oBAAoB/5F,SAApB,GAAgCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAAhC;AACA+5F,oBAAoB/5F,SAApB,CAA8B0O,WAA9B,GAA4CqrF,mBAA5C;;AAEA;;;;;AAKA;;AAEA,SAASK,aAAT,CAAwBjwD,MAAxB,EAAgC4oD,aAAhC,EAAgD;;AAE/CrmD,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,eAAZ;;AAEA,KAAK,OAAO4xF,aAAP,KAAyB,QAA9B,EAAyC;;AAExChkF,UAAQC,IAAR,CAAc,0DAAd;;AAEA+jF,kBAAgBA,cAAcA,aAA9B;AAEA;;AAED,MAAKtoD,UAAL,GAAkB;AACjBN,UAAQA,MADS;AAEjB4oD,iBAAeA;AAFE,EAAlB;;AAKA,MAAK/kD,kBAAL,CAAyB,IAAIqsD,mBAAJ,CAAyBlwD,MAAzB,EAAiC4oD,aAAjC,CAAzB;AACA,MAAK9hD,aAAL;AAEA;;AAEDmpD,cAAcp6F,SAAd,GAA0BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA1B;AACAo6F,cAAcp6F,SAAd,CAAwB0O,WAAxB,GAAsC0rF,aAAtC;;AAEAA,cAAcp6F,SAAd,CAAwBomB,MAAxB,GAAiC,YAAY;;AAE5C,KAAIiD,OAAOqjB,SAAS1sC,SAAT,CAAmBomB,MAAnB,CAA0BplB,IAA1B,CAAgC,IAAhC,CAAX;;AAEA,KAAImpC,SAAS,KAAKM,UAAL,CAAgBN,MAA7B;;AAEA,QAAOmwD,SAAUnwD,MAAV,EAAkB9gB,IAAlB,CAAP;AAEA,CARD;;AAUA;;AAEA,SAASgxE,mBAAT,CAA8BlwD,MAA9B,EAAsC4oD,aAAtC,EAAsD;;AAErD/8C,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,qBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBN,UAAQA,MADS;AAEjB4oD,iBAAeA;AAFE,EAAlB;;AAKAA,iBAAgBA,iBAAiB,EAAjC;;AAEA;;AAEA,KAAI9kD,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;;AAEA;;AAEA,KAAIoK,aAAa,CAAjB;AACA,KAAIc,aAAa,CAAjB;;AAEA;;AAEA,KAAKlf,MAAMC,OAAN,CAAe8P,MAAf,MAA4B,KAAjC,EAAyC;;AAExC0oD,WAAU1oD,MAAV;AAEA,EAJD,MAIO;;AAEN,OAAM,IAAIloC,IAAI,CAAd,EAAiBA,IAAIkoC,OAAOvpC,MAA5B,EAAoCqB,GAApC,EAA2C;;AAE1C4wF,YAAU1oD,OAAQloC,CAAR,CAAV;;AAEA,QAAKu0C,QAAL,CAAegC,UAAf,EAA2Bc,UAA3B,EAAuCr3C,CAAvC,EAJ0C,CAIE;;AAE5Cu2C,iBAAcc,UAAd;AACAA,gBAAa,CAAb;AAEA;AAED;;AAED;;AAEA,MAAKlD,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;;AAGA;;AAEA,UAASykD,QAAT,CAAmBnoD,KAAnB,EAA2B;;AAE1B,MAAIzoC,CAAJ,EAAOC,CAAP,EAAUq4F,SAAV;;AAEA,MAAIC,cAAc/uE,SAAS7qB,MAAT,GAAkB,CAApC;AACA,MAAIupB,SAASugB,MAAMypD,aAAN,CAAqBpB,aAArB,CAAb;;AAEA,MAAI0H,gBAAgBtwE,OAAOugB,KAA3B;AACA,MAAIgwD,aAAavwE,OAAOkoE,KAAxB;;AAEA;;AAEA,MAAKL,WAAWE,WAAX,CAAwBuI,aAAxB,MAA4C,KAAjD,EAAyD;;AAExDA,mBAAgBA,cAAcrG,OAAd,EAAhB;;AAEA;;AAEA,QAAMnyF,IAAI,CAAJ,EAAOC,IAAIw4F,WAAW95F,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjDs4F,gBAAYG,WAAYz4F,CAAZ,CAAZ;;AAEA,QAAK+vF,WAAWE,WAAX,CAAwBqI,SAAxB,MAAwC,IAA7C,EAAoD;;AAEnDG,gBAAYz4F,CAAZ,IAAkBs4F,UAAUnG,OAAV,EAAlB;AAEA;AAED;AAED;;AAED,MAAIxnD,QAAQolD,WAAWI,gBAAX,CAA6BqI,aAA7B,EAA4CC,UAA5C,CAAZ;;AAEA;;AAEA,OAAMz4F,IAAI,CAAJ,EAAOC,IAAIw4F,WAAW95F,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjDs4F,eAAYG,WAAYz4F,CAAZ,CAAZ;AACAw4F,mBAAgBA,cAAcpG,MAAd,CAAsBkG,SAAtB,CAAhB;AAEA;;AAED;;AAEA,OAAMt4F,IAAI,CAAJ,EAAOC,IAAIu4F,cAAc75F,MAA/B,EAAuCqB,IAAIC,CAA3C,EAA8CD,GAA9C,EAAqD;;AAEpD,OAAI0rC,SAAS8sD,cAAex4F,CAAf,CAAb;;AAEAwpB,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmC,CAAnC;AACAyhC,WAAQ3sC,IAAR,CAAc,CAAd,EAAiB,CAAjB,EAAoB,CAApB;AACA4sC,OAAI5sC,IAAJ,CAAUmsC,OAAO7tC,CAAjB,EAAoB6tC,OAAOjhC,CAA3B,EANoD,CAMpB;AAEhC;;AAED;;AAEA,OAAMzK,IAAI,CAAJ,EAAOC,IAAI0qC,MAAMhsC,MAAvB,EAA+BqB,IAAIC,CAAnC,EAAsCD,GAAtC,EAA6C;;AAE5C,OAAI2rC,OAAOhB,MAAO3qC,CAAP,CAAX;;AAEA,OAAImN,IAAIw+B,KAAM,CAAN,IAAY4sD,WAApB;AACA,OAAInrF,IAAIu+B,KAAM,CAAN,IAAY4sD,WAApB;AACA,OAAIpoF,IAAIw7B,KAAM,CAAN,IAAY4sD,WAApB;;AAEAvsD,WAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoB+C,CAApB;AACAknC,iBAAc,CAAd;AAEA;AAED;AAED;;AAED+gD,oBAAoBr6F,SAApB,GAAgCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAAhC;AACAq6F,oBAAoBr6F,SAApB,CAA8B0O,WAA9B,GAA4C2rF,mBAA5C;;AAEAA,oBAAoBr6F,SAApB,CAA8BomB,MAA9B,GAAuC,YAAY;;AAElD,KAAIiD,OAAO2sB,eAAeh2C,SAAf,CAAyBomB,MAAzB,CAAgCplB,IAAhC,CAAsC,IAAtC,CAAX;;AAEA,KAAImpC,SAAS,KAAKM,UAAL,CAAgBN,MAA7B;;AAEA,QAAOmwD,SAAUnwD,MAAV,EAAkB9gB,IAAlB,CAAP;AAEA,CARD;;AAUA;;AAEA,SAASixE,QAAT,CAAmBnwD,MAAnB,EAA2B9gB,IAA3B,EAAkC;;AAEjCA,MAAK8gB,MAAL,GAAc,EAAd;;AAEA,KAAK/P,MAAMC,OAAN,CAAe8P,MAAf,CAAL,EAA+B;;AAE9B,OAAM,IAAIloC,IAAI,CAAR,EAAWC,IAAIioC,OAAOvpC,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAIyoC,QAAQP,OAAQloC,CAAR,CAAZ;;AAEAonB,QAAK8gB,MAAL,CAAY3oC,IAAZ,CAAkBkpC,MAAM9+B,IAAxB;AAEA;AAED,EAVD,MAUO;;AAENyd,OAAK8gB,MAAL,CAAY3oC,IAAZ,CAAkB2oC,OAAOv+B,IAAzB;AAEA;;AAED,QAAOyd,IAAP;AAEA;;AAED;;;;;AAKA,SAASsxE,aAAT,CAAwBpvE,QAAxB,EAAkCqvE,cAAlC,EAAmD;;AAElD5kD,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,eAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBmwD,kBAAgBA;AADC,EAAlB;;AAIAA,kBAAmBA,mBAAmBt7F,SAArB,GAAmCs7F,cAAnC,GAAoD,CAArE;;AAEA;;AAEA,KAAInvE,WAAW,EAAf;;AAEA;;AAEA,KAAIovE,eAAet7F,KAAK8S,GAAL,CAAUpH,MAAMC,OAAN,GAAgB0vF,cAA1B,CAAnB;AACA,KAAIvR,OAAO,CAAE,CAAF,EAAK,CAAL,CAAX;AAAA,KAAqBC,QAAQ,EAA7B;AAAA,KAAiCtpC,KAAjC;AAAA,KAAwCC,KAAxC;AACA,KAAIjV,GAAJ;AAAA,KAASgN,OAAO,CAAE,GAAF,EAAO,GAAP,EAAY,GAAZ,CAAhB;;AAEA;;AAEA,KAAIF,SAAJ;;AAEA,KAAKvsB,SAASG,gBAAd,EAAiC;;AAEhCosB,cAAY,IAAIpL,QAAJ,EAAZ;AACAoL,YAAU9J,kBAAV,CAA8BziB,QAA9B;AAEA,EALD,MAKO;;AAENusB,cAAYvsB,SAAS9c,KAAT,EAAZ;AAEA;;AAEDqpC,WAAU7G,aAAV;AACA6G,WAAUjJ,kBAAV;;AAEA,KAAIisD,iBAAiBhjD,UAAUrsB,QAA/B;AACA,KAAImhB,QAAQkL,UAAUlL,KAAtB;;AAEA;;AAEA,MAAM,IAAI3qC,IAAI,CAAR,EAAWC,IAAI0qC,MAAMhsC,MAA3B,EAAmCqB,IAAIC,CAAvC,EAA0CD,GAA1C,EAAiD;;AAEhD,MAAI2rC,OAAOhB,MAAO3qC,CAAP,CAAX;;AAEA,OAAM,IAAIirB,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9B8yB,WAAQpS,KAAMoK,KAAM9qB,CAAN,CAAN,CAAR;AACA+yB,WAAQrS,KAAMoK,KAAM,CAAE9qB,IAAI,CAAN,IAAY,CAAlB,CAAN,CAAR;AACAm8D,QAAM,CAAN,IAAY9pF,KAAKwM,GAAL,CAAUi0C,KAAV,EAAiBC,KAAjB,CAAZ;AACAopC,QAAM,CAAN,IAAY9pF,KAAKyM,GAAL,CAAUg0C,KAAV,EAAiBC,KAAjB,CAAZ;;AAEAjV,SAAMq+C,KAAM,CAAN,IAAY,GAAZ,GAAkBA,KAAM,CAAN,CAAxB;;AAEA,OAAKC,MAAOt+C,GAAP,MAAiB1rC,SAAtB,EAAkC;;AAEjCgqF,UAAOt+C,GAAP,IAAe,EAAE8I,QAAQu1C,KAAM,CAAN,CAAV,EAAqBt1C,QAAQs1C,KAAM,CAAN,CAA7B,EAAwC0R,OAAO94F,CAA/C,EAAkD+4F,OAAO17F,SAAzD,EAAf;AAEA,IAJD,MAIO;;AAENgqF,UAAOt+C,GAAP,EAAagwD,KAAb,GAAqB/4F,CAArB;AAEA;AAED;AAED;;AAED;;AAEA,MAAM+oC,GAAN,IAAas+C,KAAb,EAAqB;;AAEpB,MAAIv5E,IAAIu5E,MAAOt+C,GAAP,CAAR;;AAEA;;AAEA,MAAKj7B,EAAEirF,KAAF,KAAY17F,SAAZ,IAAyBstC,MAAO78B,EAAEgrF,KAAT,EAAiB73E,MAAjB,CAAwB1S,GAAxB,CAA6Bo8B,MAAO78B,EAAEirF,KAAT,EAAiB93E,MAA9C,KAA0D23E,YAAxF,EAAuG;;AAEtG,OAAIltD,SAASmtD,eAAgB/qF,EAAE+jC,MAAlB,CAAb;AACAroB,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEAu5B,YAASmtD,eAAgB/qF,EAAEgkC,MAAlB,CAAT;AACAtoB,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;AAEA;AAED;;AAED;;AAEA,MAAKiiC,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AAEA;;AAEDkvE,cAAc36F,SAAd,GAA0BC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAA1B;AACA26F,cAAc36F,SAAd,CAAwB0O,WAAxB,GAAsCisF,aAAtC;;AAEA;;;;;AAKA;;AAEA,SAASM,gBAAT,CAA2BC,SAA3B,EAAsCC,YAAtC,EAAoDr0E,MAApD,EAA4DglE,cAA5D,EAA4E1zC,cAA5E,EAA4FgjD,SAA5F,EAAuGtC,UAAvG,EAAmHC,WAAnH,EAAiI;;AAEhIrsD,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,kBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBywD,aAAWA,SADM;AAEjBC,gBAAcA,YAFG;AAGjBr0E,UAAQA,MAHS;AAIjBglE,kBAAgBA,cAJC;AAKjB1zC,kBAAgBA,cALC;AAMjBgjD,aAAWA,SANM;AAOjBtC,cAAYA,UAPK;AAQjBC,eAAaA;AARI,EAAlB;;AAWA,MAAK/qD,kBAAL,CAAyB,IAAIqtD,sBAAJ,CAA4BH,SAA5B,EAAuCC,YAAvC,EAAqDr0E,MAArD,EAA6DglE,cAA7D,EAA6E1zC,cAA7E,EAA6FgjD,SAA7F,EAAwGtC,UAAxG,EAAoHC,WAApH,CAAzB;AACA,MAAK9nD,aAAL;AAEA;;AAEDgqD,iBAAiBj7F,SAAjB,GAA6BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA7B;AACAi7F,iBAAiBj7F,SAAjB,CAA2B0O,WAA3B,GAAyCusF,gBAAzC;;AAEA;;AAEA,SAASI,sBAAT,CAAiCH,SAAjC,EAA4CC,YAA5C,EAA0Dr0E,MAA1D,EAAkEglE,cAAlE,EAAkF1zC,cAAlF,EAAkGgjD,SAAlG,EAA6GtC,UAA7G,EAAyHC,WAAzH,EAAuI;;AAEtI/iD,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,wBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBywD,aAAWA,SADM;AAEjBC,gBAAcA,YAFG;AAGjBr0E,UAAQA,MAHS;AAIjBglE,kBAAgBA,cAJC;AAKjB1zC,kBAAgBA,cALC;AAMjBgjD,aAAWA,SANM;AAOjBtC,cAAYA,UAPK;AAQjBC,eAAaA;AARI,EAAlB;;AAWA,KAAI3tE,QAAQ,IAAZ;;AAEA8vE,aAAYA,cAAc57F,SAAd,GAA0B47F,SAA1B,GAAsC,CAAlD;AACAC,gBAAeA,iBAAiB77F,SAAjB,GAA6B67F,YAA7B,GAA4C,CAA3D;AACAr0E,UAASA,UAAU,CAAnB;;AAEAglE,kBAAiBvsF,KAAKK,KAAL,CAAYksF,cAAZ,KAAgC,CAAjD;AACA1zC,kBAAiB74C,KAAKK,KAAL,CAAYw4C,cAAZ,KAAgC,CAAjD;;AAEAgjD,aAAYA,cAAc97F,SAAd,GAA0B87F,SAA1B,GAAsC,KAAlD;AACAtC,cAAaA,eAAex5F,SAAf,GAA2Bw5F,UAA3B,GAAwC,GAArD;AACAC,eAAcA,gBAAgBz5F,SAAhB,GAA4By5F,WAA5B,GAA0Cx5F,KAAK4L,EAAL,GAAU,CAAlE;;AAEA;;AAEA,KAAI8iC,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;;AAEA;;AAEA,KAAI1tC,QAAQ,CAAZ;AACA,KAAI46F,aAAa,EAAjB;AACA,KAAI9+B,aAAa11C,SAAS,CAA1B;AACA,KAAI0xB,aAAa,CAAjB;;AAEA;;AAEA+iD;;AAEA,KAAKH,cAAc,KAAnB,EAA2B;;AAE1B,MAAKF,YAAY,CAAjB,EAAqBM,YAAa,IAAb;AACrB,MAAKL,eAAe,CAApB,EAAwBK,YAAa,KAAb;AAExB;;AAED;;AAEA,MAAKplD,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;;AAEA,UAASmtD,aAAT,GAAyB;;AAExB,MAAIz7F,CAAJ,EAAO4M,CAAP;AACA,MAAIwW,SAAS,IAAI5O,OAAJ,EAAb;AACA,MAAIq5B,SAAS,IAAIr5B,OAAJ,EAAb;;AAEA,MAAIglC,aAAa,CAAjB;;AAEA;AACA,MAAImiD,QAAQ,CAAEN,eAAeD,SAAjB,IAA+Bp0E,MAA3C;;AAEA;;AAEA,OAAMpa,IAAI,CAAV,EAAaA,KAAK0rC,cAAlB,EAAkC1rC,GAAlC,EAAyC;;AAExC,OAAIgvF,WAAW,EAAf;;AAEA,OAAI9sF,IAAIlC,IAAI0rC,cAAZ;;AAEA;;AAEA,OAAI30B,SAAS7U,KAAMusF,eAAeD,SAArB,IAAmCA,SAAhD;;AAEA,QAAMp7F,IAAI,CAAV,EAAaA,KAAKgsF,cAAlB,EAAkChsF,GAAlC,EAAyC;;AAExC,QAAIi6B,IAAIj6B,IAAIgsF,cAAZ;;AAEA,QAAI9xE,QAAQ+f,IAAIg/D,WAAJ,GAAkBD,UAA9B;;AAEA,QAAI6C,WAAWp8F,KAAK+S,GAAL,CAAU0H,KAAV,CAAf;AACA,QAAI4hF,WAAWr8F,KAAK8S,GAAL,CAAU2H,KAAV,CAAf;;AAEA;;AAEA2zB,WAAO7tC,CAAP,GAAW2jB,SAASk4E,QAApB;AACAhuD,WAAOjhC,CAAP,GAAW,CAAEkC,CAAF,GAAMkY,MAAN,GAAe01C,UAA1B;AACA7uB,WAAOv5B,CAAP,GAAWqP,SAASm4E,QAApB;AACAnwE,aAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEA;;AAEA8O,WAAOlV,GAAP,CAAY2tF,QAAZ,EAAsBF,KAAtB,EAA6BG,QAA7B,EAAwC/qF,SAAxC;AACAs9B,YAAQ3sC,IAAR,CAAc0hB,OAAOpjB,CAArB,EAAwBojB,OAAOxW,CAA/B,EAAkCwW,OAAO9O,CAAzC;;AAEA;;AAEAg6B,QAAI5sC,IAAJ,CAAUu4B,CAAV,EAAa,IAAInrB,CAAjB;;AAEA;;AAEA8sF,aAASl6F,IAAT,CAAed,OAAf;AAEA;;AAED;;AAEA46F,cAAW95F,IAAX,CAAiBk6F,QAAjB;AAEA;;AAED;;AAEA,OAAM57F,IAAI,CAAV,EAAaA,IAAIgsF,cAAjB,EAAiChsF,GAAjC,EAAwC;;AAEvC,QAAM4M,IAAI,CAAV,EAAaA,IAAI0rC,cAAjB,EAAiC1rC,GAAjC,EAAwC;;AAEvC;;AAEA,QAAI0C,IAAIksF,WAAY5uF,CAAZ,EAAiB5M,CAAjB,CAAR;AACA,QAAIuP,IAAIisF,WAAY5uF,IAAI,CAAhB,EAAqB5M,CAArB,CAAR;AACA,QAAIsS,IAAIkpF,WAAY5uF,IAAI,CAAhB,EAAqB5M,IAAI,CAAzB,CAAR;AACA,QAAI+U,IAAIymF,WAAY5uF,CAAZ,EAAiB5M,IAAI,CAArB,CAAR;;AAEA;;AAEAmuC,YAAQzsC,IAAR,CAAc4N,CAAd,EAAiBC,CAAjB,EAAoBwF,CAApB;AACAo5B,YAAQzsC,IAAR,CAAc6N,CAAd,EAAiB+C,CAAjB,EAAoByC,CAApB;;AAEA;;AAEAykC,kBAAc,CAAd;AAEA;AAED;;AAED;;AAEAluB,QAAMorB,QAAN,CAAgBgC,UAAhB,EAA4Bc,UAA5B,EAAwC,CAAxC;;AAEA;;AAEAd,gBAAcc,UAAd;AAEA;;AAED,UAASkiD,WAAT,CAAsBh/E,GAAtB,EAA4B;;AAE3B,MAAI1c,CAAJ,EAAO+7F,gBAAP,EAAyBC,cAAzB;;AAEA,MAAIl0E,KAAK,IAAI9Z,OAAJ,EAAT;AACA,MAAI6/B,SAAS,IAAIr5B,OAAJ,EAAb;;AAEA,MAAIglC,aAAa,CAAjB;;AAEA,MAAI71B,SAAWjH,QAAQ,IAAV,GAAmB0+E,SAAnB,GAA+BC,YAA5C;AACA,MAAIt7F,OAAS2c,QAAQ,IAAV,GAAmB,CAAnB,GAAuB,CAAE,CAApC;;AAEA;AACAq/E,qBAAmBn7F,KAAnB;;AAEA;AACA;AACA;;AAEA,OAAMZ,IAAI,CAAV,EAAaA,KAAKgsF,cAAlB,EAAkChsF,GAAlC,EAAyC;;AAExC;;AAEA2rB,YAASjqB,IAAT,CAAe,CAAf,EAAkBg7D,aAAa38D,IAA/B,EAAqC,CAArC;;AAEA;;AAEAsuC,WAAQ3sC,IAAR,CAAc,CAAd,EAAiB3B,IAAjB,EAAuB,CAAvB;;AAEA;;AAEAuuC,OAAI5sC,IAAJ,CAAU,GAAV,EAAe,GAAf;;AAEA;;AAEAd;AAEA;;AAED;;AAEAo7F,mBAAiBp7F,KAAjB;;AAEA;;AAEA,OAAMZ,IAAI,CAAV,EAAaA,KAAKgsF,cAAlB,EAAkChsF,GAAlC,EAAyC;;AAExC,OAAIi6B,IAAIj6B,IAAIgsF,cAAZ;AACA,OAAI9xE,QAAQ+f,IAAIg/D,WAAJ,GAAkBD,UAA9B;;AAEA,OAAI8C,WAAWr8F,KAAK8S,GAAL,CAAU2H,KAAV,CAAf;AACA,OAAI2hF,WAAWp8F,KAAK+S,GAAL,CAAU0H,KAAV,CAAf;;AAEA;;AAEA2zB,UAAO7tC,CAAP,GAAW2jB,SAASk4E,QAApB;AACAhuD,UAAOjhC,CAAP,GAAW8vD,aAAa38D,IAAxB;AACA8tC,UAAOv5B,CAAP,GAAWqP,SAASm4E,QAApB;AACAnwE,YAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEA;;AAEA+5B,WAAQ3sC,IAAR,CAAc,CAAd,EAAiB3B,IAAjB,EAAuB,CAAvB;;AAEA;;AAEA+nB,MAAG9nB,CAAH,GAAS87F,WAAW,GAAb,GAAqB,GAA5B;AACAh0E,MAAGlb,CAAH,GAASivF,WAAW,GAAX,GAAiB97F,IAAnB,GAA4B,GAAnC;AACAuuC,OAAI5sC,IAAJ,CAAUomB,GAAG9nB,CAAb,EAAgB8nB,GAAGlb,CAAnB;;AAEA;;AAEAhM;AAEA;;AAED;;AAEA,OAAMZ,IAAI,CAAV,EAAaA,IAAIgsF,cAAjB,EAAiChsF,GAAjC,EAAwC;;AAEvC,OAAIsS,IAAIypF,mBAAmB/7F,CAA3B;AACA,OAAImC,IAAI65F,iBAAiBh8F,CAAzB;;AAEA,OAAK0c,QAAQ,IAAb,EAAoB;;AAEnB;;AAEAyxB,YAAQzsC,IAAR,CAAcS,CAAd,EAAiBA,IAAI,CAArB,EAAwBmQ,CAAxB;AAEA,IAND,MAMO;;AAEN;;AAEA67B,YAAQzsC,IAAR,CAAcS,IAAI,CAAlB,EAAqBA,CAArB,EAAwBmQ,CAAxB;AAEA;;AAEDknC,iBAAc,CAAd;AAEA;;AAED;;AAEAluB,QAAMorB,QAAN,CAAgBgC,UAAhB,EAA4Bc,UAA5B,EAAwC98B,QAAQ,IAAR,GAAe,CAAf,GAAmB,CAA3D;;AAEA;;AAEAg8B,gBAAcc,UAAd;AAEA;AAED;;AAED+hD,uBAAuBr7F,SAAvB,GAAmCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAAnC;AACAq7F,uBAAuBr7F,SAAvB,CAAiC0O,WAAjC,GAA+C2sF,sBAA/C;;AAEA;;;;AAIA;;AAEA,SAASU,YAAT,CAAuBt4E,MAAvB,EAA+BqD,MAA/B,EAAuCglE,cAAvC,EAAuD1zC,cAAvD,EAAuEgjD,SAAvE,EAAkFtC,UAAlF,EAA8FC,WAA9F,EAA4G;;AAE3GkC,kBAAiBj6F,IAAjB,CAAuB,IAAvB,EAA6B,CAA7B,EAAgCyiB,MAAhC,EAAwCqD,MAAxC,EAAgDglE,cAAhD,EAAgE1zC,cAAhE,EAAgFgjD,SAAhF,EAA2FtC,UAA3F,EAAuGC,WAAvG;;AAEA,MAAK53F,IAAL,GAAY,cAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBqD,UAAQA,MAFS;AAGjBglE,kBAAgBA,cAHC;AAIjB1zC,kBAAgBA,cAJC;AAKjBgjD,aAAWA,SALM;AAMjBtC,cAAYA,UANK;AAOjBC,eAAaA;AAPI,EAAlB;AAUA;;AAEDgD,aAAa/7F,SAAb,GAAyBC,OAAOgmB,MAAP,CAAeg1E,iBAAiBj7F,SAAhC,CAAzB;AACA+7F,aAAa/7F,SAAb,CAAuB0O,WAAvB,GAAqCqtF,YAArC;;AAEA;;AAEA,SAASC,kBAAT,CAA6Bv4E,MAA7B,EAAqCqD,MAArC,EAA6CglE,cAA7C,EAA6D1zC,cAA7D,EAA6EgjD,SAA7E,EAAwFtC,UAAxF,EAAoGC,WAApG,EAAkH;;AAEjHsC,wBAAuBr6F,IAAvB,CAA6B,IAA7B,EAAmC,CAAnC,EAAsCyiB,MAAtC,EAA8CqD,MAA9C,EAAsDglE,cAAtD,EAAsE1zC,cAAtE,EAAsFgjD,SAAtF,EAAiGtC,UAAjG,EAA6GC,WAA7G;;AAEA,MAAK53F,IAAL,GAAY,oBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBqD,UAAQA,MAFS;AAGjBglE,kBAAgBA,cAHC;AAIjB1zC,kBAAgBA,cAJC;AAKjBgjD,aAAWA,SALM;AAMjBtC,cAAYA,UANK;AAOjBC,eAAaA;AAPI,EAAlB;AAUA;;AAEDiD,mBAAmBh8F,SAAnB,GAA+BC,OAAOgmB,MAAP,CAAeo1E,uBAAuBr7F,SAAtC,CAA/B;AACAg8F,mBAAmBh8F,SAAnB,CAA6B0O,WAA7B,GAA2CstF,kBAA3C;;AAEA;;;;;;AAMA;;AAEA,SAASC,cAAT,CAAyBx4E,MAAzB,EAAiCq2E,QAAjC,EAA2ChB,UAA3C,EAAuDC,WAAvD,EAAqE;;AAEpErsD,UAAS1rC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,gBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBq2E,YAAUA,QAFO;AAGjBhB,cAAYA,UAHK;AAIjBC,eAAaA;AAJI,EAAlB;;AAOA,MAAK/qD,kBAAL,CAAyB,IAAIkuD,oBAAJ,CAA0Bz4E,MAA1B,EAAkCq2E,QAAlC,EAA4ChB,UAA5C,EAAwDC,WAAxD,CAAzB;AACA,MAAK9nD,aAAL;AAEA;;AAEDgrD,eAAej8F,SAAf,GAA2BC,OAAOgmB,MAAP,CAAeymB,SAAS1sC,SAAxB,CAA3B;AACAi8F,eAAej8F,SAAf,CAAyB0O,WAAzB,GAAuCutF,cAAvC;;AAEA;;AAEA,SAASC,oBAAT,CAA+Bz4E,MAA/B,EAAuCq2E,QAAvC,EAAiDhB,UAAjD,EAA6DC,WAA7D,EAA2E;;AAE1E/iD,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,sBAAZ;;AAEA,MAAKspC,UAAL,GAAkB;AACjBhnB,UAAQA,MADS;AAEjBq2E,YAAUA,QAFO;AAGjBhB,cAAYA,UAHK;AAIjBC,eAAaA;AAJI,EAAlB;;AAOAt1E,UAASA,UAAU,CAAnB;AACAq2E,YAAWA,aAAax6F,SAAb,GAAyBC,KAAKyM,GAAL,CAAU,CAAV,EAAa8tF,QAAb,CAAzB,GAAmD,CAA9D;;AAEAhB,cAAaA,eAAex5F,SAAf,GAA2Bw5F,UAA3B,GAAwC,CAArD;AACAC,eAAcA,gBAAgBz5F,SAAhB,GAA4By5F,WAA5B,GAA0Cx5F,KAAK4L,EAAL,GAAU,CAAlE;;AAEA;;AAEA,KAAI8iC,UAAU,EAAd;AACA,KAAIxiB,WAAW,EAAf;AACA,KAAI0iB,UAAU,EAAd;AACA,KAAIC,MAAM,EAAV;;AAEA;;AAEA,KAAInsC,CAAJ,EAAOkN,CAAP;AACA,KAAIw+B,SAAS,IAAIr5B,OAAJ,EAAb;AACA,KAAIsT,KAAK,IAAI9Z,OAAJ,EAAT;;AAEA;;AAEA2d,UAASjqB,IAAT,CAAe,CAAf,EAAkB,CAAlB,EAAqB,CAArB;AACA2sC,SAAQ3sC,IAAR,CAAc,CAAd,EAAiB,CAAjB,EAAoB,CAApB;AACA4sC,KAAI5sC,IAAJ,CAAU,GAAV,EAAe,GAAf;;AAEA,MAAM2N,IAAI,CAAJ,EAAOlN,IAAI,CAAjB,EAAoBkN,KAAK2qF,QAAzB,EAAmC3qF,KAAMlN,KAAK,CAA9C,EAAkD;;AAEjD,MAAIy3F,UAAUZ,aAAa3pF,IAAI2qF,QAAJ,GAAef,WAA1C;;AAEA;;AAEAprD,SAAO7tC,CAAP,GAAW2jB,SAASlkB,KAAK8S,GAAL,CAAUqnF,OAAV,CAApB;AACA/rD,SAAOjhC,CAAP,GAAW+W,SAASlkB,KAAK+S,GAAL,CAAUonF,OAAV,CAApB;;AAEAjuE,WAASjqB,IAAT,CAAemsC,OAAO7tC,CAAtB,EAAyB6tC,OAAOjhC,CAAhC,EAAmCihC,OAAOv5B,CAA1C;;AAEA;;AAEA+5B,UAAQ3sC,IAAR,CAAc,CAAd,EAAiB,CAAjB,EAAoB,CAApB;;AAEA;;AAEAomB,KAAG9nB,CAAH,GAAO,CAAE2rB,SAAUxpB,CAAV,IAAgBwhB,MAAhB,GAAyB,CAA3B,IAAiC,CAAxC;AACAmE,KAAGlb,CAAH,GAAO,CAAE+e,SAAUxpB,IAAI,CAAd,IAAoBwhB,MAApB,GAA6B,CAA/B,IAAqC,CAA5C;;AAEA2qB,MAAI5sC,IAAJ,CAAUomB,GAAG9nB,CAAb,EAAgB8nB,GAAGlb,CAAnB;AAEA;;AAED;;AAEA,MAAMzK,IAAI,CAAV,EAAaA,KAAK63F,QAAlB,EAA4B73F,GAA5B,EAAmC;;AAElCgsC,UAAQzsC,IAAR,CAAcS,CAAd,EAAiBA,IAAI,CAArB,EAAwB,CAAxB;AAEA;;AAED;;AAEA,MAAKm0C,QAAL,CAAenI,OAAf;AACA,MAAKoI,YAAL,CAAmB,UAAnB,EAA+B,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAA/B;AACA,MAAK4qB,YAAL,CAAmB,QAAnB,EAA6B,IAAIpB,sBAAJ,CAA4B9G,OAA5B,EAAqC,CAArC,CAA7B;AACA,MAAKkI,YAAL,CAAmB,IAAnB,EAAyB,IAAIpB,sBAAJ,CAA4B7G,GAA5B,EAAiC,CAAjC,CAAzB;AAEA;;AAED8tD,qBAAqBl8F,SAArB,GAAiCC,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAAjC;AACAk8F,qBAAqBl8F,SAArB,CAA+B0O,WAA/B,GAA6CwtF,oBAA7C;;AAIA,IAAIC,aAAa,aAAal8F,OAAOm8F,MAAP,CAAc;AAC3ClT,oBAAmBA,iBADwB;AAE3CK,qBAAoBA,kBAFuB;AAG3CI,2BAA0BA,wBAHiB;AAI3CyB,sBAAqBA,mBAJsB;AAK3CC,4BAA2BA,yBALgB;AAM3CC,qBAAoBA,kBANuB;AAO3CC,2BAA0BA,wBAPiB;AAQ3CC,sBAAqBA,mBARsB;AAS3CC,4BAA2BA,yBATgB;AAU3CC,uBAAsBA,oBAVqB;AAW3CC,6BAA4BA,0BAXe;AAY3C5B,qBAAoBA,kBAZuB;AAa3CE,2BAA0BA,wBAbiB;AAc3C2B,eAAcA,YAd6B;AAe3CM,qBAAoBA,kBAfuB;AAgB3CY,oBAAmBA,iBAhBwB;AAiB3CG,0BAAyBA,uBAjBkB;AAkB3CS,gBAAeA,aAlB4B;AAmB3CE,sBAAqBA,mBAnBsB;AAoB3CyK,eAAcA,YApB6B;AAqB3CE,qBAAoBA,kBArBuB;AAsB3CI,iBAAgBA,cAtB2B;AAuB3CK,uBAAsBA,oBAvBqB;AAwB3CI,eAAcA,YAxB6B;AAyB3CK,qBAAoBA,kBAzBuB;AA0B3ClgD,gBAAeA,aA1B4B;AA2B3CC,sBAAqBA,mBA3BsB;AA4B3CqgD,gBAAeA,aA5B4B;AA6B3CE,sBAAqBA,mBA7BsB;AA8B3CK,gBAAeA,aA9B4B;AA+B3CC,sBAAqBA,mBA/BsB;AAgC3C3H,kBAAiBA,eAhC0B;AAiC3CC,wBAAuBA,qBAjCoB;AAkC3CgI,gBAAeA,aAlC4B;AAmC3CoB,eAAcA,YAnC6B;AAoC3CC,qBAAoBA,kBApCuB;AAqC3Cf,mBAAkBA,gBArCyB;AAsC3CI,yBAAwBA,sBAtCmB;AAuC3CY,iBAAgBA,cAvC2B;AAwC3CC,uBAAsBA,oBAxCqB;AAyC3ChkD,cAAaA,WAzC8B;AA0C3CI,oBAAmBA;AA1CwB,CAAd,CAA9B;;AA6CA;;;;;;;;AAQA,SAASkhB,cAAT,CAAyB/uB,UAAzB,EAAsC;;AAErCqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,gBAAZ;;AAEA,MAAKg6B,KAAL,GAAa,IAAIZ,KAAJ,CAAW,QAAX,CAAb;AACA,MAAK2f,WAAL,GAAmB,IAAnB;;AAEA,MAAKwB,SAAL,CAAgBjR,UAAhB;AAEA;;AAED+uB,eAAex5D,SAAf,GAA2BC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAA3B;AACAw5D,eAAex5D,SAAf,CAAyB0O,WAAzB,GAAuC8qD,cAAvC;;AAEAA,eAAex5D,SAAf,CAAyBojF,gBAAzB,GAA4C,IAA5C;;AAEA5pB,eAAex5D,SAAf,CAAyB2O,IAAzB,GAAgC,UAAW9N,MAAX,EAAoB;;AAEnDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKs6B,KAAL,CAAWxsB,IAAX,CAAiB9N,OAAOs6B,KAAxB;;AAEA,QAAO,IAAP;AAEA,CARD;;AAUA;;;;AAIA,SAASkhE,iBAAT,CAA4B5xD,UAA5B,EAAyC;;AAExCmS,gBAAe57C,IAAf,CAAqB,IAArB,EAA2BypC,UAA3B;;AAEA,MAAKtpC,IAAL,GAAY,mBAAZ;AAEA;;AAEDk7F,kBAAkBr8F,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAe22B,eAAe58C,SAA9B,CAA9B;AACAq8F,kBAAkBr8F,SAAlB,CAA4B0O,WAA5B,GAA0C2tF,iBAA1C;;AAEAA,kBAAkBr8F,SAAlB,CAA4Bi2D,mBAA5B,GAAkD,IAAlD;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,SAASkD,oBAAT,CAA+B1uB,UAA/B,EAA4C;;AAE3CqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAK67C,OAAL,GAAe,EAAE,YAAY,EAAd,EAAf;;AAEA,MAAK17C,IAAL,GAAY,sBAAZ;;AAEA,MAAKg6B,KAAL,GAAa,IAAIZ,KAAJ,CAAW,QAAX,CAAb,CAR2C,CAQP;AACpC,MAAKgH,SAAL,GAAiB,GAAjB;AACA,MAAKC,SAAL,GAAiB,GAAjB;;AAEA,MAAK5E,GAAL,GAAW,IAAX;;AAEA,MAAKe,QAAL,GAAgB,IAAhB;AACA,MAAKC,iBAAL,GAAyB,GAAzB;;AAEA,MAAKJ,KAAL,GAAa,IAAb;AACA,MAAKC,cAAL,GAAsB,GAAtB;;AAEA,MAAKyD,QAAL,GAAgB,IAAI3G,KAAJ,CAAW,QAAX,CAAhB;AACA,MAAKuhB,iBAAL,GAAyB,GAAzB;AACA,MAAKhe,WAAL,GAAmB,IAAnB;;AAEA,MAAKE,OAAL,GAAe,IAAf;AACA,MAAKC,SAAL,GAAiB,CAAjB;;AAEA,MAAKE,SAAL,GAAiB,IAAjB;AACA,MAAKC,WAAL,GAAmB,IAAItwB,OAAJ,CAAa,CAAb,EAAgB,CAAhB,CAAnB;;AAEA,MAAKwwB,eAAL,GAAuB,IAAvB;AACA,MAAKC,iBAAL,GAAyB,CAAzB;AACA,MAAKC,gBAAL,GAAwB,CAAxB;;AAEA,MAAKE,YAAL,GAAoB,IAApB;;AAEA,MAAKE,YAAL,GAAoB,IAApB;;AAEA,MAAK9B,QAAL,GAAgB,IAAhB;;AAEA,MAAKI,MAAL,GAAc,IAAd;AACA,MAAKuE,eAAL,GAAuB,GAAvB;;AAEA,MAAKpE,eAAL,GAAuB,IAAvB;;AAEA,MAAK6e,SAAL,GAAiB,KAAjB;AACA,MAAKC,kBAAL,GAA0B,CAA1B;AACA,MAAKC,gBAAL,GAAwB,OAAxB;AACA,MAAKC,iBAAL,GAAyB,OAAzB;;AAEA,MAAKC,QAAL,GAAgB,KAAhB;AACA,MAAKxP,YAAL,GAAoB,KAApB;AACA,MAAKC,YAAL,GAAoB,KAApB;;AAEA,MAAK2O,SAAL,CAAgBjR,UAAhB;AAEA;;AAED0uB,qBAAqBn5D,SAArB,GAAiCC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAAjC;AACAm5D,qBAAqBn5D,SAArB,CAA+B0O,WAA/B,GAA6CyqD,oBAA7C;;AAEAA,qBAAqBn5D,SAArB,CAA+Bm+E,sBAA/B,GAAwD,IAAxD;;AAEAhlB,qBAAqBn5D,SAArB,CAA+B2O,IAA/B,GAAsC,UAAW9N,MAAX,EAAoB;;AAEzDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKg8C,OAAL,GAAe,EAAE,YAAY,EAAd,EAAf;;AAEA,MAAK1hB,KAAL,CAAWxsB,IAAX,CAAiB9N,OAAOs6B,KAAxB;AACA,MAAKoG,SAAL,GAAiB1gC,OAAO0gC,SAAxB;AACA,MAAKC,SAAL,GAAiB3gC,OAAO2gC,SAAxB;;AAEA,MAAK5E,GAAL,GAAW/7B,OAAO+7B,GAAlB;;AAEA,MAAKe,QAAL,GAAgB98B,OAAO88B,QAAvB;AACA,MAAKC,iBAAL,GAAyB/8B,OAAO+8B,iBAAhC;;AAEA,MAAKJ,KAAL,GAAa38B,OAAO28B,KAApB;AACA,MAAKC,cAAL,GAAsB58B,OAAO48B,cAA7B;;AAEA,MAAKyD,QAAL,CAAcvyB,IAAd,CAAoB9N,OAAOqgC,QAA3B;AACA,MAAKpD,WAAL,GAAmBj9B,OAAOi9B,WAA1B;AACA,MAAKge,iBAAL,GAAyBj7C,OAAOi7C,iBAAhC;;AAEA,MAAK9d,OAAL,GAAen9B,OAAOm9B,OAAtB;AACA,MAAKC,SAAL,GAAiBp9B,OAAOo9B,SAAxB;;AAEA,MAAKE,SAAL,GAAiBt9B,OAAOs9B,SAAxB;AACA,MAAKC,WAAL,CAAiBzvB,IAAjB,CAAuB9N,OAAOu9B,WAA9B;;AAEA,MAAKE,eAAL,GAAuBz9B,OAAOy9B,eAA9B;AACA,MAAKC,iBAAL,GAAyB19B,OAAO09B,iBAAhC;AACA,MAAKC,gBAAL,GAAwB39B,OAAO29B,gBAA/B;;AAEA,MAAKE,YAAL,GAAoB79B,OAAO69B,YAA3B;;AAEA,MAAKE,YAAL,GAAoB/9B,OAAO+9B,YAA3B;;AAEA,MAAK9B,QAAL,GAAgBj8B,OAAOi8B,QAAvB;;AAEA,MAAKI,MAAL,GAAcr8B,OAAOq8B,MAArB;AACA,MAAKuE,eAAL,GAAuB5gC,OAAO4gC,eAA9B;;AAEA,MAAKpE,eAAL,GAAuBx8B,OAAOw8B,eAA9B;;AAEA,MAAK6e,SAAL,GAAiBr7C,OAAOq7C,SAAxB;AACA,MAAKC,kBAAL,GAA0Bt7C,OAAOs7C,kBAAjC;AACA,MAAKC,gBAAL,GAAwBv7C,OAAOu7C,gBAA/B;AACA,MAAKC,iBAAL,GAAyBx7C,OAAOw7C,iBAAhC;;AAEA,MAAKC,QAAL,GAAgBz7C,OAAOy7C,QAAvB;AACA,MAAKxP,YAAL,GAAoBjsC,OAAOisC,YAA3B;AACA,MAAKC,YAAL,GAAoBlsC,OAAOksC,YAA3B;;AAEA,QAAO,IAAP;AAEA,CAtDD;;AAwDA;;;;;;;;AAQA,SAASqsB,oBAAT,CAA+B3uB,UAA/B,EAA4C;;AAE3C0uB,sBAAqBn4D,IAArB,CAA2B,IAA3B;;AAEA,MAAK67C,OAAL,GAAe,EAAE,YAAY,EAAd,EAAf;;AAEA,MAAK17C,IAAL,GAAY,sBAAZ;;AAEA,MAAKi8B,YAAL,GAAoB,GAApB,CAR2C,CAQlB;;AAEzB,MAAKoF,SAAL,GAAiB,GAAjB;AACA,MAAKC,kBAAL,GAA0B,GAA1B;;AAEA,MAAKiZ,SAAL,CAAgBjR,UAAhB;AAEA;;AAED2uB,qBAAqBp5D,SAArB,GAAiCC,OAAOgmB,MAAP,CAAekzC,qBAAqBn5D,SAApC,CAAjC;AACAo5D,qBAAqBp5D,SAArB,CAA+B0O,WAA/B,GAA6C0qD,oBAA7C;;AAEAA,qBAAqBp5D,SAArB,CAA+BwiF,sBAA/B,GAAwD,IAAxD;;AAEAppB,qBAAqBp5D,SAArB,CAA+B2O,IAA/B,GAAsC,UAAW9N,MAAX,EAAoB;;AAEzDs4D,sBAAqBn5D,SAArB,CAA+B2O,IAA/B,CAAoC3N,IAApC,CAA0C,IAA1C,EAAgDH,MAAhD;;AAEA,MAAKg8C,OAAL,GAAe,EAAE,YAAY,EAAd,EAAf;;AAEA,MAAKzf,YAAL,GAAoBv8B,OAAOu8B,YAA3B;;AAEA,MAAKoF,SAAL,GAAiB3hC,OAAO2hC,SAAxB;AACA,MAAKC,kBAAL,GAA0B5hC,OAAO4hC,kBAAjC;;AAEA,QAAO,IAAP;AAEA,CAbD;;AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,SAASw2B,iBAAT,CAA4BxuB,UAA5B,EAAyC;;AAExCqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,mBAAZ;;AAEA,MAAKg6B,KAAL,GAAa,IAAIZ,KAAJ,CAAW,QAAX,CAAb,CANwC,CAMJ;AACpC,MAAK6G,QAAL,GAAgB,IAAI7G,KAAJ,CAAW,QAAX,CAAhB;AACA,MAAK8G,SAAL,GAAiB,EAAjB;;AAEA,MAAKzE,GAAL,GAAW,IAAX;;AAEA,MAAKe,QAAL,GAAgB,IAAhB;AACA,MAAKC,iBAAL,GAAyB,GAAzB;;AAEA,MAAKJ,KAAL,GAAa,IAAb;AACA,MAAKC,cAAL,GAAsB,GAAtB;;AAEA,MAAKyD,QAAL,GAAgB,IAAI3G,KAAJ,CAAW,QAAX,CAAhB;AACA,MAAKuhB,iBAAL,GAAyB,GAAzB;AACA,MAAKhe,WAAL,GAAmB,IAAnB;;AAEA,MAAKE,OAAL,GAAe,IAAf;AACA,MAAKC,SAAL,GAAiB,CAAjB;;AAEA,MAAKE,SAAL,GAAiB,IAAjB;AACA,MAAKC,WAAL,GAAmB,IAAItwB,OAAJ,CAAa,CAAb,EAAgB,CAAhB,CAAnB;;AAEA,MAAKwwB,eAAL,GAAuB,IAAvB;AACA,MAAKC,iBAAL,GAAyB,CAAzB;AACA,MAAKC,gBAAL,GAAwB,CAAxB;;AAEA,MAAKxB,WAAL,GAAmB,IAAnB;;AAEA,MAAKF,QAAL,GAAgB,IAAhB;;AAEA,MAAKI,MAAL,GAAc,IAAd;AACA,MAAKwf,OAAL,GAAen3C,iBAAf;AACA,MAAK63B,YAAL,GAAoB,CAApB;AACA,MAAKC,eAAL,GAAuB,IAAvB;;AAEA,MAAK6e,SAAL,GAAiB,KAAjB;AACA,MAAKC,kBAAL,GAA0B,CAA1B;AACA,MAAKC,gBAAL,GAAwB,OAAxB;AACA,MAAKC,iBAAL,GAAyB,OAAzB;;AAEA,MAAKC,QAAL,GAAgB,KAAhB;AACA,MAAKxP,YAAL,GAAoB,KAApB;AACA,MAAKC,YAAL,GAAoB,KAApB;;AAEA,MAAK2O,SAAL,CAAgBjR,UAAhB;AAEA;;AAEDwuB,kBAAkBj5D,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAA9B;AACAi5D,kBAAkBj5D,SAAlB,CAA4B0O,WAA5B,GAA0CuqD,iBAA1C;;AAEAA,kBAAkBj5D,SAAlB,CAA4Bk+E,mBAA5B,GAAkD,IAAlD;;AAEAjlB,kBAAkBj5D,SAAlB,CAA4B2O,IAA5B,GAAmC,UAAW9N,MAAX,EAAoB;;AAEtDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKs6B,KAAL,CAAWxsB,IAAX,CAAiB9N,OAAOs6B,KAAxB;AACA,MAAKiG,QAAL,CAAczyB,IAAd,CAAoB9N,OAAOugC,QAA3B;AACA,MAAKC,SAAL,GAAiBxgC,OAAOwgC,SAAxB;;AAEA,MAAKzE,GAAL,GAAW/7B,OAAO+7B,GAAlB;;AAEA,MAAKe,QAAL,GAAgB98B,OAAO88B,QAAvB;AACA,MAAKC,iBAAL,GAAyB/8B,OAAO+8B,iBAAhC;;AAEA,MAAKJ,KAAL,GAAa38B,OAAO28B,KAApB;AACA,MAAKC,cAAL,GAAsB58B,OAAO48B,cAA7B;;AAEA,MAAKyD,QAAL,CAAcvyB,IAAd,CAAoB9N,OAAOqgC,QAA3B;AACA,MAAKpD,WAAL,GAAmBj9B,OAAOi9B,WAA1B;AACA,MAAKge,iBAAL,GAAyBj7C,OAAOi7C,iBAAhC;;AAEA,MAAK9d,OAAL,GAAen9B,OAAOm9B,OAAtB;AACA,MAAKC,SAAL,GAAiBp9B,OAAOo9B,SAAxB;;AAEA,MAAKE,SAAL,GAAiBt9B,OAAOs9B,SAAxB;AACA,MAAKC,WAAL,CAAiBzvB,IAAjB,CAAuB9N,OAAOu9B,WAA9B;;AAEA,MAAKE,eAAL,GAAuBz9B,OAAOy9B,eAA9B;AACA,MAAKC,iBAAL,GAAyB19B,OAAO09B,iBAAhC;AACA,MAAKC,gBAAL,GAAwB39B,OAAO29B,gBAA/B;;AAEA,MAAKxB,WAAL,GAAmBn8B,OAAOm8B,WAA1B;;AAEA,MAAKF,QAAL,GAAgBj8B,OAAOi8B,QAAvB;;AAEA,MAAKI,MAAL,GAAcr8B,OAAOq8B,MAArB;AACA,MAAKwf,OAAL,GAAe77C,OAAO67C,OAAtB;AACA,MAAKtf,YAAL,GAAoBv8B,OAAOu8B,YAA3B;AACA,MAAKC,eAAL,GAAuBx8B,OAAOw8B,eAA9B;;AAEA,MAAK6e,SAAL,GAAiBr7C,OAAOq7C,SAAxB;AACA,MAAKC,kBAAL,GAA0Bt7C,OAAOs7C,kBAAjC;AACA,MAAKC,gBAAL,GAAwBv7C,OAAOu7C,gBAA/B;AACA,MAAKC,iBAAL,GAAyBx7C,OAAOw7C,iBAAhC;;AAEA,MAAKC,QAAL,GAAgBz7C,OAAOy7C,QAAvB;AACA,MAAKxP,YAAL,GAAoBjsC,OAAOisC,YAA3B;AACA,MAAKC,YAAL,GAAoBlsC,OAAOksC,YAA3B;;AAEA,QAAO,IAAP;AAEA,CAlDD;;AAoDA;;;;;;;;AAQA,SAASmsB,gBAAT,CAA2BzuB,UAA3B,EAAwC;;AAEvCwuB,mBAAkBj4D,IAAlB,CAAwB,IAAxB;;AAEA,MAAK67C,OAAL,GAAe,EAAE,QAAQ,EAAV,EAAf;;AAEA,MAAK17C,IAAL,GAAY,kBAAZ;;AAEA,MAAK29B,WAAL,GAAmB,IAAnB;;AAEA,MAAK4c,SAAL,CAAgBjR,UAAhB;AAEA;;AAEDyuB,iBAAiBl5D,SAAjB,GAA6BC,OAAOgmB,MAAP,CAAegzC,kBAAkBj5D,SAAjC,CAA7B;AACAk5D,iBAAiBl5D,SAAjB,CAA2B0O,WAA3B,GAAyCwqD,gBAAzC;;AAEAA,iBAAiBl5D,SAAjB,CAA2BqiF,kBAA3B,GAAgD,IAAhD;;AAEAnpB,iBAAiBl5D,SAAjB,CAA2B2O,IAA3B,GAAkC,UAAW9N,MAAX,EAAoB;;AAErDo4D,mBAAkBj5D,SAAlB,CAA4B2O,IAA5B,CAAiC3N,IAAjC,CAAuC,IAAvC,EAA6CH,MAA7C;;AAEA,MAAKi+B,WAAL,GAAmBj+B,OAAOi+B,WAA1B;;AAEA,QAAO,IAAP;AAEA,CARD;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAASi6B,kBAAT,CAA6BtuB,UAA7B,EAA0C;;AAEzCqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,oBAAZ;;AAEA,MAAK68B,OAAL,GAAe,IAAf;AACA,MAAKC,SAAL,GAAiB,CAAjB;;AAEA,MAAKE,SAAL,GAAiB,IAAjB;AACA,MAAKC,WAAL,GAAmB,IAAItwB,OAAJ,CAAa,CAAb,EAAgB,CAAhB,CAAnB;;AAEA,MAAKwwB,eAAL,GAAuB,IAAvB;AACA,MAAKC,iBAAL,GAAyB,CAAzB;AACA,MAAKC,gBAAL,GAAwB,CAAxB;;AAEA,MAAK0d,SAAL,GAAiB,KAAjB;AACA,MAAKC,kBAAL,GAA0B,CAA1B;;AAEA,MAAKpd,GAAL,GAAW,KAAX;AACA,MAAKK,MAAL,GAAc,KAAd;;AAEA,MAAKkd,QAAL,GAAgB,KAAhB;AACA,MAAKxP,YAAL,GAAoB,KAApB;AACA,MAAKC,YAAL,GAAoB,KAApB;;AAEA,MAAK2O,SAAL,CAAgBjR,UAAhB;AAEA;;AAEDsuB,mBAAmB/4D,SAAnB,GAA+BC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAA/B;AACA+4D,mBAAmB/4D,SAAnB,CAA6B0O,WAA7B,GAA2CqqD,kBAA3C;;AAEAA,mBAAmB/4D,SAAnB,CAA6Bo+E,oBAA7B,GAAoD,IAApD;;AAEArlB,mBAAmB/4D,SAAnB,CAA6B2O,IAA7B,GAAoC,UAAW9N,MAAX,EAAoB;;AAEvDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKm9B,OAAL,GAAen9B,OAAOm9B,OAAtB;AACA,MAAKC,SAAL,GAAiBp9B,OAAOo9B,SAAxB;;AAEA,MAAKE,SAAL,GAAiBt9B,OAAOs9B,SAAxB;AACA,MAAKC,WAAL,CAAiBzvB,IAAjB,CAAuB9N,OAAOu9B,WAA9B;;AAEA,MAAKE,eAAL,GAAuBz9B,OAAOy9B,eAA9B;AACA,MAAKC,iBAAL,GAAyB19B,OAAO09B,iBAAhC;AACA,MAAKC,gBAAL,GAAwB39B,OAAO29B,gBAA/B;;AAEA,MAAK0d,SAAL,GAAiBr7C,OAAOq7C,SAAxB;AACA,MAAKC,kBAAL,GAA0Bt7C,OAAOs7C,kBAAjC;;AAEA,MAAKG,QAAL,GAAgBz7C,OAAOy7C,QAAvB;AACA,MAAKxP,YAAL,GAAoBjsC,OAAOisC,YAA3B;AACA,MAAKC,YAAL,GAAoBlsC,OAAOksC,YAA3B;;AAEA,QAAO,IAAP;AAEA,CAvBD;;AAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,SAASisB,mBAAT,CAA8BvuB,UAA9B,EAA2C;;AAE1CqP,UAAS94C,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,qBAAZ;;AAEA,MAAKg6B,KAAL,GAAa,IAAIZ,KAAJ,CAAW,QAAX,CAAb,CAN0C,CAMN;;AAEpC,MAAKqC,GAAL,GAAW,IAAX;;AAEA,MAAKe,QAAL,GAAgB,IAAhB;AACA,MAAKC,iBAAL,GAAyB,GAAzB;;AAEA,MAAKJ,KAAL,GAAa,IAAb;AACA,MAAKC,cAAL,GAAsB,GAAtB;;AAEA,MAAKyD,QAAL,GAAgB,IAAI3G,KAAJ,CAAW,QAAX,CAAhB;AACA,MAAKuhB,iBAAL,GAAyB,GAAzB;AACA,MAAKhe,WAAL,GAAmB,IAAnB;;AAEA,MAAKd,WAAL,GAAmB,IAAnB;;AAEA,MAAKF,QAAL,GAAgB,IAAhB;;AAEA,MAAKI,MAAL,GAAc,IAAd;AACA,MAAKwf,OAAL,GAAen3C,iBAAf;AACA,MAAK63B,YAAL,GAAoB,CAApB;AACA,MAAKC,eAAL,GAAuB,IAAvB;;AAEA,MAAK6e,SAAL,GAAiB,KAAjB;AACA,MAAKC,kBAAL,GAA0B,CAA1B;AACA,MAAKC,gBAAL,GAAwB,OAAxB;AACA,MAAKC,iBAAL,GAAyB,OAAzB;;AAEA,MAAKC,QAAL,GAAgB,KAAhB;AACA,MAAKxP,YAAL,GAAoB,KAApB;AACA,MAAKC,YAAL,GAAoB,KAApB;;AAEA,MAAK2O,SAAL,CAAgBjR,UAAhB;AAEA;;AAEDuuB,oBAAoBh5D,SAApB,GAAgCC,OAAOgmB,MAAP,CAAe6zB,SAAS95C,SAAxB,CAAhC;AACAg5D,oBAAoBh5D,SAApB,CAA8B0O,WAA9B,GAA4CsqD,mBAA5C;;AAEAA,oBAAoBh5D,SAApB,CAA8B6hF,qBAA9B,GAAsD,IAAtD;;AAEA7oB,oBAAoBh5D,SAApB,CAA8B2O,IAA9B,GAAqC,UAAW9N,MAAX,EAAoB;;AAExDi5C,UAAS95C,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,MAAKs6B,KAAL,CAAWxsB,IAAX,CAAiB9N,OAAOs6B,KAAxB;;AAEA,MAAKyB,GAAL,GAAW/7B,OAAO+7B,GAAlB;;AAEA,MAAKe,QAAL,GAAgB98B,OAAO88B,QAAvB;AACA,MAAKC,iBAAL,GAAyB/8B,OAAO+8B,iBAAhC;;AAEA,MAAKJ,KAAL,GAAa38B,OAAO28B,KAApB;AACA,MAAKC,cAAL,GAAsB58B,OAAO48B,cAA7B;;AAEA,MAAKyD,QAAL,CAAcvyB,IAAd,CAAoB9N,OAAOqgC,QAA3B;AACA,MAAKpD,WAAL,GAAmBj9B,OAAOi9B,WAA1B;AACA,MAAKge,iBAAL,GAAyBj7C,OAAOi7C,iBAAhC;;AAEA,MAAK9e,WAAL,GAAmBn8B,OAAOm8B,WAA1B;;AAEA,MAAKF,QAAL,GAAgBj8B,OAAOi8B,QAAvB;;AAEA,MAAKI,MAAL,GAAcr8B,OAAOq8B,MAArB;AACA,MAAKwf,OAAL,GAAe77C,OAAO67C,OAAtB;AACA,MAAKtf,YAAL,GAAoBv8B,OAAOu8B,YAA3B;AACA,MAAKC,eAAL,GAAuBx8B,OAAOw8B,eAA9B;;AAEA,MAAK6e,SAAL,GAAiBr7C,OAAOq7C,SAAxB;AACA,MAAKC,kBAAL,GAA0Bt7C,OAAOs7C,kBAAjC;AACA,MAAKC,gBAAL,GAAwBv7C,OAAOu7C,gBAA/B;AACA,MAAKC,iBAAL,GAAyBx7C,OAAOw7C,iBAAhC;;AAEA,MAAKC,QAAL,GAAgBz7C,OAAOy7C,QAAvB;AACA,MAAKxP,YAAL,GAAoBjsC,OAAOisC,YAA3B;AACA,MAAKC,YAAL,GAAoBlsC,OAAOksC,YAA3B;;AAEA,QAAO,IAAP;AAEA,CAtCD;;AAwCA;;;;;;;;;;;;;;;AAeA,SAASusB,kBAAT,CAA6B7uB,UAA7B,EAA0C;;AAEzC4uB,mBAAkBr4D,IAAlB,CAAwB,IAAxB;;AAEA,MAAKG,IAAL,GAAY,oBAAZ;;AAEA,MAAKsY,KAAL,GAAa,CAAb;AACA,MAAKkoB,QAAL,GAAgB,CAAhB;AACA,MAAKsa,OAAL,GAAe,CAAf;;AAEA,MAAKP,SAAL,CAAgBjR,UAAhB;AAEA;;AAED6uB,mBAAmBt5D,SAAnB,GAA+BC,OAAOgmB,MAAP,CAAeozC,kBAAkBr5D,SAAjC,CAA/B;AACAs5D,mBAAmBt5D,SAAnB,CAA6B0O,WAA7B,GAA2C4qD,kBAA3C;;AAEAA,mBAAmBt5D,SAAnB,CAA6BgjF,oBAA7B,GAAoD,IAApD;;AAEA1pB,mBAAmBt5D,SAAnB,CAA6B2O,IAA7B,GAAoC,UAAW9N,MAAX,EAAoB;;AAEvDw4D,mBAAkBr5D,SAAlB,CAA4B2O,IAA5B,CAAiC3N,IAAjC,CAAuC,IAAvC,EAA6CH,MAA7C;;AAEA,MAAK4Y,KAAL,GAAa5Y,OAAO4Y,KAApB;AACA,MAAKkoB,QAAL,GAAgB9gC,OAAO8gC,QAAvB;AACA,MAAKsa,OAAL,GAAep7C,OAAOo7C,OAAtB;;AAEA,QAAO,IAAP;AAEA,CAVD;;AAcA,IAAIqgD,YAAY,aAAar8F,OAAOm8F,MAAP,CAAc;AAC1C5iC,iBAAgBA,cAD0B;AAE1CurB,iBAAgBA,cAF0B;AAG1CsX,oBAAmBA,iBAHuB;AAI1Cz/C,iBAAgBA,cAJ0B;AAK1C2c,iBAAgBA,cAL0B;AAM1CH,uBAAsBA,oBANoB;AAO1CD,uBAAsBA,oBAPoB;AAQ1CF,oBAAmBA,iBARuB;AAS1CC,mBAAkBA,gBATwB;AAU1CH,qBAAoBA,kBAVsB;AAW1CC,sBAAqBA,mBAXqB;AAY1CH,oBAAmBA,iBAZuB;AAa1CC,uBAAsBA,oBAboB;AAc1Crc,oBAAmBA,iBAduB;AAe1C6c,qBAAoBA,kBAfsB;AAgB1CD,oBAAmBA,iBAhBuB;AAiB1Cvf,WAAUA;AAjBgC,CAAd,CAA7B;;AAoBA;;;;AAIA,IAAIyiD,QAAQ;;AAEX1wD,UAAS,KAFE;;AAIX2wD,QAAO,EAJI;;AAMX3tF,MAAK,UAAWm8B,GAAX,EAAgByxD,IAAhB,EAAuB;;AAE3B,MAAK,KAAK5wD,OAAL,KAAiB,KAAtB,EAA8B;;AAE9B;;AAEA,OAAK2wD,KAAL,CAAYxxD,GAAZ,IAAoByxD,IAApB;AAEA,EAdU;;AAgBXt8F,MAAK,UAAW6qC,GAAX,EAAiB;;AAErB,MAAK,KAAKa,OAAL,KAAiB,KAAtB,EAA8B;;AAE9B;;AAEA,SAAO,KAAK2wD,KAAL,CAAYxxD,GAAZ,CAAP;AAEA,EAxBU;;AA0BXxF,SAAQ,UAAWwF,GAAX,EAAiB;;AAExB,SAAO,KAAKwxD,KAAL,CAAYxxD,GAAZ,CAAP;AAEA,EA9BU;;AAgCXya,QAAO,YAAY;;AAElB,OAAK+2C,KAAL,GAAa,EAAb;AAEA;;AApCU,CAAZ;;AAwCA;;;;AAIA,SAASE,cAAT,CAAyBC,MAAzB,EAAiCC,UAAjC,EAA6CC,OAA7C,EAAuD;;AAEtD,KAAIzxE,QAAQ,IAAZ;;AAEA,KAAI0xE,YAAY,KAAhB;AACA,KAAIC,cAAc,CAAlB;AACA,KAAIC,aAAa,CAAjB;AACA,KAAIC,cAAc39F,SAAlB;;AAEA,MAAK49F,OAAL,GAAe59F,SAAf;AACA,MAAKq9F,MAAL,GAAcA,MAAd;AACA,MAAKC,UAAL,GAAkBA,UAAlB;AACA,MAAKC,OAAL,GAAeA,OAAf;;AAEA,MAAKM,SAAL,GAAiB,UAAW11E,GAAX,EAAiB;;AAEjCu1E;;AAEA,MAAKF,cAAc,KAAnB,EAA2B;;AAE1B,OAAK1xE,MAAM8xE,OAAN,KAAkB59F,SAAvB,EAAmC;;AAElC8rB,UAAM8xE,OAAN,CAAez1E,GAAf,EAAoBs1E,WAApB,EAAiCC,UAAjC;AAEA;AAED;;AAEDF,cAAY,IAAZ;AAEA,EAhBD;;AAkBA,MAAKM,OAAL,GAAe,UAAW31E,GAAX,EAAiB;;AAE/Bs1E;;AAEA,MAAK3xE,MAAMwxE,UAAN,KAAqBt9F,SAA1B,EAAsC;;AAErC8rB,SAAMwxE,UAAN,CAAkBn1E,GAAlB,EAAuBs1E,WAAvB,EAAoCC,UAApC;AAEA;;AAED,MAAKD,gBAAgBC,UAArB,EAAkC;;AAEjCF,eAAY,KAAZ;;AAEA,OAAK1xE,MAAMuxE,MAAN,KAAiBr9F,SAAtB,EAAkC;;AAEjC8rB,UAAMuxE,MAAN;AAEA;AAED;AAED,EAtBD;;AAwBA,MAAKU,SAAL,GAAiB,UAAW51E,GAAX,EAAiB;;AAEjC,MAAK2D,MAAMyxE,OAAN,KAAkBv9F,SAAvB,EAAmC;;AAElC8rB,SAAMyxE,OAAN,CAAep1E,GAAf;AAEA;AAED,EARD;;AAUA,MAAK61E,UAAL,GAAkB,UAAW71E,GAAX,EAAiB;;AAElC,MAAKw1E,WAAL,EAAmB;;AAElB,UAAOA,YAAax1E,GAAb,CAAP;AAEA;;AAED,SAAOA,GAAP;AAEA,EAVD;;AAYA,MAAK81E,cAAL,GAAsB,UAAWC,SAAX,EAAuB;;AAE5CP,gBAAcO,SAAd;AACA,SAAO,IAAP;AAEA,EALD;AAOA;;AAED,IAAIC,wBAAwB,IAAIf,cAAJ,EAA5B;;AAEA;;;;AAIA,IAAIgB,UAAU,EAAd;;AAEA,SAASC,UAAT,CAAqBC,OAArB,EAA+B;;AAE9B,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;AAEA;;AAEDx9F,OAAOK,MAAP,CAAeq9F,WAAW39F,SAA1B,EAAqC;;AAEpC69F,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAKp1E,QAAQnoB,SAAb,EAAyBmoB,MAAM,EAAN;;AAEzB,MAAK,KAAK8pC,IAAL,KAAcjyD,SAAnB,EAA+BmoB,MAAM,KAAK8pC,IAAL,GAAY9pC,GAAlB;;AAE/BA,QAAM,KAAKm2E,OAAL,CAAaN,UAAb,CAAyB71E,GAAzB,CAAN;;AAEA,MAAI2D,QAAQ,IAAZ;;AAEA,MAAI0yE,SAASvB,MAAMp8F,GAAN,CAAWsnB,GAAX,CAAb;;AAEA,MAAKq2E,WAAWx+F,SAAhB,EAA4B;;AAE3B8rB,SAAMwyE,OAAN,CAAcT,SAAd,CAAyB11E,GAAzB;;AAEAs2E,cAAY,YAAY;;AAEvB,QAAKpB,MAAL,EAAcA,OAAQmB,MAAR;;AAEd1yE,UAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AAEA,IAND,EAMG,CANH;;AAQA,UAAOq2E,MAAP;AAEA;;AAED;;AAEA,MAAKJ,QAASj2E,GAAT,MAAmBnoB,SAAxB,EAAoC;;AAEnCo+F,WAASj2E,GAAT,EAAejmB,IAAf,CAAqB;;AAEpBm7F,YAAQA,MAFY;AAGpBC,gBAAYA,UAHQ;AAIpBC,aAASA;;AAJW,IAArB;;AAQA;AAEA;;AAED;AACA,MAAImB,eAAe,6BAAnB;AACA,MAAIC,qBAAqBx2E,IAAIpnB,KAAJ,CAAW29F,YAAX,CAAzB;;AAEA;AACA,MAAKC,kBAAL,EAA0B;;AAEzB,OAAIC,WAAWD,mBAAoB,CAApB,CAAf;AACA,OAAIE,WAAW,CAAC,CAAEF,mBAAoB,CAApB,CAAlB;AACA,OAAI50E,OAAO40E,mBAAoB,CAApB,CAAX;;AAEA50E,UAAO4rD,OAAOmpB,kBAAP,CAA2B/0E,IAA3B,CAAP;;AAEA,OAAK80E,QAAL,EAAgB90E,OAAO4rD,OAAOopB,IAAP,CAAah1E,IAAb,CAAP;;AAEhB,OAAI;;AAEH,QAAIi1E,QAAJ;AACA,QAAIC,eAAe,CAAE,KAAKA,YAAL,IAAqB,EAAvB,EAA4BC,WAA5B,EAAnB;;AAEA,YAASD,YAAT;;AAEC,UAAK,aAAL;AACA,UAAK,MAAL;;AAEC,UAAIhzD,OAAO,IAAIxG,UAAJ,CAAgB1b,KAAKzoB,MAArB,CAAX;;AAEA,WAAM,IAAIqB,IAAI,CAAd,EAAiBA,IAAIonB,KAAKzoB,MAA1B,EAAkCqB,GAAlC,EAAyC;;AAExCspC,YAAMtpC,CAAN,IAAYonB,KAAKo1E,UAAL,CAAiBx8F,CAAjB,CAAZ;AAEA;;AAED,UAAKs8F,iBAAiB,MAAtB,EAA+B;;AAE9BD,kBAAW,IAAII,IAAJ,CAAU,CAAEnzD,KAAKzH,MAAP,CAAV,EAA2B,EAAE3iC,MAAM+8F,QAAR,EAA3B,CAAX;AAEA,OAJD,MAIO;;AAENI,kBAAW/yD,KAAKzH,MAAhB;AAEA;;AAED;;AAED,UAAK,UAAL;;AAEC,UAAI66D,SAAS,IAAIC,SAAJ,EAAb;AACAN,iBAAWK,OAAOE,eAAP,CAAwBx1E,IAAxB,EAA8B60E,QAA9B,CAAX;;AAEA;;AAED,UAAK,MAAL;;AAECI,iBAAWl0D,KAAKc,KAAL,CAAY7hB,IAAZ,CAAX;;AAEA;;AAED;AAAS;;AAERi1E,iBAAWj1E,IAAX;;AAEA;;AA1CF;;AA8CA;AACA4rD,WAAO8oB,UAAP,CAAmB,YAAY;;AAE9B,SAAKpB,MAAL,EAAcA,OAAQ2B,QAAR;;AAEdlzE,WAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AAEA,KAND,EAMG,CANH;AAQA,IA5DD,CA4DE,OAAQjV,KAAR,EAAgB;;AAEjB;AACAyiE,WAAO8oB,UAAP,CAAmB,YAAY;;AAE9B,SAAKlB,OAAL,EAAeA,QAASrqF,KAAT;;AAEf4Y,WAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AACA2D,WAAMwyE,OAAN,CAAcP,SAAd,CAAyB51E,GAAzB;AAEA,KAPD,EAOG,CAPH;AASA;AAED,GApFD,MAoFO;;AAEN;;AAEAi2E,WAASj2E,GAAT,IAAiB,EAAjB;;AAEAi2E,WAASj2E,GAAT,EAAejmB,IAAf,CAAqB;;AAEpBm7F,YAAQA,MAFY;AAGpBC,gBAAYA,UAHQ;AAIpBC,aAASA;;AAJW,IAArB;;AAQA,OAAIiC,UAAU,IAAIC,cAAJ,EAAd;;AAEAD,WAAQE,IAAR,CAAc,KAAd,EAAqBv3E,GAArB,EAA0B,IAA1B;;AAEAq3E,WAAQ59F,gBAAR,CAA0B,MAA1B,EAAkC,UAAWY,KAAX,EAAmB;;AAEpD,QAAIw8F,WAAW,KAAKA,QAApB;;AAEA/B,UAAM1tF,GAAN,CAAW4Y,GAAX,EAAgB62E,QAAhB;;AAEA,QAAIW,YAAYvB,QAASj2E,GAAT,CAAhB;;AAEA,WAAOi2E,QAASj2E,GAAT,CAAP;;AAEA,QAAK,KAAKy3E,MAAL,KAAgB,GAAhB,IAAuB,KAAKA,MAAL,KAAgB,CAA5C,EAAgD;;AAE/C;AACA;;AAEA,SAAK,KAAKA,MAAL,KAAgB,CAArB,EAAyBnwF,QAAQC,IAAR,CAAc,2CAAd;;AAEzB,UAAM,IAAI/M,IAAI,CAAR,EAAWooB,KAAK40E,UAAUr+F,MAAhC,EAAwCqB,IAAIooB,EAA5C,EAAgDpoB,GAAhD,EAAuD;;AAEtD,UAAIif,WAAW+9E,UAAWh9F,CAAX,CAAf;AACA,UAAKif,SAASy7E,MAAd,EAAuBz7E,SAASy7E,MAAT,CAAiB2B,QAAjB;AAEvB;;AAEDlzE,WAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AAEA,KAhBD,MAgBO;;AAEN,UAAM,IAAIxlB,IAAI,CAAR,EAAWooB,KAAK40E,UAAUr+F,MAAhC,EAAwCqB,IAAIooB,EAA5C,EAAgDpoB,GAAhD,EAAuD;;AAEtD,UAAIif,WAAW+9E,UAAWh9F,CAAX,CAAf;AACA,UAAKif,SAAS27E,OAAd,EAAwB37E,SAAS27E,OAAT,CAAkB/6F,KAAlB;AAExB;;AAEDspB,WAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AACA2D,WAAMwyE,OAAN,CAAcP,SAAd,CAAyB51E,GAAzB;AAEA;AAED,IAxCD,EAwCG,KAxCH;;AA0CAq3E,WAAQ59F,gBAAR,CAA0B,UAA1B,EAAsC,UAAWY,KAAX,EAAmB;;AAExD,QAAIm9F,YAAYvB,QAASj2E,GAAT,CAAhB;;AAEA,SAAM,IAAIxlB,IAAI,CAAR,EAAWooB,KAAK40E,UAAUr+F,MAAhC,EAAwCqB,IAAIooB,EAA5C,EAAgDpoB,GAAhD,EAAuD;;AAEtD,SAAIif,WAAW+9E,UAAWh9F,CAAX,CAAf;AACA,SAAKif,SAAS07E,UAAd,EAA2B17E,SAAS07E,UAAT,CAAqB96F,KAArB;AAE3B;AAED,IAXD,EAWG,KAXH;;AAaAg9F,WAAQ59F,gBAAR,CAA0B,OAA1B,EAAmC,UAAWY,KAAX,EAAmB;;AAErD,QAAIm9F,YAAYvB,QAASj2E,GAAT,CAAhB;;AAEA,WAAOi2E,QAASj2E,GAAT,CAAP;;AAEA,SAAM,IAAIxlB,IAAI,CAAR,EAAWooB,KAAK40E,UAAUr+F,MAAhC,EAAwCqB,IAAIooB,EAA5C,EAAgDpoB,GAAhD,EAAuD;;AAEtD,SAAIif,WAAW+9E,UAAWh9F,CAAX,CAAf;AACA,SAAKif,SAAS27E,OAAd,EAAwB37E,SAAS27E,OAAT,CAAkB/6F,KAAlB;AAExB;;AAEDspB,UAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AACA2D,UAAMwyE,OAAN,CAAcP,SAAd,CAAyB51E,GAAzB;AAEA,IAhBD,EAgBG,KAhBH;;AAkBA,OAAK,KAAK82E,YAAL,KAAsBj/F,SAA3B,EAAuCw/F,QAAQP,YAAR,GAAuB,KAAKA,YAA5B;AACvC,OAAK,KAAKY,eAAL,KAAyB7/F,SAA9B,EAA0Cw/F,QAAQK,eAAR,GAA0B,KAAKA,eAA/B;;AAE1C,OAAKL,QAAQM,gBAAb,EAAgCN,QAAQM,gBAAR,CAA0B,KAAKlB,QAAL,KAAkB5+F,SAAlB,GAA8B,KAAK4+F,QAAnC,GAA8C,YAAxE;;AAEhC,QAAM,IAAImB,MAAV,IAAoB,KAAKC,aAAzB,EAAyC;;AAExCR,YAAQS,gBAAR,CAA0BF,MAA1B,EAAkC,KAAKC,aAAL,CAAoBD,MAApB,CAAlC;AAEA;;AAEDP,WAAQU,IAAR,CAAc,IAAd;AAEA;;AAEDp0E,QAAMwyE,OAAN,CAAcT,SAAd,CAAyB11E,GAAzB;;AAEA,SAAOq3E,OAAP;AAEA,EArPmC;;AAuPpCW,UAAS,UAAW//F,KAAX,EAAmB;;AAE3B,OAAK6xD,IAAL,GAAY7xD,KAAZ;AACA,SAAO,IAAP;AAEA,EA5PmC;;AA8PpCggG,kBAAiB,UAAWhgG,KAAX,EAAmB;;AAEnC,OAAK6+F,YAAL,GAAoB7+F,KAApB;AACA,SAAO,IAAP;AAEA,EAnQmC;;AAqQpCigG,qBAAoB,UAAWjgG,KAAX,EAAmB;;AAEtC,OAAKy/F,eAAL,GAAuBz/F,KAAvB;AACA,SAAO,IAAP;AAEA,EA1QmC;;AA4QpCkgG,cAAa,UAAWlgG,KAAX,EAAmB;;AAE/B,OAAKw+F,QAAL,GAAgBx+F,KAAhB;AACA,SAAO,IAAP;AAEA,EAjRmC;;AAmRpC6/F,mBAAkB,UAAW7/F,KAAX,EAAmB;;AAEpC,OAAK4/F,aAAL,GAAqB5/F,KAArB;AACA,SAAO,IAAP;AAEA;;AAxRmC,CAArC;;AA4RA;;;;;;AAMA,SAASmgG,uBAAT,CAAkCjC,OAAlC,EAA4C;;AAE3C,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;;AAEA;AACA,MAAKqC,OAAL,GAAe,IAAf;AAEA;;AAED7/F,OAAOK,MAAP,CAAeu/F,wBAAwB7/F,SAAvC,EAAkD;;AAEjD69F,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAIzxE,QAAQ,IAAZ;;AAEA,MAAI5D,SAAS,EAAb;;AAEA,MAAIkB,UAAU,IAAIsgE,iBAAJ,EAAd;AACAtgE,UAAQ9D,KAAR,GAAgB4C,MAAhB;;AAEA,MAAIu4E,SAAS,IAAIpC,UAAJ,CAAgB,KAAKC,OAArB,CAAb;AACAmC,SAAON,OAAP,CAAgB,KAAKluC,IAArB;AACAwuC,SAAOL,eAAP,CAAwB,aAAxB;;AAEA,WAASM,WAAT,CAAsB/9F,CAAtB,EAA0B;;AAEzB89F,UAAOlC,IAAP,CAAap2E,IAAKxlB,CAAL,CAAb,EAAuB,UAAW6hC,MAAX,EAAoB;;AAE1C,QAAIm8D,WAAW70E,MAAM00E,OAAN,CAAeh8D,MAAf,EAAuB,IAAvB,CAAf;;AAEAtc,WAAQvlB,CAAR,IAAc;AACb4kB,YAAOo5E,SAASp5E,KADH;AAEbC,aAAQm5E,SAASn5E,MAFJ;AAGb5B,aAAQ+6E,SAAS/6E,MAHJ;AAIbK,cAAS06E,SAAS16E;AAJL,KAAd;;AAOA26E,cAAU,CAAV;;AAEA,QAAKA,WAAW,CAAhB,EAAoB;;AAEnB,SAAKD,SAASE,WAAT,KAAyB,CAA9B,EACCz3E,QAAQzD,SAAR,GAAoBpe,YAApB;;AAED6hB,aAAQxD,MAAR,GAAiB+6E,SAAS/6E,MAA1B;AACAwD,aAAQiuB,WAAR,GAAsB,IAAtB;;AAEA,SAAKgmD,MAAL,EAAcA,OAAQj0E,OAAR;AAEd;AAED,IAzBD,EAyBGk0E,UAzBH,EAyBeC,OAzBf;AA2BA;;AAED,MAAKziE,MAAMC,OAAN,CAAe5S,GAAf,CAAL,EAA4B;;AAE3B,OAAIy4E,SAAS,CAAb;;AAEA,QAAM,IAAIj+F,IAAI,CAAR,EAAWooB,KAAK5C,IAAI7mB,MAA1B,EAAkCqB,IAAIooB,EAAtC,EAA0C,EAAGpoB,CAA7C,EAAiD;;AAEhD+9F,gBAAa/9F,CAAb;AAEA;AAED,GAVD,MAUO;;AAEN;;AAEA89F,UAAOlC,IAAP,CAAap2E,GAAb,EAAkB,UAAWqc,MAAX,EAAoB;;AAErC,QAAIm8D,WAAW70E,MAAM00E,OAAN,CAAeh8D,MAAf,EAAuB,IAAvB,CAAf;;AAEA,QAAKm8D,SAASG,SAAd,EAA0B;;AAEzB,SAAIxzD,QAAQqzD,SAAS16E,OAAT,CAAiB3kB,MAAjB,GAA0Bq/F,SAASE,WAA/C;;AAEA,UAAM,IAAIrrF,IAAI,CAAd,EAAiBA,IAAI83B,KAArB,EAA4B93B,GAA5B,EAAmC;;AAElC0S,aAAQ1S,CAAR,IAAc,EAAEyQ,SAAS,EAAX,EAAd;;AAEA,WAAM,IAAItjB,IAAI,CAAd,EAAiBA,IAAIg+F,SAASE,WAA9B,EAA2Cl+F,GAA3C,EAAkD;;AAEjDulB,cAAQ1S,CAAR,EAAYyQ,OAAZ,CAAoB/jB,IAApB,CAA0By+F,SAAS16E,OAAT,CAAkBzQ,IAAImrF,SAASE,WAAb,GAA2Bl+F,CAA7C,CAA1B;AACAulB,cAAQ1S,CAAR,EAAYoQ,MAAZ,GAAqB+6E,SAAS/6E,MAA9B;AACAsC,cAAQ1S,CAAR,EAAY+R,KAAZ,GAAoBo5E,SAASp5E,KAA7B;AACAW,cAAQ1S,CAAR,EAAYgS,MAAZ,GAAqBm5E,SAASn5E,MAA9B;AAEA;AAED;AAED,KAnBD,MAmBO;;AAEN4B,aAAQ9D,KAAR,CAAciC,KAAd,GAAsBo5E,SAASp5E,KAA/B;AACA6B,aAAQ9D,KAAR,CAAckC,MAAd,GAAuBm5E,SAASn5E,MAAhC;AACA4B,aAAQnD,OAAR,GAAkB06E,SAAS16E,OAA3B;AAEA;;AAED,QAAK06E,SAASE,WAAT,KAAyB,CAA9B,EAAkC;;AAEjCz3E,aAAQzD,SAAR,GAAoBpe,YAApB;AAEA;;AAED6hB,YAAQxD,MAAR,GAAiB+6E,SAAS/6E,MAA1B;AACAwD,YAAQiuB,WAAR,GAAsB,IAAtB;;AAEA,QAAKgmD,MAAL,EAAcA,OAAQj0E,OAAR;AAEd,IA1CD,EA0CGk0E,UA1CH,EA0CeC,OA1Cf;AA4CA;;AAED,SAAOn0E,OAAP;AAEA,EA5GgD;;AA8GjD+2E,UAAS,UAAW//F,KAAX,EAAmB;;AAE3B,OAAK6xD,IAAL,GAAY7xD,KAAZ;AACA,SAAO,IAAP;AAEA;;AAnHgD,CAAlD;;AAuHA;;;;;;AAMA,SAAS2gG,iBAAT,CAA4BzC,OAA5B,EAAsC;;AAErC,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;;AAEA;AACA,MAAKqC,OAAL,GAAe,IAAf;AAEA;;AAED7/F,OAAOK,MAAP,CAAe+/F,kBAAkBrgG,SAAjC,EAA4C;;AAE3C69F,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAIzxE,QAAQ,IAAZ;;AAEA,MAAI1C,UAAU,IAAIU,WAAJ,EAAd;;AAEA,MAAI22E,SAAS,IAAIpC,UAAJ,CAAgB,KAAKC,OAArB,CAAb;AACAmC,SAAOL,eAAP,CAAwB,aAAxB;;AAEAK,SAAOlC,IAAP,CAAap2E,GAAb,EAAkB,UAAWqc,MAAX,EAAoB;;AAErC,OAAIw8D,UAAUl1E,MAAM00E,OAAN,CAAeh8D,MAAf,CAAd;;AAEA,OAAK,CAAEw8D,OAAP,EAAiB;;AAEjB,OAAKhhG,cAAcghG,QAAQ17E,KAA3B,EAAmC;;AAElC8D,YAAQ9D,KAAR,GAAgB07E,QAAQ17E,KAAxB;AAEA,IAJD,MAIO,IAAKtlB,cAAcghG,QAAQj3E,IAA3B,EAAkC;;AAExCX,YAAQ9D,KAAR,CAAciC,KAAd,GAAsBy5E,QAAQz5E,KAA9B;AACA6B,YAAQ9D,KAAR,CAAckC,MAAd,GAAuBw5E,QAAQx5E,MAA/B;AACA4B,YAAQ9D,KAAR,CAAcyE,IAAd,GAAqBi3E,QAAQj3E,IAA7B;AAEA;;AAEDX,WAAQ5D,KAAR,GAAgBxlB,cAAcghG,QAAQx7E,KAAtB,GAA8Bw7E,QAAQx7E,KAAtC,GAA8Cte,mBAA9D;AACAkiB,WAAQ3D,KAAR,GAAgBzlB,cAAcghG,QAAQv7E,KAAtB,GAA8Bu7E,QAAQv7E,KAAtC,GAA8Cve,mBAA9D;;AAEAkiB,WAAQ1D,SAAR,GAAoB1lB,cAAcghG,QAAQt7E,SAAtB,GAAkCs7E,QAAQt7E,SAA1C,GAAsDne,YAA1E;AACA6hB,WAAQzD,SAAR,GAAoB3lB,cAAcghG,QAAQr7E,SAAtB,GAAkCq7E,QAAQr7E,SAA1C,GAAsDle,wBAA1E;;AAEA2hB,WAAQvD,UAAR,GAAqB7lB,cAAcghG,QAAQn7E,UAAtB,GAAmCm7E,QAAQn7E,UAA3C,GAAwD,CAA7E;;AAEA,OAAK7lB,cAAcghG,QAAQp7E,MAA3B,EAAoC;;AAEnCwD,YAAQxD,MAAR,GAAiBo7E,QAAQp7E,MAAzB;AAEA;AACD,OAAK5lB,cAAcghG,QAAQn/F,IAA3B,EAAkC;;AAEjCunB,YAAQvnB,IAAR,GAAem/F,QAAQn/F,IAAvB;AAEA;;AAED,OAAK7B,cAAcghG,QAAQ/6E,OAA3B,EAAqC;;AAEpCmD,YAAQnD,OAAR,GAAkB+6E,QAAQ/6E,OAA1B;AAEA;;AAED,OAAK,MAAM+6E,QAAQH,WAAnB,EAAiC;;AAEhCz3E,YAAQzD,SAAR,GAAoBpe,YAApB;AAEA;;AAED6hB,WAAQiuB,WAAR,GAAsB,IAAtB;;AAEA,OAAKgmD,MAAL,EAAcA,OAAQj0E,OAAR,EAAiB43E,OAAjB;AAEd,GArDD,EAqDG1D,UArDH,EAqDeC,OArDf;;AAwDA,SAAOn0E,OAAP;AAEA;;AArE0C,CAA5C;;AAyEA;;;;AAKA,SAAS63E,WAAT,CAAsB3C,OAAtB,EAAgC;;AAE/B,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;AAEA;;AAEDx9F,OAAOK,MAAP,CAAeigG,YAAYvgG,SAA3B,EAAsC;;AAErCwgG,cAAa,WAFwB;;AAIrC3C,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAKp1E,QAAQnoB,SAAb,EAAyBmoB,MAAM,EAAN;;AAEzB,MAAK,KAAK8pC,IAAL,KAAcjyD,SAAnB,EAA+BmoB,MAAM,KAAK8pC,IAAL,GAAY9pC,GAAlB;;AAE/BA,QAAM,KAAKm2E,OAAL,CAAaN,UAAb,CAAyB71E,GAAzB,CAAN;;AAEA,MAAI2D,QAAQ,IAAZ;;AAEA,MAAI0yE,SAASvB,MAAMp8F,GAAN,CAAWsnB,GAAX,CAAb;;AAEA,MAAKq2E,WAAWx+F,SAAhB,EAA4B;;AAE3B8rB,SAAMwyE,OAAN,CAAcT,SAAd,CAAyB11E,GAAzB;;AAEAs2E,cAAY,YAAY;;AAEvB,QAAKpB,MAAL,EAAcA,OAAQmB,MAAR;;AAEd1yE,UAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AAEA,IAND,EAMG,CANH;;AAQA,UAAOq2E,MAAP;AAEA;;AAED,MAAIl5E,QAAQ+B,SAASC,eAAT,CAA0B,8BAA1B,EAA0D,KAA1D,CAAZ;;AAEA,WAAS65E,WAAT,GAAuB;;AAEtB77E,SAAMljB,mBAAN,CAA2B,MAA3B,EAAmC++F,WAAnC,EAAgD,KAAhD;AACA77E,SAAMljB,mBAAN,CAA2B,OAA3B,EAAoCg/F,YAApC,EAAkD,KAAlD;;AAEAnE,SAAM1tF,GAAN,CAAW4Y,GAAX,EAAgB,IAAhB;;AAEA,OAAKk1E,MAAL,EAAcA,OAAQ,IAAR;;AAEdvxE,SAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AAEA;;AAED,WAASi5E,YAAT,CAAuB5+F,KAAvB,EAA+B;;AAE9B8iB,SAAMljB,mBAAN,CAA2B,MAA3B,EAAmC++F,WAAnC,EAAgD,KAAhD;AACA77E,SAAMljB,mBAAN,CAA2B,OAA3B,EAAoCg/F,YAApC,EAAkD,KAAlD;;AAEA,OAAK7D,OAAL,EAAeA,QAAS/6F,KAAT;;AAEfspB,SAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AACA2D,SAAMwyE,OAAN,CAAcP,SAAd,CAAyB51E,GAAzB;AAEA;;AAED7C,QAAM1jB,gBAAN,CAAwB,MAAxB,EAAgCu/F,WAAhC,EAA6C,KAA7C;AACA77E,QAAM1jB,gBAAN,CAAwB,OAAxB,EAAiCw/F,YAAjC,EAA+C,KAA/C;;AAEA,MAAKj5E,IAAIk5E,MAAJ,CAAY,CAAZ,EAAe,CAAf,MAAuB,OAA5B,EAAsC;;AAErC,OAAK,KAAKH,WAAL,KAAqBlhG,SAA1B,EAAsCslB,MAAM47E,WAAN,GAAoB,KAAKA,WAAzB;AAEtC;;AAEDp1E,QAAMwyE,OAAN,CAAcT,SAAd,CAAyB11E,GAAzB;;AAEA7C,QAAMg8E,GAAN,GAAYn5E,GAAZ;;AAEA,SAAO7C,KAAP;AAEA,EA1EoC;;AA4ErCi8E,iBAAgB,UAAWnhG,KAAX,EAAmB;;AAElC,OAAK8gG,WAAL,GAAmB9gG,KAAnB;AACA,SAAO,IAAP;AAEA,EAjFoC;;AAmFrC+/F,UAAS,UAAW//F,KAAX,EAAmB;;AAE3B,OAAK6xD,IAAL,GAAY7xD,KAAZ;AACA,SAAO,IAAP;AAEA;;AAxFoC,CAAtC;;AA4FA;;;;AAKA,SAASohG,iBAAT,CAA4BlD,OAA5B,EAAsC;;AAErC,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;AAEA;;AAEDx9F,OAAOK,MAAP,CAAewgG,kBAAkB9gG,SAAjC,EAA4C;;AAE3CwgG,cAAa,WAF8B;;AAI3C3C,OAAM,UAAWkD,IAAX,EAAiBpE,MAAjB,EAAyBC,UAAzB,EAAqCC,OAArC,EAA+C;;AAEpD,MAAIn0E,UAAU,IAAIokC,WAAJ,EAAd;;AAEA,MAAIizC,SAAS,IAAIQ,WAAJ,CAAiB,KAAK3C,OAAtB,CAAb;AACAmC,SAAOc,cAAP,CAAuB,KAAKL,WAA5B;AACAT,SAAON,OAAP,CAAgB,KAAKluC,IAArB;;AAEA,MAAI2uC,SAAS,CAAb;;AAEA,WAASF,WAAT,CAAsB/9F,CAAtB,EAA0B;;AAEzB89F,UAAOlC,IAAP,CAAakD,KAAM9+F,CAAN,CAAb,EAAwB,UAAW2iB,KAAX,EAAmB;;AAE1C8D,YAAQlB,MAAR,CAAgBvlB,CAAhB,IAAsB2iB,KAAtB;;AAEAs7E;;AAEA,QAAKA,WAAW,CAAhB,EAAoB;;AAEnBx3E,aAAQiuB,WAAR,GAAsB,IAAtB;;AAEA,SAAKgmD,MAAL,EAAcA,OAAQj0E,OAAR;AAEd;AAED,IAdD,EAcGppB,SAdH,EAccu9F,OAdd;AAgBA;;AAED,OAAM,IAAI56F,IAAI,CAAd,EAAiBA,IAAI8+F,KAAKngG,MAA1B,EAAkC,EAAGqB,CAArC,EAAyC;;AAExC+9F,eAAa/9F,CAAb;AAEA;;AAED,SAAOymB,OAAP;AAEA,EA1C0C;;AA4C3Cm4E,iBAAgB,UAAWnhG,KAAX,EAAmB;;AAElC,OAAK8gG,WAAL,GAAmB9gG,KAAnB;AACA,SAAO,IAAP;AAEA,EAjD0C;;AAmD3C+/F,UAAS,UAAW//F,KAAX,EAAmB;;AAE3B,OAAK6xD,IAAL,GAAY7xD,KAAZ;AACA,SAAO,IAAP;AAEA;;AAxD0C,CAA5C;;AA4DA;;;;AAKA,SAASshG,aAAT,CAAwBpD,OAAxB,EAAkC;;AAEjC,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;AAEA;;AAEDx9F,OAAOK,MAAP,CAAe0gG,cAAchhG,SAA7B,EAAwC;;AAEvCwgG,cAAa,WAF0B;;AAIvC3C,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAIn0E,UAAU,IAAI/D,OAAJ,EAAd;;AAEA,MAAIo7E,SAAS,IAAIQ,WAAJ,CAAiB,KAAK3C,OAAtB,CAAb;AACAmC,SAAOc,cAAP,CAAuB,KAAKL,WAA5B;AACAT,SAAON,OAAP,CAAgB,KAAKluC,IAArB;;AAEAwuC,SAAOlC,IAAP,CAAap2E,GAAb,EAAkB,UAAW7C,KAAX,EAAmB;;AAEpC8D,WAAQ9D,KAAR,GAAgBA,KAAhB;;AAEA;AACA,OAAIq8E,SAASx5E,IAAIy5E,MAAJ,CAAY,eAAZ,IAAgC,CAAhC,IAAqCz5E,IAAIy5E,MAAJ,CAAY,oBAAZ,MAAuC,CAAzF;;AAEAx4E,WAAQxD,MAAR,GAAiB+7E,SAASp5F,SAAT,GAAqBC,UAAtC;AACA4gB,WAAQiuB,WAAR,GAAsB,IAAtB;;AAEA,OAAKgmD,WAAWr9F,SAAhB,EAA4B;;AAE3Bq9F,WAAQj0E,OAAR;AAEA;AAED,GAhBD,EAgBGk0E,UAhBH,EAgBeC,OAhBf;;AAkBA,SAAOn0E,OAAP;AAEA,EAhCsC;;AAkCvCm4E,iBAAgB,UAAWnhG,KAAX,EAAmB;;AAElC,OAAK8gG,WAAL,GAAmB9gG,KAAnB;AACA,SAAO,IAAP;AAEA,EAvCsC;;AAyCvC+/F,UAAS,UAAW//F,KAAX,EAAmB;;AAE3B,OAAK6xD,IAAL,GAAY7xD,KAAZ;AACA,SAAO,IAAP;AAEA;;AA9CsC,CAAxC;;AAkDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA;;;;AAIA,SAASyhG,KAAT,GAAiB;;AAEhB,MAAKhgG,IAAL,GAAY,OAAZ;;AAEA,MAAKigG,kBAAL,GAA0B,GAA1B;AAEA;;AAEDnhG,OAAOK,MAAP,CAAe6gG,MAAMnhG,SAArB,EAAgC;;AAE/B;AACA;;AAEAqhG,WAAU,YAAW,uBAA0B;;AAE9CtyF,UAAQC,IAAR,CAAc,2CAAd;AACA,SAAO,IAAP;AAEA,EAV8B;;AAY/B;AACA;;AAEA29E,aAAY,UAAW5yD,CAAX,EAAcunE,cAAd,EAA+B;;AAE1C,MAAI30F,IAAI,KAAK40F,cAAL,CAAqBxnE,CAArB,CAAR;AACA,SAAO,KAAKsnE,QAAL,CAAe10F,CAAf,EAAkB20F,cAAlB,CAAP;AAEA,EApB8B;;AAsB/B;;AAEAE,YAAW,UAAWC,SAAX,EAAuB;;AAEjC,MAAKA,cAAcniG,SAAnB,EAA+BmiG,YAAY,CAAZ;;AAE/B,MAAIt3E,SAAS,EAAb;;AAEA,OAAM,IAAItV,IAAI,CAAd,EAAiBA,KAAK4sF,SAAtB,EAAiC5sF,GAAjC,EAAwC;;AAEvCsV,UAAO3oB,IAAP,CAAa,KAAK6/F,QAAL,CAAexsF,IAAI4sF,SAAnB,CAAb;AAEA;;AAED,SAAOt3E,MAAP;AAEA,EAtC8B;;AAwC/B;;AAEA4pE,kBAAiB,UAAW0N,SAAX,EAAuB;;AAEvC,MAAKA,cAAcniG,SAAnB,EAA+BmiG,YAAY,CAAZ;;AAE/B,MAAIt3E,SAAS,EAAb;;AAEA,OAAM,IAAItV,IAAI,CAAd,EAAiBA,KAAK4sF,SAAtB,EAAiC5sF,GAAjC,EAAwC;;AAEvCsV,UAAO3oB,IAAP,CAAa,KAAKmrF,UAAL,CAAiB93E,IAAI4sF,SAArB,CAAb;AAEA;;AAED,SAAOt3E,MAAP;AAEA,EAxD8B;;AA0D/B;;AAEAu3E,YAAW,YAAY;;AAEtB,MAAIC,UAAU,KAAKC,UAAL,EAAd;AACA,SAAOD,QAASA,QAAQ/gG,MAAR,GAAiB,CAA1B,CAAP;AAEA,EAjE8B;;AAmE/B;;AAEAghG,aAAY,UAAWH,SAAX,EAAuB;;AAElC,MAAKA,cAAcniG,SAAnB,EAA+BmiG,YAAY,KAAKL,kBAAjB;;AAE/B,MAAK,KAAKS,eAAL,IACF,KAAKA,eAAL,CAAqBjhG,MAArB,KAAgC6gG,YAAY,CAD1C,IAEJ,CAAE,KAAK9qD,WAFR,EAEsB;;AAErB,UAAO,KAAKkrD,eAAZ;AAEA;;AAED,OAAKlrD,WAAL,GAAmB,KAAnB;;AAEA,MAAI7L,QAAQ,EAAZ;AACA,MAAIg3D,OAAJ;AAAA,MAAarT,OAAO,KAAK4S,QAAL,CAAe,CAAf,CAApB;AACA,MAAIvkF,CAAJ;AAAA,MAAOi1E,MAAM,CAAb;;AAEAjnD,QAAMtpC,IAAN,CAAY,CAAZ;;AAEA,OAAMsb,IAAI,CAAV,EAAaA,KAAK2kF,SAAlB,EAA6B3kF,GAA7B,EAAoC;;AAEnCglF,aAAU,KAAKT,QAAL,CAAevkF,IAAI2kF,SAAnB,CAAV;AACA1P,UAAO+P,QAAQ9wF,UAAR,CAAoBy9E,IAApB,CAAP;AACA3jD,SAAMtpC,IAAN,CAAYuwF,GAAZ;AACAtD,UAAOqT,OAAP;AAEA;;AAED,OAAKD,eAAL,GAAuB/2D,KAAvB;;AAEA,SAAOA,KAAP,CA/BkC,CA+BpB;AAEd,EAtG8B;;AAwG/Bi3D,mBAAkB,YAAY;;AAE7B,OAAKprD,WAAL,GAAmB,IAAnB;AACA,OAAKirD,UAAL;AAEA,EA7G8B;;AA+G/B;;AAEAL,iBAAgB,UAAWxnE,CAAX,EAAcvH,QAAd,EAAyB;;AAExC,MAAIwvE,aAAa,KAAKJ,UAAL,EAAjB;;AAEA,MAAI3/F,IAAI,CAAR;AAAA,MAAWooB,KAAK23E,WAAWphG,MAA3B;;AAEA,MAAIqhG,eAAJ,CANwC,CAMnB;;AAErB,MAAKzvE,QAAL,EAAgB;;AAEfyvE,qBAAkBzvE,QAAlB;AAEA,GAJD,MAIO;;AAENyvE,qBAAkBloE,IAAIioE,WAAY33E,KAAK,CAAjB,CAAtB;AAEA;;AAED;;AAEA,MAAItd,MAAM,CAAV;AAAA,MAAaC,OAAOqd,KAAK,CAAzB;AAAA,MAA4B63E,UAA5B;;AAEA,SAAQn1F,OAAOC,IAAf,EAAsB;;AAErB/K,OAAI1C,KAAKK,KAAL,CAAYmN,MAAM,CAAEC,OAAOD,GAAT,IAAiB,CAAnC,CAAJ,CAFqB,CAEuB;;AAE5Cm1F,gBAAaF,WAAY//F,CAAZ,IAAkBggG,eAA/B;;AAEA,OAAKC,aAAa,CAAlB,EAAsB;;AAErBn1F,UAAM9K,IAAI,CAAV;AAEA,IAJD,MAIO,IAAKigG,aAAa,CAAlB,EAAsB;;AAE5Bl1F,WAAO/K,IAAI,CAAX;AAEA,IAJM,MAIA;;AAEN+K,WAAO/K,CAAP;AACA;;AAEA;AAEA;AAED;;AAEDA,MAAI+K,IAAJ;;AAEA,MAAKg1F,WAAY//F,CAAZ,MAAoBggG,eAAzB,EAA2C;;AAE1C,UAAOhgG,KAAMooB,KAAK,CAAX,CAAP;AAEA;;AAED;;AAEA,MAAI83E,eAAeH,WAAY//F,CAAZ,CAAnB;AACA,MAAImgG,cAAcJ,WAAY//F,IAAI,CAAhB,CAAlB;;AAEA,MAAIogG,gBAAgBD,cAAcD,YAAlC;;AAEA;;AAEA,MAAIG,kBAAkB,CAAEL,kBAAkBE,YAApB,IAAqCE,aAA3D;;AAEA;;AAEA,MAAI11F,IAAI,CAAE1K,IAAIqgG,eAAN,KAA4Bj4E,KAAK,CAAjC,CAAR;;AAEA,SAAO1d,CAAP;AAEA,EAzL8B;;AA2L/B;AACA;AACA;AACA;;AAEA41F,aAAY,UAAW51F,CAAX,EAAe;;AAE1B,MAAIojB,QAAQ,MAAZ;AACA,MAAIkvB,KAAKtyC,IAAIojB,KAAb;AACA,MAAIyyE,KAAK71F,IAAIojB,KAAb;;AAEA;;AAEA,MAAKkvB,KAAK,CAAV,EAAcA,KAAK,CAAL;AACd,MAAKujD,KAAK,CAAV,EAAcA,KAAK,CAAL;;AAEd,MAAIC,MAAM,KAAKpB,QAAL,CAAepiD,EAAf,CAAV;AACA,MAAIyjD,MAAM,KAAKrB,QAAL,CAAemB,EAAf,CAAV;;AAEA,MAAIxb,MAAM0b,IAAIj0F,KAAJ,GAAYc,GAAZ,CAAiBkzF,GAAjB,CAAV;AACA,SAAOzb,IAAIn2E,SAAJ,EAAP;AAEA,EAjN8B;;AAmN/B8xF,eAAc,UAAW5oE,CAAX,EAAe;;AAE5B,MAAIptB,IAAI,KAAK40F,cAAL,CAAqBxnE,CAArB,CAAR;AACA,SAAO,KAAKwoE,UAAL,CAAiB51F,CAAjB,CAAP;AAEA,EAxN8B;;AA0N/B2/E,sBAAqB,UAAWwN,QAAX,EAAqB/N,MAArB,EAA8B;;AAElD;;AAEA,MAAI7oE,SAAS,IAAI5O,OAAJ,EAAb;;AAEA,MAAI63E,WAAW,EAAf;AACA,MAAIh+C,UAAU,EAAd;AACA,MAAIi+C,YAAY,EAAhB;;AAEA,MAAIpF,MAAM,IAAI1yE,OAAJ,EAAV;AACA,MAAIsuF,MAAM,IAAIrwF,OAAJ,EAAV;;AAEA,MAAItQ,CAAJ,EAAO83B,CAAP,EAAU/f,KAAV;;AAEA;;AAEA,OAAM/X,IAAI,CAAV,EAAaA,KAAK63F,QAAlB,EAA4B73F,GAA5B,EAAmC;;AAElC83B,OAAI93B,IAAI63F,QAAR;;AAEA3N,YAAUlqF,CAAV,IAAgB,KAAK0gG,YAAL,CAAmB5oE,CAAnB,CAAhB;AACAoyD,YAAUlqF,CAAV,EAAc4O,SAAd;AAEA;;AAED;AACA;;AAEAs9B,UAAS,CAAT,IAAe,IAAI75B,OAAJ,EAAf;AACA83E,YAAW,CAAX,IAAiB,IAAI93E,OAAJ,EAAjB;AACA,MAAIvI,MAAM3M,OAAOyjG,SAAjB;AACA,MAAIxoF,KAAK9a,KAAKqR,GAAL,CAAUu7E,SAAU,CAAV,EAAcrsF,CAAxB,CAAT;AACA,MAAIwa,KAAK/a,KAAKqR,GAAL,CAAUu7E,SAAU,CAAV,EAAcz/E,CAAxB,CAAT;AACA,MAAIo2F,KAAKvjG,KAAKqR,GAAL,CAAUu7E,SAAU,CAAV,EAAc/3E,CAAxB,CAAT;;AAEA,MAAKiG,MAAMtO,GAAX,EAAiB;;AAEhBA,SAAMsO,EAAN;AACA6I,UAAOlV,GAAP,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB;AAEA;;AAED,MAAKsM,MAAMvO,GAAX,EAAiB;;AAEhBA,SAAMuO,EAAN;AACA4I,UAAOlV,GAAP,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB;AAEA;;AAED,MAAK80F,MAAM/2F,GAAX,EAAiB;;AAEhBmX,UAAOlV,GAAP,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB;AAEA;;AAEDg5E,MAAI5wE,YAAJ,CAAkB+1E,SAAU,CAAV,CAAlB,EAAiCjpE,MAAjC,EAA0CrS,SAA1C;;AAEAs9B,UAAS,CAAT,EAAa/3B,YAAb,CAA2B+1E,SAAU,CAAV,CAA3B,EAA0CnF,GAA1C;AACAoF,YAAW,CAAX,EAAeh2E,YAAf,CAA6B+1E,SAAU,CAAV,CAA7B,EAA4Ch+C,QAAS,CAAT,CAA5C;;AAGA;;AAEA,OAAMlsC,IAAI,CAAV,EAAaA,KAAK63F,QAAlB,EAA4B73F,GAA5B,EAAmC;;AAElCksC,WAASlsC,CAAT,IAAeksC,QAASlsC,IAAI,CAAb,EAAiBwM,KAAjB,EAAf;;AAEA29E,aAAWnqF,CAAX,IAAiBmqF,UAAWnqF,IAAI,CAAf,EAAmBwM,KAAnB,EAAjB;;AAEAu4E,OAAI5wE,YAAJ,CAAkB+1E,SAAUlqF,IAAI,CAAd,CAAlB,EAAqCkqF,SAAUlqF,CAAV,CAArC;;AAEA,OAAK+kF,IAAIpmF,MAAJ,KAAexB,OAAOC,OAA3B,EAAqC;;AAEpC2nF,QAAIn2E,SAAJ;;AAEAmJ,YAAQza,KAAK6jB,IAAL,CAAWnY,MAAMa,KAAN,CAAaqgF,SAAUlqF,IAAI,CAAd,EAAkBuO,GAAlB,CAAuB27E,SAAUlqF,CAAV,CAAvB,CAAb,EAAqD,CAAE,CAAvD,EAA0D,CAA1D,CAAX,CAAR,CAJoC,CAIgD;;AAEpFksC,YAASlsC,CAAT,EAAayW,YAAb,CAA2BkqF,IAAIzoF,gBAAJ,CAAsB6sE,GAAtB,EAA2BhtE,KAA3B,CAA3B;AAEA;;AAEDoyE,aAAWnqF,CAAX,EAAemU,YAAf,CAA6B+1E,SAAUlqF,CAAV,CAA7B,EAA4CksC,QAASlsC,CAAT,CAA5C;AAEA;;AAED;;AAEA,MAAK8pF,WAAW,IAAhB,EAAuB;;AAEtB/xE,WAAQza,KAAK6jB,IAAL,CAAWnY,MAAMa,KAAN,CAAaqiC,QAAS,CAAT,EAAa39B,GAAb,CAAkB29B,QAAS2rD,QAAT,CAAlB,CAAb,EAAsD,CAAE,CAAxD,EAA2D,CAA3D,CAAX,CAAR;AACA9/E,YAAS8/E,QAAT;;AAEA,OAAK3N,SAAU,CAAV,EAAc37E,GAAd,CAAmBw2E,IAAI5wE,YAAJ,CAAkB+3B,QAAS,CAAT,CAAlB,EAAgCA,QAAS2rD,QAAT,CAAhC,CAAnB,IAA6E,CAAlF,EAAsF;;AAErF9/E,YAAQ,CAAEA,KAAV;AAEA;;AAED,QAAM/X,IAAI,CAAV,EAAaA,KAAK63F,QAAlB,EAA4B73F,GAA5B,EAAmC;;AAElC;AACAksC,YAASlsC,CAAT,EAAayW,YAAb,CAA2BkqF,IAAIzoF,gBAAJ,CAAsBgyE,SAAUlqF,CAAV,CAAtB,EAAqC+X,QAAQ/X,CAA7C,CAA3B;AACAmqF,cAAWnqF,CAAX,EAAemU,YAAf,CAA6B+1E,SAAUlqF,CAAV,CAA7B,EAA4CksC,QAASlsC,CAAT,CAA5C;AAEA;AAED;;AAED,SAAO;AACNkqF,aAAUA,QADJ;AAENh+C,YAASA,OAFH;AAGNi+C,cAAWA;AAHL,GAAP;AAMA,EA7U8B;;AA+U/B39E,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EAnV8B;;AAqV/BA,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB,OAAKugG,kBAAL,GAA0BvgG,OAAOugG,kBAAjC;;AAEA,SAAO,IAAP;AAEA,EA3V8B;;AA6V/Bh7E,SAAQ,YAAY;;AAEnB,MAAIiD,OAAO;AACVhC,aAAU;AACTtB,aAAS,GADA;AAET5kB,UAAM,OAFG;AAGTmmB,eAAW;AAHF;AADA,GAAX;;AAQA+B,OAAK+3E,kBAAL,GAA0B,KAAKA,kBAA/B;AACA/3E,OAAKloB,IAAL,GAAY,KAAKA,IAAjB;;AAEA,SAAOkoB,IAAP;AAEA,EA5W8B;;AA8W/B05E,WAAU,UAAWC,IAAX,EAAkB;;AAE3B,OAAK5B,kBAAL,GAA0B4B,KAAK5B,kBAA/B;;AAEA,SAAO,IAAP;AAEA;;AApX8B,CAAhC;;AAwXA,SAAS6B,YAAT,CAAuBC,EAAvB,EAA2BC,EAA3B,EAA+BC,OAA/B,EAAwCC,OAAxC,EAAiDC,WAAjD,EAA8DC,SAA9D,EAAyEC,UAAzE,EAAqFC,SAArF,EAAiG;;AAEhGtC,OAAMngG,IAAN,CAAY,IAAZ;;AAEA,MAAKG,IAAL,GAAY,cAAZ;;AAEA,MAAK+hG,EAAL,GAAUA,MAAM,CAAhB;AACA,MAAKC,EAAL,GAAUA,MAAM,CAAhB;;AAEA,MAAKC,OAAL,GAAeA,WAAW,CAA1B;AACA,MAAKC,OAAL,GAAeA,WAAW,CAA1B;;AAEA,MAAKC,WAAL,GAAmBA,eAAe,CAAlC;AACA,MAAKC,SAAL,GAAiBA,aAAa,IAAIhkG,KAAK4L,EAAvC;;AAEA,MAAKq4F,UAAL,GAAkBA,cAAc,KAAhC;;AAEA,MAAKC,SAAL,GAAiBA,aAAa,CAA9B;AAEA;;AAEDR,aAAajjG,SAAb,GAAyBC,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAAzB;AACAijG,aAAajjG,SAAb,CAAuB0O,WAAvB,GAAqCu0F,YAArC;;AAEAA,aAAajjG,SAAb,CAAuB0jG,cAAvB,GAAwC,IAAxC;;AAEAT,aAAajjG,SAAb,CAAuBqhG,QAAvB,GAAkC,UAAW10F,CAAX,EAAc20F,cAAd,EAA+B;;AAEhE,KAAIr2E,QAAQq2E,kBAAkB,IAAIxzF,OAAJ,EAA9B;;AAEA,KAAI61F,QAAQpkG,KAAK4L,EAAL,GAAU,CAAtB;AACA,KAAIy4F,aAAa,KAAKL,SAAL,GAAiB,KAAKD,WAAvC;AACA,KAAIO,aAAatkG,KAAKqR,GAAL,CAAUgzF,UAAV,IAAyBxkG,OAAOC,OAAjD;;AAEA;AACA,QAAQukG,aAAa,CAArB,EAAyBA,cAAcD,KAAd;AACzB,QAAQC,aAAaD,KAArB,EAA6BC,cAAcD,KAAd;;AAE7B,KAAKC,aAAaxkG,OAAOC,OAAzB,EAAmC;;AAElC,MAAKwkG,UAAL,EAAkB;;AAEjBD,gBAAa,CAAb;AAEA,GAJD,MAIO;;AAENA,gBAAaD,KAAb;AAEA;AAED;;AAED,KAAK,KAAKH,UAAL,KAAoB,IAApB,IAA4B,CAAEK,UAAnC,EAAgD;;AAE/C,MAAKD,eAAeD,KAApB,EAA4B;;AAE3BC,gBAAa,CAAED,KAAf;AAEA,GAJD,MAIO;;AAENC,gBAAaA,aAAaD,KAA1B;AAEA;AAED;;AAED,KAAI7yF,QAAQ,KAAKwyF,WAAL,GAAmB32F,IAAIi3F,UAAnC;AACA,KAAI9jG,IAAI,KAAKojG,EAAL,GAAU,KAAKE,OAAL,GAAe7jG,KAAK8S,GAAL,CAAUvB,KAAV,CAAjC;AACA,KAAIpE,IAAI,KAAKy2F,EAAL,GAAU,KAAKE,OAAL,GAAe9jG,KAAK+S,GAAL,CAAUxB,KAAV,CAAjC;;AAEA,KAAK,KAAK2yF,SAAL,KAAmB,CAAxB,EAA4B;;AAE3B,MAAIpxF,MAAM9S,KAAK8S,GAAL,CAAU,KAAKoxF,SAAf,CAAV;AACA,MAAInxF,MAAM/S,KAAK+S,GAAL,CAAU,KAAKmxF,SAAf,CAAV;;AAEA,MAAIppF,KAAKva,IAAI,KAAKojG,EAAlB;AACA,MAAI5oF,KAAK5N,IAAI,KAAKy2F,EAAlB;;AAEA;AACArjG,MAAIua,KAAKhI,GAAL,GAAWiI,KAAKhI,GAAhB,GAAsB,KAAK4wF,EAA/B;AACAx2F,MAAI2N,KAAK/H,GAAL,GAAWgI,KAAKjI,GAAhB,GAAsB,KAAK8wF,EAA/B;AAEA;;AAED,QAAOl4E,MAAMjd,GAAN,CAAWlO,CAAX,EAAc4M,CAAd,CAAP;AAEA,CA5DD;;AA8DAu2F,aAAajjG,SAAb,CAAuB2O,IAAvB,GAA8B,UAAW9N,MAAX,EAAoB;;AAEjDsgG,OAAMnhG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,MAAKqiG,EAAL,GAAUriG,OAAOqiG,EAAjB;AACA,MAAKC,EAAL,GAAUtiG,OAAOsiG,EAAjB;;AAEA,MAAKC,OAAL,GAAeviG,OAAOuiG,OAAtB;AACA,MAAKC,OAAL,GAAexiG,OAAOwiG,OAAtB;;AAEA,MAAKC,WAAL,GAAmBziG,OAAOyiG,WAA1B;AACA,MAAKC,SAAL,GAAiB1iG,OAAO0iG,SAAxB;;AAEA,MAAKC,UAAL,GAAkB3iG,OAAO2iG,UAAzB;;AAEA,MAAKC,SAAL,GAAiB5iG,OAAO4iG,SAAxB;;AAEA,QAAO,IAAP;AAEA,CAnBD;;AAsBAR,aAAajjG,SAAb,CAAuBomB,MAAvB,GAAgC,YAAY;;AAE3C,KAAIiD,OAAO83E,MAAMnhG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,CAAX;;AAEAqoB,MAAK65E,EAAL,GAAU,KAAKA,EAAf;AACA75E,MAAK85E,EAAL,GAAU,KAAKA,EAAf;;AAEA95E,MAAK+5E,OAAL,GAAe,KAAKA,OAApB;AACA/5E,MAAKg6E,OAAL,GAAe,KAAKA,OAApB;;AAEAh6E,MAAKi6E,WAAL,GAAmB,KAAKA,WAAxB;AACAj6E,MAAKk6E,SAAL,GAAiB,KAAKA,SAAtB;;AAEAl6E,MAAKm6E,UAAL,GAAkB,KAAKA,UAAvB;;AAEAn6E,MAAKo6E,SAAL,GAAiB,KAAKA,SAAtB;;AAEA,QAAOp6E,IAAP;AAEA,CAnBD;;AAqBA45E,aAAajjG,SAAb,CAAuB+iG,QAAvB,GAAkC,UAAWC,IAAX,EAAkB;;AAEnD7B,OAAMnhG,SAAN,CAAgB+iG,QAAhB,CAAyB/hG,IAAzB,CAA+B,IAA/B,EAAqCgiG,IAArC;;AAEA,MAAKE,EAAL,GAAUF,KAAKE,EAAf;AACA,MAAKC,EAAL,GAAUH,KAAKG,EAAf;;AAEA,MAAKC,OAAL,GAAeJ,KAAKI,OAApB;AACA,MAAKC,OAAL,GAAeL,KAAKK,OAApB;;AAEA,MAAKC,WAAL,GAAmBN,KAAKM,WAAxB;AACA,MAAKC,SAAL,GAAiBP,KAAKO,SAAtB;;AAEA,MAAKC,UAAL,GAAkBR,KAAKQ,UAAvB;;AAEA,MAAKC,SAAL,GAAiBT,KAAKS,SAAtB;;AAEA,QAAO,IAAP;AAEA,CAnBD;;AAqBA,SAASK,QAAT,CAAmBZ,EAAnB,EAAuBC,EAAvB,EAA2BY,OAA3B,EAAoCT,WAApC,EAAiDC,SAAjD,EAA4DC,UAA5D,EAAyE;;AAExEP,cAAajiG,IAAb,CAAmB,IAAnB,EAAyBkiG,EAAzB,EAA6BC,EAA7B,EAAiCY,OAAjC,EAA0CA,OAA1C,EAAmDT,WAAnD,EAAgEC,SAAhE,EAA2EC,UAA3E;;AAEA,MAAKriG,IAAL,GAAY,UAAZ;AAEA;;AAED2iG,SAAS9jG,SAAT,GAAqBC,OAAOgmB,MAAP,CAAeg9E,aAAajjG,SAA5B,CAArB;AACA8jG,SAAS9jG,SAAT,CAAmB0O,WAAnB,GAAiCo1F,QAAjC;;AAEAA,SAAS9jG,SAAT,CAAmBgkG,UAAnB,GAAgC,IAAhC;;AAEA;;;;;;;;;;;AAYA;;;;;;;;;;AAUA,SAASC,SAAT,GAAqB;;AAEpB,KAAIC,KAAK,CAAT;AAAA,KAAYxlF,KAAK,CAAjB;AAAA,KAAoBC,KAAK,CAAzB;AAAA,KAA4BC,KAAK,CAAjC;;AAEA;;;;;;;;AAQA,UAASwqC,IAAT,CAAezrC,EAAf,EAAmBI,EAAnB,EAAuBihC,EAAvB,EAA2BC,EAA3B,EAAgC;;AAE/BilD,OAAKvmF,EAAL;AACAe,OAAKsgC,EAAL;AACArgC,OAAK,CAAE,CAAF,GAAMhB,EAAN,GAAW,IAAII,EAAf,GAAoB,IAAIihC,EAAxB,GAA6BC,EAAlC;AACArgC,OAAK,IAAIjB,EAAJ,GAAS,IAAII,EAAb,GAAkBihC,EAAlB,GAAuBC,EAA5B;AAEA;;AAED,QAAO;;AAENklD,kBAAgB,UAAWxmF,EAAX,EAAeI,EAAf,EAAmBhD,EAAnB,EAAuBqpF,EAAvB,EAA2BC,OAA3B,EAAqC;;AAEpDj7C,QAAMrrC,EAAN,EAAUhD,EAAV,EAAcspF,WAAYtpF,KAAK4C,EAAjB,CAAd,EAAqC0mF,WAAYD,KAAKrmF,EAAjB,CAArC;AAEA,GANK;;AAQNumF,4BAA0B,UAAW3mF,EAAX,EAAeI,EAAf,EAAmBhD,EAAnB,EAAuBqpF,EAAvB,EAA2BG,GAA3B,EAAgCC,GAAhC,EAAqCC,GAArC,EAA2C;;AAEpE;AACA,OAAIxlD,KAAK,CAAElhC,KAAKJ,EAAP,IAAc4mF,GAAd,GAAoB,CAAExpF,KAAK4C,EAAP,KAAgB4mF,MAAMC,GAAtB,CAApB,GAAkD,CAAEzpF,KAAKgD,EAAP,IAAcymF,GAAzE;AACA,OAAIhC,KAAK,CAAEznF,KAAKgD,EAAP,IAAcymF,GAAd,GAAoB,CAAEJ,KAAKrmF,EAAP,KAAgBymF,MAAMC,GAAtB,CAApB,GAAkD,CAAEL,KAAKrpF,EAAP,IAAc0pF,GAAzE;;AAEA;AACAxlD,SAAMulD,GAAN;AACAhC,SAAMgC,GAAN;;AAEAp7C,QAAMrrC,EAAN,EAAUhD,EAAV,EAAckkC,EAAd,EAAkBujD,EAAlB;AAEA,GApBK;;AAsBNkC,QAAM,UAAW/3F,CAAX,EAAe;;AAEpB,OAAI61F,KAAK71F,IAAIA,CAAb;AACA,OAAIg4F,KAAKnC,KAAK71F,CAAd;AACA,UAAOu3F,KAAKxlF,KAAK/R,CAAV,GAAcgS,KAAK6jF,EAAnB,GAAwB5jF,KAAK+lF,EAApC;AAEA;;AA5BK,EAAP;AAgCA;;AAED;;AAEA,IAAI7rF,MAAM,IAAIxE,OAAJ,EAAV;AACA,IAAIg9E,KAAK,IAAI2S,SAAJ,EAAT;AAAA,IAA0B1S,KAAK,IAAI0S,SAAJ,EAA/B;AAAA,IAAgDW,KAAK,IAAIX,SAAJ,EAArD;;AAEA,SAASY,gBAAT,CAA2B16E,MAA3B,EAAmC4hE,MAAnC,EAA2C+Y,SAA3C,EAAsDT,OAAtD,EAAgE;;AAE/DlD,OAAMngG,IAAN,CAAY,IAAZ;;AAEA,MAAKG,IAAL,GAAY,kBAAZ;;AAEA,MAAKgpB,MAAL,GAAcA,UAAU,EAAxB;AACA,MAAK4hE,MAAL,GAAcA,UAAU,KAAxB;AACA,MAAK+Y,SAAL,GAAiBA,aAAa,aAA9B;AACA,MAAKT,OAAL,GAAeA,WAAW,GAA1B;AAEA;;AAEDQ,iBAAiB7kG,SAAjB,GAA6BC,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAA7B;AACA6kG,iBAAiB7kG,SAAjB,CAA2B0O,WAA3B,GAAyCm2F,gBAAzC;;AAEAA,iBAAiB7kG,SAAjB,CAA2B+kG,kBAA3B,GAAgD,IAAhD;;AAEAF,iBAAiB7kG,SAAjB,CAA2BqhG,QAA3B,GAAsC,UAAW10F,CAAX,EAAc20F,cAAd,EAA+B;;AAEpE,KAAIr2E,QAAQq2E,kBAAkB,IAAIhtF,OAAJ,EAA9B;;AAEA,KAAI6V,SAAS,KAAKA,MAAlB;AACA,KAAIjoB,IAAIioB,OAAOvpB,MAAf;;AAEA,KAAIkc,IAAI,CAAE5a,KAAM,KAAK6pF,MAAL,GAAc,CAAd,GAAkB,CAAxB,CAAF,IAAkCp/E,CAA1C;AACA,KAAIq4F,WAAWzlG,KAAKK,KAAL,CAAYkd,CAAZ,CAAf;AACA,KAAImoF,SAASnoF,IAAIkoF,QAAjB;;AAEA,KAAK,KAAKjZ,MAAV,EAAmB;;AAElBiZ,cAAYA,WAAW,CAAX,GAAe,CAAf,GAAmB,CAAEzlG,KAAKK,KAAL,CAAYL,KAAKqR,GAAL,CAAUo0F,QAAV,IAAuB9iG,CAAnC,IAAyC,CAA3C,IAAiDA,CAAhF;AAEA,EAJD,MAIO,IAAK+iG,WAAW,CAAX,IAAgBD,aAAa9iG,IAAI,CAAtC,EAA0C;;AAEhD8iG,aAAW9iG,IAAI,CAAf;AACA+iG,WAAS,CAAT;AAEA;;AAED,KAAI93E,EAAJ,EAAQC,EAAR,EAAYC,EAAZ,EAAgBuD,EAAhB,CAtBoE,CAsBhD;;AAEpB,KAAK,KAAKm7D,MAAL,IAAeiZ,WAAW,CAA/B,EAAmC;;AAElC73E,OAAKhD,OAAQ,CAAE66E,WAAW,CAAb,IAAmB9iG,CAA3B,CAAL;AAEA,EAJD,MAIO;;AAEN;AACA4W,MAAItJ,UAAJ,CAAgB2a,OAAQ,CAAR,CAAhB,EAA6BA,OAAQ,CAAR,CAA7B,EAA2Ctb,GAA3C,CAAgDsb,OAAQ,CAAR,CAAhD;AACAgD,OAAKrU,GAAL;AAEA;;AAEDsU,MAAKjD,OAAQ66E,WAAW9iG,CAAnB,CAAL;AACAmrB,MAAKlD,OAAQ,CAAE66E,WAAW,CAAb,IAAmB9iG,CAA3B,CAAL;;AAEA,KAAK,KAAK6pF,MAAL,IAAeiZ,WAAW,CAAX,GAAe9iG,CAAnC,EAAuC;;AAEtC0uB,OAAKzG,OAAQ,CAAE66E,WAAW,CAAb,IAAmB9iG,CAA3B,CAAL;AAEA,EAJD,MAIO;;AAEN;AACA4W,MAAItJ,UAAJ,CAAgB2a,OAAQjoB,IAAI,CAAZ,CAAhB,EAAiCioB,OAAQjoB,IAAI,CAAZ,CAAjC,EAAmD2M,GAAnD,CAAwDsb,OAAQjoB,IAAI,CAAZ,CAAxD;AACA0uB,OAAK9X,GAAL;AAEA;;AAED,KAAK,KAAKgsF,SAAL,KAAmB,aAAnB,IAAoC,KAAKA,SAAL,KAAmB,SAA5D,EAAwE;;AAEvE;AACA,MAAItlG,MAAM,KAAKslG,SAAL,KAAmB,SAAnB,GAA+B,GAA/B,GAAqC,IAA/C;AACA,MAAIP,MAAMhlG,KAAKC,GAAL,CAAU2tB,GAAGlc,iBAAH,CAAsBmc,EAAtB,CAAV,EAAsC5tB,GAAtC,CAAV;AACA,MAAIglG,MAAMjlG,KAAKC,GAAL,CAAU4tB,GAAGnc,iBAAH,CAAsBoc,EAAtB,CAAV,EAAsC7tB,GAAtC,CAAV;AACA,MAAIilG,MAAMllG,KAAKC,GAAL,CAAU6tB,GAAGpc,iBAAH,CAAsB2f,EAAtB,CAAV,EAAsCpxB,GAAtC,CAAV;;AAEA;AACA,MAAKglG,MAAM,IAAX,EAAkBA,MAAM,GAAN;AAClB,MAAKD,MAAM,IAAX,EAAkBA,MAAMC,GAAN;AAClB,MAAKC,MAAM,IAAX,EAAkBA,MAAMD,GAAN;;AAElBlT,KAAGgT,wBAAH,CAA6Bn3E,GAAGrtB,CAAhC,EAAmCstB,GAAGttB,CAAtC,EAAyCutB,GAAGvtB,CAA5C,EAA+C8wB,GAAG9wB,CAAlD,EAAqDykG,GAArD,EAA0DC,GAA1D,EAA+DC,GAA/D;AACAlT,KAAG+S,wBAAH,CAA6Bn3E,GAAGzgB,CAAhC,EAAmC0gB,GAAG1gB,CAAtC,EAAyC2gB,GAAG3gB,CAA5C,EAA+CkkB,GAAGlkB,CAAlD,EAAqD63F,GAArD,EAA0DC,GAA1D,EAA+DC,GAA/D;AACAG,KAAGN,wBAAH,CAA6Bn3E,GAAG/Y,CAAhC,EAAmCgZ,GAAGhZ,CAAtC,EAAyCiZ,GAAGjZ,CAA5C,EAA+Cwc,GAAGxc,CAAlD,EAAqDmwF,GAArD,EAA0DC,GAA1D,EAA+DC,GAA/D;AAEA,EAjBD,MAiBO,IAAK,KAAKK,SAAL,KAAmB,YAAxB,EAAuC;;AAE7CxT,KAAG6S,cAAH,CAAmBh3E,GAAGrtB,CAAtB,EAAyBstB,GAAGttB,CAA5B,EAA+ButB,GAAGvtB,CAAlC,EAAqC8wB,GAAG9wB,CAAxC,EAA2C,KAAKukG,OAAhD;AACA9S,KAAG4S,cAAH,CAAmBh3E,GAAGzgB,CAAtB,EAAyB0gB,GAAG1gB,CAA5B,EAA+B2gB,GAAG3gB,CAAlC,EAAqCkkB,GAAGlkB,CAAxC,EAA2C,KAAK23F,OAAhD;AACAO,KAAGT,cAAH,CAAmBh3E,GAAG/Y,CAAtB,EAAyBgZ,GAAGhZ,CAA5B,EAA+BiZ,GAAGjZ,CAAlC,EAAqCwc,GAAGxc,CAAxC,EAA2C,KAAKiwF,OAAhD;AAEA;;AAEDp5E,OAAMjd,GAAN,CACCsjF,GAAGoT,IAAH,CAASO,MAAT,CADD,EAEC1T,GAAGmT,IAAH,CAASO,MAAT,CAFD,EAGCL,GAAGF,IAAH,CAASO,MAAT,CAHD;;AAMA,QAAOh6E,KAAP;AAEA,CApFD;;AAsFA45E,iBAAiB7kG,SAAjB,CAA2B2O,IAA3B,GAAkC,UAAW9N,MAAX,EAAoB;;AAErDsgG,OAAMnhG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,MAAKspB,MAAL,GAAc,EAAd;;AAEA,MAAM,IAAIloB,IAAI,CAAR,EAAWC,IAAIrB,OAAOspB,MAAP,CAAcvpB,MAAnC,EAA2CqB,IAAIC,CAA/C,EAAkDD,GAAlD,EAAyD;;AAExD,MAAIgpB,QAAQpqB,OAAOspB,MAAP,CAAeloB,CAAf,CAAZ;;AAEA,OAAKkoB,MAAL,CAAY3oB,IAAZ,CAAkBypB,MAAMxc,KAAN,EAAlB;AAEA;;AAED,MAAKs9E,MAAL,GAAclrF,OAAOkrF,MAArB;AACA,MAAK+Y,SAAL,GAAiBjkG,OAAOikG,SAAxB;AACA,MAAKT,OAAL,GAAexjG,OAAOwjG,OAAtB;;AAEA,QAAO,IAAP;AAEA,CApBD;;AAsBAQ,iBAAiB7kG,SAAjB,CAA2BomB,MAA3B,GAAoC,YAAY;;AAE/C,KAAIiD,OAAO83E,MAAMnhG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,CAAX;;AAEAqoB,MAAKc,MAAL,GAAc,EAAd;;AAEA,MAAM,IAAIloB,IAAI,CAAR,EAAWC,IAAI,KAAKioB,MAAL,CAAYvpB,MAAjC,EAAyCqB,IAAIC,CAA7C,EAAgDD,GAAhD,EAAuD;;AAEtD,MAAIgpB,QAAQ,KAAKd,MAAL,CAAaloB,CAAb,CAAZ;AACAonB,OAAKc,MAAL,CAAY3oB,IAAZ,CAAkBypB,MAAMpZ,OAAN,EAAlB;AAEA;;AAEDwX,MAAK0iE,MAAL,GAAc,KAAKA,MAAnB;AACA1iE,MAAKy7E,SAAL,GAAiB,KAAKA,SAAtB;AACAz7E,MAAKg7E,OAAL,GAAe,KAAKA,OAApB;;AAEA,QAAOh7E,IAAP;AAEA,CAnBD;;AAqBAw7E,iBAAiB7kG,SAAjB,CAA2B+iG,QAA3B,GAAsC,UAAWC,IAAX,EAAkB;;AAEvD7B,OAAMnhG,SAAN,CAAgB+iG,QAAhB,CAAyB/hG,IAAzB,CAA+B,IAA/B,EAAqCgiG,IAArC;;AAEA,MAAK74E,MAAL,GAAc,EAAd;;AAEA,MAAM,IAAIloB,IAAI,CAAR,EAAWC,IAAI8gG,KAAK74E,MAAL,CAAYvpB,MAAjC,EAAyCqB,IAAIC,CAA7C,EAAgDD,GAAhD,EAAuD;;AAEtD,MAAIgpB,QAAQ+3E,KAAK74E,MAAL,CAAaloB,CAAb,CAAZ;AACA,OAAKkoB,MAAL,CAAY3oB,IAAZ,CAAkB,IAAI8S,OAAJ,GAAc3C,SAAd,CAAyBsZ,KAAzB,CAAlB;AAEA;;AAED,MAAK8gE,MAAL,GAAciX,KAAKjX,MAAnB;AACA,MAAK+Y,SAAL,GAAiB9B,KAAK8B,SAAtB;AACA,MAAKT,OAAL,GAAerB,KAAKqB,OAApB;;AAEA,QAAO,IAAP;AAEA,CAnBD;;AAqBA;;;;;;;AAOA,SAASa,UAAT,CAAqBv4F,CAArB,EAAwBwgB,EAAxB,EAA4BC,EAA5B,EAAgCC,EAAhC,EAAoCuD,EAApC,EAAyC;;AAExC,KAAInE,KAAK,CAAEY,KAAKF,EAAP,IAAc,GAAvB;AACA,KAAI3b,KAAK,CAAEof,KAAKxD,EAAP,IAAc,GAAvB;AACA,KAAIo1E,KAAK71F,IAAIA,CAAb;AACA,KAAIg4F,KAAKh4F,IAAI61F,EAAb;AACA,QAAO,CAAE,IAAIp1E,EAAJ,GAAS,IAAIC,EAAb,GAAkBZ,EAAlB,GAAuBjb,EAAzB,IAAgCmzF,EAAhC,GAAqC,CAAE,CAAE,CAAF,GAAMv3E,EAAN,GAAW,IAAIC,EAAf,GAAoB,IAAIZ,EAAxB,GAA6Bjb,EAA/B,IAAsCgxF,EAA3E,GAAgF/1E,KAAK9f,CAArF,GAAyFygB,EAAhG;AAEA;;AAED;;AAEA,SAAS+3E,iBAAT,CAA4Bx4F,CAA5B,EAA+BmQ,CAA/B,EAAmC;;AAElC,KAAIk2B,IAAI,IAAIrmC,CAAZ;AACA,QAAOqmC,IAAIA,CAAJ,GAAQl2B,CAAf;AAEA;;AAED,SAASsoF,iBAAT,CAA4Bz4F,CAA5B,EAA+BmQ,CAA/B,EAAmC;;AAElC,QAAO,KAAM,IAAInQ,CAAV,IAAgBA,CAAhB,GAAoBmQ,CAA3B;AAEA;;AAED,SAASuoF,iBAAT,CAA4B14F,CAA5B,EAA+BmQ,CAA/B,EAAmC;;AAElC,QAAOnQ,IAAIA,CAAJ,GAAQmQ,CAAf;AAEA;;AAED,SAASwoF,eAAT,CAA0B34F,CAA1B,EAA6BwgB,EAA7B,EAAiCC,EAAjC,EAAqCC,EAArC,EAA0C;;AAEzC,QAAO83E,kBAAmBx4F,CAAnB,EAAsBwgB,EAAtB,IAA6Bi4E,kBAAmBz4F,CAAnB,EAAsBygB,EAAtB,CAA7B,GACNi4E,kBAAmB14F,CAAnB,EAAsB0gB,EAAtB,CADD;AAGA;;AAED;;AAEA,SAASk4E,aAAT,CAAwB54F,CAAxB,EAA2BmQ,CAA3B,EAA+B;;AAE9B,KAAIk2B,IAAI,IAAIrmC,CAAZ;AACA,QAAOqmC,IAAIA,CAAJ,GAAQA,CAAR,GAAYl2B,CAAnB;AAEA;;AAED,SAAS0oF,aAAT,CAAwB74F,CAAxB,EAA2BmQ,CAA3B,EAA+B;;AAE9B,KAAIk2B,IAAI,IAAIrmC,CAAZ;AACA,QAAO,IAAIqmC,CAAJ,GAAQA,CAAR,GAAYrmC,CAAZ,GAAgBmQ,CAAvB;AAEA;;AAED,SAAS2oF,aAAT,CAAwB94F,CAAxB,EAA2BmQ,CAA3B,EAA+B;;AAE9B,QAAO,KAAM,IAAInQ,CAAV,IAAgBA,CAAhB,GAAoBA,CAApB,GAAwBmQ,CAA/B;AAEA;;AAED,SAAS4oF,aAAT,CAAwB/4F,CAAxB,EAA2BmQ,CAA3B,EAA+B;;AAE9B,QAAOnQ,IAAIA,CAAJ,GAAQA,CAAR,GAAYmQ,CAAnB;AAEA;;AAED,SAAS6oF,WAAT,CAAsBh5F,CAAtB,EAAyBwgB,EAAzB,EAA6BC,EAA7B,EAAiCC,EAAjC,EAAqCuD,EAArC,EAA0C;;AAEzC,QAAO20E,cAAe54F,CAAf,EAAkBwgB,EAAlB,IAAyBq4E,cAAe74F,CAAf,EAAkBygB,EAAlB,CAAzB,GAAkDq4E,cAAe94F,CAAf,EAAkB0gB,EAAlB,CAAlD,GACNq4E,cAAe/4F,CAAf,EAAkBikB,EAAlB,CADD;AAGA;;AAED,SAASg1E,gBAAT,CAA2Bn5E,EAA3B,EAA+Bjb,EAA/B,EAAmCC,EAAnC,EAAuCo0F,EAAvC,EAA4C;;AAE3C1E,OAAMngG,IAAN,CAAY,IAAZ;;AAEA,MAAKG,IAAL,GAAY,kBAAZ;;AAEA,MAAKsrB,EAAL,GAAUA,MAAM,IAAI3e,OAAJ,EAAhB;AACA,MAAK0D,EAAL,GAAUA,MAAM,IAAI1D,OAAJ,EAAhB;AACA,MAAK2D,EAAL,GAAUA,MAAM,IAAI3D,OAAJ,EAAhB;AACA,MAAK+3F,EAAL,GAAUA,MAAM,IAAI/3F,OAAJ,EAAhB;AAEA;;AAED83F,iBAAiB5lG,SAAjB,GAA6BC,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAA7B;AACA4lG,iBAAiB5lG,SAAjB,CAA2B0O,WAA3B,GAAyCk3F,gBAAzC;;AAEAA,iBAAiB5lG,SAAjB,CAA2B8lG,kBAA3B,GAAgD,IAAhD;;AAEAF,iBAAiB5lG,SAAjB,CAA2BqhG,QAA3B,GAAsC,UAAW10F,CAAX,EAAc20F,cAAd,EAA+B;;AAEpE,KAAIr2E,QAAQq2E,kBAAkB,IAAIxzF,OAAJ,EAA9B;;AAEA,KAAI2e,KAAK,KAAKA,EAAd;AAAA,KAAkBjb,KAAK,KAAKA,EAA5B;AAAA,KAAgCC,KAAK,KAAKA,EAA1C;AAAA,KAA8Co0F,KAAK,KAAKA,EAAxD;;AAEA56E,OAAMjd,GAAN,CACC23F,YAAah5F,CAAb,EAAgB8f,GAAG3sB,CAAnB,EAAsB0R,GAAG1R,CAAzB,EAA4B2R,GAAG3R,CAA/B,EAAkC+lG,GAAG/lG,CAArC,CADD,EAEC6lG,YAAah5F,CAAb,EAAgB8f,GAAG/f,CAAnB,EAAsB8E,GAAG9E,CAAzB,EAA4B+E,GAAG/E,CAA/B,EAAkCm5F,GAAGn5F,CAArC,CAFD;;AAKA,QAAOue,KAAP;AAEA,CAbD;;AAeA26E,iBAAiB5lG,SAAjB,CAA2B2O,IAA3B,GAAkC,UAAW9N,MAAX,EAAoB;;AAErDsgG,OAAMnhG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,MAAK4rB,EAAL,CAAQ9d,IAAR,CAAc9N,OAAO4rB,EAArB;AACA,MAAKjb,EAAL,CAAQ7C,IAAR,CAAc9N,OAAO2Q,EAArB;AACA,MAAKC,EAAL,CAAQ9C,IAAR,CAAc9N,OAAO4Q,EAArB;AACA,MAAKo0F,EAAL,CAAQl3F,IAAR,CAAc9N,OAAOglG,EAArB;;AAEA,QAAO,IAAP;AAEA,CAXD;;AAaAD,iBAAiB5lG,SAAjB,CAA2BomB,MAA3B,GAAoC,YAAY;;AAE/C,KAAIiD,OAAO83E,MAAMnhG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,CAAX;;AAEAqoB,MAAKoD,EAAL,GAAU,KAAKA,EAAL,CAAQ5a,OAAR,EAAV;AACAwX,MAAK7X,EAAL,GAAU,KAAKA,EAAL,CAAQK,OAAR,EAAV;AACAwX,MAAK5X,EAAL,GAAU,KAAKA,EAAL,CAAQI,OAAR,EAAV;AACAwX,MAAKw8E,EAAL,GAAU,KAAKA,EAAL,CAAQh0F,OAAR,EAAV;;AAEA,QAAOwX,IAAP;AAEA,CAXD;;AAaAu8E,iBAAiB5lG,SAAjB,CAA2B+iG,QAA3B,GAAsC,UAAWC,IAAX,EAAkB;;AAEvD7B,OAAMnhG,SAAN,CAAgB+iG,QAAhB,CAAyB/hG,IAAzB,CAA+B,IAA/B,EAAqCgiG,IAArC;;AAEA,MAAKv2E,EAAL,CAAQ9a,SAAR,CAAmBqxF,KAAKv2E,EAAxB;AACA,MAAKjb,EAAL,CAAQG,SAAR,CAAmBqxF,KAAKxxF,EAAxB;AACA,MAAKC,EAAL,CAAQE,SAAR,CAAmBqxF,KAAKvxF,EAAxB;AACA,MAAKo0F,EAAL,CAAQl0F,SAAR,CAAmBqxF,KAAK6C,EAAxB;;AAEA,QAAO,IAAP;AAEA,CAXD;;AAaA,SAASE,iBAAT,CAA4Bt5E,EAA5B,EAAgCjb,EAAhC,EAAoCC,EAApC,EAAwCo0F,EAAxC,EAA6C;;AAE5C1E,OAAMngG,IAAN,CAAY,IAAZ;;AAEA,MAAKG,IAAL,GAAY,mBAAZ;;AAEA,MAAKsrB,EAAL,GAAUA,MAAM,IAAInY,OAAJ,EAAhB;AACA,MAAK9C,EAAL,GAAUA,MAAM,IAAI8C,OAAJ,EAAhB;AACA,MAAK7C,EAAL,GAAUA,MAAM,IAAI6C,OAAJ,EAAhB;AACA,MAAKuxF,EAAL,GAAUA,MAAM,IAAIvxF,OAAJ,EAAhB;AAEA;;AAEDyxF,kBAAkB/lG,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAA9B;AACA+lG,kBAAkB/lG,SAAlB,CAA4B0O,WAA5B,GAA0Cq3F,iBAA1C;;AAEAA,kBAAkB/lG,SAAlB,CAA4BgmG,mBAA5B,GAAkD,IAAlD;;AAEAD,kBAAkB/lG,SAAlB,CAA4BqhG,QAA5B,GAAuC,UAAW10F,CAAX,EAAc20F,cAAd,EAA+B;;AAErE,KAAIr2E,QAAQq2E,kBAAkB,IAAIhtF,OAAJ,EAA9B;;AAEA,KAAImY,KAAK,KAAKA,EAAd;AAAA,KAAkBjb,KAAK,KAAKA,EAA5B;AAAA,KAAgCC,KAAK,KAAKA,EAA1C;AAAA,KAA8Co0F,KAAK,KAAKA,EAAxD;;AAEA56E,OAAMjd,GAAN,CACC23F,YAAah5F,CAAb,EAAgB8f,GAAG3sB,CAAnB,EAAsB0R,GAAG1R,CAAzB,EAA4B2R,GAAG3R,CAA/B,EAAkC+lG,GAAG/lG,CAArC,CADD,EAEC6lG,YAAah5F,CAAb,EAAgB8f,GAAG/f,CAAnB,EAAsB8E,GAAG9E,CAAzB,EAA4B+E,GAAG/E,CAA/B,EAAkCm5F,GAAGn5F,CAArC,CAFD,EAGCi5F,YAAah5F,CAAb,EAAgB8f,GAAGrY,CAAnB,EAAsB5C,GAAG4C,CAAzB,EAA4B3C,GAAG2C,CAA/B,EAAkCyxF,GAAGzxF,CAArC,CAHD;;AAMA,QAAO6W,KAAP;AAEA,CAdD;;AAgBA86E,kBAAkB/lG,SAAlB,CAA4B2O,IAA5B,GAAmC,UAAW9N,MAAX,EAAoB;;AAEtDsgG,OAAMnhG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,MAAK4rB,EAAL,CAAQ9d,IAAR,CAAc9N,OAAO4rB,EAArB;AACA,MAAKjb,EAAL,CAAQ7C,IAAR,CAAc9N,OAAO2Q,EAArB;AACA,MAAKC,EAAL,CAAQ9C,IAAR,CAAc9N,OAAO4Q,EAArB;AACA,MAAKo0F,EAAL,CAAQl3F,IAAR,CAAc9N,OAAOglG,EAArB;;AAEA,QAAO,IAAP;AAEA,CAXD;;AAaAE,kBAAkB/lG,SAAlB,CAA4BomB,MAA5B,GAAqC,YAAY;;AAEhD,KAAIiD,OAAO83E,MAAMnhG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,CAAX;;AAEAqoB,MAAKoD,EAAL,GAAU,KAAKA,EAAL,CAAQ5a,OAAR,EAAV;AACAwX,MAAK7X,EAAL,GAAU,KAAKA,EAAL,CAAQK,OAAR,EAAV;AACAwX,MAAK5X,EAAL,GAAU,KAAKA,EAAL,CAAQI,OAAR,EAAV;AACAwX,MAAKw8E,EAAL,GAAU,KAAKA,EAAL,CAAQh0F,OAAR,EAAV;;AAEA,QAAOwX,IAAP;AAEA,CAXD;;AAaA08E,kBAAkB/lG,SAAlB,CAA4B+iG,QAA5B,GAAuC,UAAWC,IAAX,EAAkB;;AAExD7B,OAAMnhG,SAAN,CAAgB+iG,QAAhB,CAAyB/hG,IAAzB,CAA+B,IAA/B,EAAqCgiG,IAArC;;AAEA,MAAKv2E,EAAL,CAAQ9a,SAAR,CAAmBqxF,KAAKv2E,EAAxB;AACA,MAAKjb,EAAL,CAAQG,SAAR,CAAmBqxF,KAAKxxF,EAAxB;AACA,MAAKC,EAAL,CAAQE,SAAR,CAAmBqxF,KAAKvxF,EAAxB;AACA,MAAKo0F,EAAL,CAAQl0F,SAAR,CAAmBqxF,KAAK6C,EAAxB;;AAEA,QAAO,IAAP;AAEA,CAXD;;AAaA,SAASI,SAAT,CAAoBz0F,EAApB,EAAwBC,EAAxB,EAA6B;;AAE5B0vF,OAAMngG,IAAN,CAAY,IAAZ;;AAEA,MAAKG,IAAL,GAAY,WAAZ;;AAEA,MAAKqQ,EAAL,GAAUA,MAAM,IAAI1D,OAAJ,EAAhB;AACA,MAAK2D,EAAL,GAAUA,MAAM,IAAI3D,OAAJ,EAAhB;AAEA;;AAEDm4F,UAAUjmG,SAAV,GAAsBC,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAAtB;AACAimG,UAAUjmG,SAAV,CAAoB0O,WAApB,GAAkCu3F,SAAlC;;AAEAA,UAAUjmG,SAAV,CAAoBkmG,WAApB,GAAkC,IAAlC;;AAEAD,UAAUjmG,SAAV,CAAoBqhG,QAApB,GAA+B,UAAW10F,CAAX,EAAc20F,cAAd,EAA+B;;AAE7D,KAAIr2E,QAAQq2E,kBAAkB,IAAIxzF,OAAJ,EAA9B;;AAEA,KAAKnB,MAAM,CAAX,EAAe;;AAEdse,QAAMtc,IAAN,CAAY,KAAK8C,EAAjB;AAEA,EAJD,MAIO;;AAENwZ,QAAMtc,IAAN,CAAY,KAAK8C,EAAjB,EAAsBlC,GAAtB,CAA2B,KAAKiC,EAAhC;AACAyZ,QAAMtb,cAAN,CAAsBhD,CAAtB,EAA0BkC,GAA1B,CAA+B,KAAK2C,EAApC;AAEA;;AAED,QAAOyZ,KAAP;AAEA,CAjBD;;AAmBA;;AAEAg7E,UAAUjmG,SAAV,CAAoB2sF,UAApB,GAAiC,UAAW5yD,CAAX,EAAcunE,cAAd,EAA+B;;AAE/D,QAAO,KAAKD,QAAL,CAAetnE,CAAf,EAAkBunE,cAAlB,CAAP;AAEA,CAJD;;AAMA2E,UAAUjmG,SAAV,CAAoBuiG,UAApB,GAAiC,YAAW,OAAU;;AAErD,KAAI4D,UAAU,KAAK10F,EAAL,CAAQhD,KAAR,GAAgBc,GAAhB,CAAqB,KAAKiC,EAA1B,CAAd;;AAEA,QAAO20F,QAAQt1F,SAAR,EAAP;AAEA,CAND;;AAQAo1F,UAAUjmG,SAAV,CAAoB2O,IAApB,GAA2B,UAAW9N,MAAX,EAAoB;;AAE9CsgG,OAAMnhG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,MAAK2Q,EAAL,CAAQ7C,IAAR,CAAc9N,OAAO2Q,EAArB;AACA,MAAKC,EAAL,CAAQ9C,IAAR,CAAc9N,OAAO4Q,EAArB;;AAEA,QAAO,IAAP;AAEA,CATD;;AAWAw0F,UAAUjmG,SAAV,CAAoBomB,MAApB,GAA6B,YAAY;;AAExC,KAAIiD,OAAO83E,MAAMnhG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,CAAX;;AAEAqoB,MAAK7X,EAAL,GAAU,KAAKA,EAAL,CAAQK,OAAR,EAAV;AACAwX,MAAK5X,EAAL,GAAU,KAAKA,EAAL,CAAQI,OAAR,EAAV;;AAEA,QAAOwX,IAAP;AAEA,CATD;;AAWA48E,UAAUjmG,SAAV,CAAoB+iG,QAApB,GAA+B,UAAWC,IAAX,EAAkB;;AAEhD7B,OAAMnhG,SAAN,CAAgB+iG,QAAhB,CAAyB/hG,IAAzB,CAA+B,IAA/B,EAAqCgiG,IAArC;;AAEA,MAAKxxF,EAAL,CAAQG,SAAR,CAAmBqxF,KAAKxxF,EAAxB;AACA,MAAKC,EAAL,CAAQE,SAAR,CAAmBqxF,KAAKvxF,EAAxB;;AAEA,QAAO,IAAP;AAEA,CATD;;AAWA,SAAS20F,UAAT,CAAqB50F,EAArB,EAAyBC,EAAzB,EAA8B;;AAE7B0vF,OAAMngG,IAAN,CAAY,IAAZ;;AAEA,MAAKG,IAAL,GAAY,YAAZ;;AAEA,MAAKqQ,EAAL,GAAUA,MAAM,IAAI8C,OAAJ,EAAhB;AACA,MAAK7C,EAAL,GAAUA,MAAM,IAAI6C,OAAJ,EAAhB;AAEA;;AAED8xF,WAAWpmG,SAAX,GAAuBC,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAAvB;AACAomG,WAAWpmG,SAAX,CAAqB0O,WAArB,GAAmC03F,UAAnC;;AAEAA,WAAWpmG,SAAX,CAAqBqmG,YAArB,GAAoC,IAApC;;AAEAD,WAAWpmG,SAAX,CAAqBqhG,QAArB,GAAgC,UAAW10F,CAAX,EAAc20F,cAAd,EAA+B;;AAE9D,KAAIr2E,QAAQq2E,kBAAkB,IAAIhtF,OAAJ,EAA9B;;AAEA,KAAK3H,MAAM,CAAX,EAAe;;AAEdse,QAAMtc,IAAN,CAAY,KAAK8C,EAAjB;AAEA,EAJD,MAIO;;AAENwZ,QAAMtc,IAAN,CAAY,KAAK8C,EAAjB,EAAsBlC,GAAtB,CAA2B,KAAKiC,EAAhC;AACAyZ,QAAMtb,cAAN,CAAsBhD,CAAtB,EAA0BkC,GAA1B,CAA+B,KAAK2C,EAApC;AAEA;;AAED,QAAOyZ,KAAP;AAEA,CAjBD;;AAmBA;;AAEAm7E,WAAWpmG,SAAX,CAAqB2sF,UAArB,GAAkC,UAAW5yD,CAAX,EAAcunE,cAAd,EAA+B;;AAEhE,QAAO,KAAKD,QAAL,CAAetnE,CAAf,EAAkBunE,cAAlB,CAAP;AAEA,CAJD;;AAMA8E,WAAWpmG,SAAX,CAAqB2O,IAArB,GAA4B,UAAW9N,MAAX,EAAoB;;AAE/CsgG,OAAMnhG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,MAAK2Q,EAAL,CAAQ7C,IAAR,CAAc9N,OAAO2Q,EAArB;AACA,MAAKC,EAAL,CAAQ9C,IAAR,CAAc9N,OAAO4Q,EAArB;;AAEA,QAAO,IAAP;AAEA,CATD;;AAWA20F,WAAWpmG,SAAX,CAAqBomB,MAArB,GAA8B,YAAY;;AAEzC,KAAIiD,OAAO83E,MAAMnhG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,CAAX;;AAEAqoB,MAAK7X,EAAL,GAAU,KAAKA,EAAL,CAAQK,OAAR,EAAV;AACAwX,MAAK5X,EAAL,GAAU,KAAKA,EAAL,CAAQI,OAAR,EAAV;;AAEA,QAAOwX,IAAP;AAEA,CATD;;AAWA+8E,WAAWpmG,SAAX,CAAqB+iG,QAArB,GAAgC,UAAWC,IAAX,EAAkB;;AAEjD7B,OAAMnhG,SAAN,CAAgB+iG,QAAhB,CAAyB/hG,IAAzB,CAA+B,IAA/B,EAAqCgiG,IAArC;;AAEA,MAAKxxF,EAAL,CAAQG,SAAR,CAAmBqxF,KAAKxxF,EAAxB;AACA,MAAKC,EAAL,CAAQE,SAAR,CAAmBqxF,KAAKvxF,EAAxB;;AAEA,QAAO,IAAP;AAEA,CATD;;AAWA,SAAS60F,oBAAT,CAA+B75E,EAA/B,EAAmCjb,EAAnC,EAAuCC,EAAvC,EAA4C;;AAE3C0vF,OAAMngG,IAAN,CAAY,IAAZ;;AAEA,MAAKG,IAAL,GAAY,sBAAZ;;AAEA,MAAKsrB,EAAL,GAAUA,MAAM,IAAI3e,OAAJ,EAAhB;AACA,MAAK0D,EAAL,GAAUA,MAAM,IAAI1D,OAAJ,EAAhB;AACA,MAAK2D,EAAL,GAAUA,MAAM,IAAI3D,OAAJ,EAAhB;AAEA;;AAEDw4F,qBAAqBtmG,SAArB,GAAiCC,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAAjC;AACAsmG,qBAAqBtmG,SAArB,CAA+B0O,WAA/B,GAA6C43F,oBAA7C;;AAEAA,qBAAqBtmG,SAArB,CAA+BumG,sBAA/B,GAAwD,IAAxD;;AAEAD,qBAAqBtmG,SAArB,CAA+BqhG,QAA/B,GAA0C,UAAW10F,CAAX,EAAc20F,cAAd,EAA+B;;AAExE,KAAIr2E,QAAQq2E,kBAAkB,IAAIxzF,OAAJ,EAA9B;;AAEA,KAAI2e,KAAK,KAAKA,EAAd;AAAA,KAAkBjb,KAAK,KAAKA,EAA5B;AAAA,KAAgCC,KAAK,KAAKA,EAA1C;;AAEAwZ,OAAMjd,GAAN,CACCs3F,gBAAiB34F,CAAjB,EAAoB8f,GAAG3sB,CAAvB,EAA0B0R,GAAG1R,CAA7B,EAAgC2R,GAAG3R,CAAnC,CADD,EAECwlG,gBAAiB34F,CAAjB,EAAoB8f,GAAG/f,CAAvB,EAA0B8E,GAAG9E,CAA7B,EAAgC+E,GAAG/E,CAAnC,CAFD;;AAKA,QAAOue,KAAP;AAEA,CAbD;;AAeAq7E,qBAAqBtmG,SAArB,CAA+B2O,IAA/B,GAAsC,UAAW9N,MAAX,EAAoB;;AAEzDsgG,OAAMnhG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,MAAK4rB,EAAL,CAAQ9d,IAAR,CAAc9N,OAAO4rB,EAArB;AACA,MAAKjb,EAAL,CAAQ7C,IAAR,CAAc9N,OAAO2Q,EAArB;AACA,MAAKC,EAAL,CAAQ9C,IAAR,CAAc9N,OAAO4Q,EAArB;;AAEA,QAAO,IAAP;AAEA,CAVD;;AAYA60F,qBAAqBtmG,SAArB,CAA+BomB,MAA/B,GAAwC,YAAY;;AAEnD,KAAIiD,OAAO83E,MAAMnhG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,CAAX;;AAEAqoB,MAAKoD,EAAL,GAAU,KAAKA,EAAL,CAAQ5a,OAAR,EAAV;AACAwX,MAAK7X,EAAL,GAAU,KAAKA,EAAL,CAAQK,OAAR,EAAV;AACAwX,MAAK5X,EAAL,GAAU,KAAKA,EAAL,CAAQI,OAAR,EAAV;;AAEA,QAAOwX,IAAP;AAEA,CAVD;;AAYAi9E,qBAAqBtmG,SAArB,CAA+B+iG,QAA/B,GAA0C,UAAWC,IAAX,EAAkB;;AAE3D7B,OAAMnhG,SAAN,CAAgB+iG,QAAhB,CAAyB/hG,IAAzB,CAA+B,IAA/B,EAAqCgiG,IAArC;;AAEA,MAAKv2E,EAAL,CAAQ9a,SAAR,CAAmBqxF,KAAKv2E,EAAxB;AACA,MAAKjb,EAAL,CAAQG,SAAR,CAAmBqxF,KAAKxxF,EAAxB;AACA,MAAKC,EAAL,CAAQE,SAAR,CAAmBqxF,KAAKvxF,EAAxB;;AAEA,QAAO,IAAP;AAEA,CAVD;;AAYA,SAAS+0F,qBAAT,CAAgC/5E,EAAhC,EAAoCjb,EAApC,EAAwCC,EAAxC,EAA6C;;AAE5C0vF,OAAMngG,IAAN,CAAY,IAAZ;;AAEA,MAAKG,IAAL,GAAY,uBAAZ;;AAEA,MAAKsrB,EAAL,GAAUA,MAAM,IAAInY,OAAJ,EAAhB;AACA,MAAK9C,EAAL,GAAUA,MAAM,IAAI8C,OAAJ,EAAhB;AACA,MAAK7C,EAAL,GAAUA,MAAM,IAAI6C,OAAJ,EAAhB;AAEA;;AAEDkyF,sBAAsBxmG,SAAtB,GAAkCC,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAAlC;AACAwmG,sBAAsBxmG,SAAtB,CAAgC0O,WAAhC,GAA8C83F,qBAA9C;;AAEAA,sBAAsBxmG,SAAtB,CAAgCymG,uBAAhC,GAA0D,IAA1D;;AAEAD,sBAAsBxmG,SAAtB,CAAgCqhG,QAAhC,GAA2C,UAAW10F,CAAX,EAAc20F,cAAd,EAA+B;;AAEzE,KAAIr2E,QAAQq2E,kBAAkB,IAAIhtF,OAAJ,EAA9B;;AAEA,KAAImY,KAAK,KAAKA,EAAd;AAAA,KAAkBjb,KAAK,KAAKA,EAA5B;AAAA,KAAgCC,KAAK,KAAKA,EAA1C;;AAEAwZ,OAAMjd,GAAN,CACCs3F,gBAAiB34F,CAAjB,EAAoB8f,GAAG3sB,CAAvB,EAA0B0R,GAAG1R,CAA7B,EAAgC2R,GAAG3R,CAAnC,CADD,EAECwlG,gBAAiB34F,CAAjB,EAAoB8f,GAAG/f,CAAvB,EAA0B8E,GAAG9E,CAA7B,EAAgC+E,GAAG/E,CAAnC,CAFD,EAGC44F,gBAAiB34F,CAAjB,EAAoB8f,GAAGrY,CAAvB,EAA0B5C,GAAG4C,CAA7B,EAAgC3C,GAAG2C,CAAnC,CAHD;;AAMA,QAAO6W,KAAP;AAEA,CAdD;;AAgBAu7E,sBAAsBxmG,SAAtB,CAAgC2O,IAAhC,GAAuC,UAAW9N,MAAX,EAAoB;;AAE1DsgG,OAAMnhG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,MAAK4rB,EAAL,CAAQ9d,IAAR,CAAc9N,OAAO4rB,EAArB;AACA,MAAKjb,EAAL,CAAQ7C,IAAR,CAAc9N,OAAO2Q,EAArB;AACA,MAAKC,EAAL,CAAQ9C,IAAR,CAAc9N,OAAO4Q,EAArB;;AAEA,QAAO,IAAP;AAEA,CAVD;;AAYA+0F,sBAAsBxmG,SAAtB,CAAgComB,MAAhC,GAAyC,YAAY;;AAEpD,KAAIiD,OAAO83E,MAAMnhG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,CAAX;;AAEAqoB,MAAKoD,EAAL,GAAU,KAAKA,EAAL,CAAQ5a,OAAR,EAAV;AACAwX,MAAK7X,EAAL,GAAU,KAAKA,EAAL,CAAQK,OAAR,EAAV;AACAwX,MAAK5X,EAAL,GAAU,KAAKA,EAAL,CAAQI,OAAR,EAAV;;AAEA,QAAOwX,IAAP;AAEA,CAVD;;AAYAm9E,sBAAsBxmG,SAAtB,CAAgC+iG,QAAhC,GAA2C,UAAWC,IAAX,EAAkB;;AAE5D7B,OAAMnhG,SAAN,CAAgB+iG,QAAhB,CAAyB/hG,IAAzB,CAA+B,IAA/B,EAAqCgiG,IAArC;;AAEA,MAAKv2E,EAAL,CAAQ9a,SAAR,CAAmBqxF,KAAKv2E,EAAxB;AACA,MAAKjb,EAAL,CAAQG,SAAR,CAAmBqxF,KAAKxxF,EAAxB;AACA,MAAKC,EAAL,CAAQE,SAAR,CAAmBqxF,KAAKvxF,EAAxB;;AAEA,QAAO,IAAP;AAEA,CAVD;;AAYA,SAASi1F,WAAT,CAAsBv8E,MAAtB,CAA6B,sBAA7B,EAAsD;;AAErDg3E,OAAMngG,IAAN,CAAY,IAAZ;;AAEA,MAAKG,IAAL,GAAY,aAAZ;;AAEA,MAAKgpB,MAAL,GAAcA,UAAU,EAAxB;AAEA;;AAEDu8E,YAAY1mG,SAAZ,GAAwBC,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAAxB;AACA0mG,YAAY1mG,SAAZ,CAAsB0O,WAAtB,GAAoCg4F,WAApC;;AAEAA,YAAY1mG,SAAZ,CAAsB2mG,aAAtB,GAAsC,IAAtC;;AAEAD,YAAY1mG,SAAZ,CAAsBqhG,QAAtB,GAAiC,UAAW10F,CAAX,EAAc20F,cAAd,EAA+B;;AAE/D,KAAIr2E,QAAQq2E,kBAAkB,IAAIxzF,OAAJ,EAA9B;;AAEA,KAAIqc,SAAS,KAAKA,MAAlB;AACA,KAAIrN,IAAI,CAAEqN,OAAOvpB,MAAP,GAAgB,CAAlB,IAAwB+L,CAAhC;;AAEA,KAAIq4F,WAAWzlG,KAAKK,KAAL,CAAYkd,CAAZ,CAAf;AACA,KAAImoF,SAASnoF,IAAIkoF,QAAjB;;AAEA,KAAI73E,KAAKhD,OAAQ66E,aAAa,CAAb,GAAiBA,QAAjB,GAA4BA,WAAW,CAA/C,CAAT;AACA,KAAI53E,KAAKjD,OAAQ66E,QAAR,CAAT;AACA,KAAI33E,KAAKlD,OAAQ66E,WAAW76E,OAAOvpB,MAAP,GAAgB,CAA3B,GAA+BupB,OAAOvpB,MAAP,GAAgB,CAA/C,GAAmDokG,WAAW,CAAtE,CAAT;AACA,KAAIp0E,KAAKzG,OAAQ66E,WAAW76E,OAAOvpB,MAAP,GAAgB,CAA3B,GAA+BupB,OAAOvpB,MAAP,GAAgB,CAA/C,GAAmDokG,WAAW,CAAtE,CAAT;;AAEA/5E,OAAMjd,GAAN,CACCk3F,WAAYD,MAAZ,EAAoB93E,GAAGrtB,CAAvB,EAA0BstB,GAAGttB,CAA7B,EAAgCutB,GAAGvtB,CAAnC,EAAsC8wB,GAAG9wB,CAAzC,CADD,EAEColG,WAAYD,MAAZ,EAAoB93E,GAAGzgB,CAAvB,EAA0B0gB,GAAG1gB,CAA7B,EAAgC2gB,GAAG3gB,CAAnC,EAAsCkkB,GAAGlkB,CAAzC,CAFD;;AAKA,QAAOue,KAAP;AAEA,CAtBD;;AAwBAy7E,YAAY1mG,SAAZ,CAAsB2O,IAAtB,GAA6B,UAAW9N,MAAX,EAAoB;;AAEhDsgG,OAAMnhG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,MAAKspB,MAAL,GAAc,EAAd;;AAEA,MAAM,IAAIloB,IAAI,CAAR,EAAWC,IAAIrB,OAAOspB,MAAP,CAAcvpB,MAAnC,EAA2CqB,IAAIC,CAA/C,EAAkDD,GAAlD,EAAyD;;AAExD,MAAIgpB,QAAQpqB,OAAOspB,MAAP,CAAeloB,CAAf,CAAZ;;AAEA,OAAKkoB,MAAL,CAAY3oB,IAAZ,CAAkBypB,MAAMxc,KAAN,EAAlB;AAEA;;AAED,QAAO,IAAP;AAEA,CAhBD;;AAkBAi4F,YAAY1mG,SAAZ,CAAsBomB,MAAtB,GAA+B,YAAY;;AAE1C,KAAIiD,OAAO83E,MAAMnhG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,CAAX;;AAEAqoB,MAAKc,MAAL,GAAc,EAAd;;AAEA,MAAM,IAAIloB,IAAI,CAAR,EAAWC,IAAI,KAAKioB,MAAL,CAAYvpB,MAAjC,EAAyCqB,IAAIC,CAA7C,EAAgDD,GAAhD,EAAuD;;AAEtD,MAAIgpB,QAAQ,KAAKd,MAAL,CAAaloB,CAAb,CAAZ;AACAonB,OAAKc,MAAL,CAAY3oB,IAAZ,CAAkBypB,MAAMpZ,OAAN,EAAlB;AAEA;;AAED,QAAOwX,IAAP;AAEA,CAfD;;AAiBAq9E,YAAY1mG,SAAZ,CAAsB+iG,QAAtB,GAAiC,UAAWC,IAAX,EAAkB;;AAElD7B,OAAMnhG,SAAN,CAAgB+iG,QAAhB,CAAyB/hG,IAAzB,CAA+B,IAA/B,EAAqCgiG,IAArC;;AAEA,MAAK74E,MAAL,GAAc,EAAd;;AAEA,MAAM,IAAIloB,IAAI,CAAR,EAAWC,IAAI8gG,KAAK74E,MAAL,CAAYvpB,MAAjC,EAAyCqB,IAAIC,CAA7C,EAAgDD,GAAhD,EAAuD;;AAEtD,MAAIgpB,QAAQ+3E,KAAK74E,MAAL,CAAaloB,CAAb,CAAZ;AACA,OAAKkoB,MAAL,CAAY3oB,IAAZ,CAAkB,IAAIsM,OAAJ,GAAc6D,SAAd,CAAyBsZ,KAAzB,CAAlB;AAEA;;AAED,QAAO,IAAP;AAEA,CAfD;;AAmBA,IAAI27E,SAAS,aAAa3mG,OAAOm8F,MAAP,CAAc;AACvC0H,WAAUA,QAD6B;AAEvCe,mBAAkBA,gBAFqB;AAGvCe,mBAAkBA,gBAHqB;AAIvCG,oBAAmBA,iBAJoB;AAKvC9C,eAAcA,YALyB;AAMvCgD,YAAWA,SAN4B;AAOvCG,aAAYA,UAP2B;AAQvCE,uBAAsBA,oBARiB;AASvCE,wBAAuBA,qBATgB;AAUvCE,cAAaA;AAV0B,CAAd,CAA1B;;AAaA;;;;;AAKA;;;;;AAKA,SAASG,SAAT,GAAqB;;AAEpB1F,OAAMngG,IAAN,CAAY,IAAZ;;AAEA,MAAKG,IAAL,GAAY,WAAZ;;AAEA,MAAK2lG,MAAL,GAAc,EAAd;AACA,MAAKC,SAAL,GAAiB,KAAjB,CAPoB,CAOI;AAExB;;AAEDF,UAAU7mG,SAAV,GAAsBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAAf,EAAiD;;AAEtE0O,cAAam4F,SAFyD;;AAItEh4F,MAAK,UAAWm4F,KAAX,EAAmB;;AAEvB,OAAKF,MAAL,CAAYtlG,IAAZ,CAAkBwlG,KAAlB;AAEA,EARqE;;AAUtEC,YAAW,YAAY;;AAEtB;AACA,MAAIC,aAAa,KAAKJ,MAAL,CAAa,CAAb,EAAiBzF,QAAjB,CAA2B,CAA3B,CAAjB;AACA,MAAI8F,WAAW,KAAKL,MAAL,CAAa,KAAKA,MAAL,CAAYlmG,MAAZ,GAAqB,CAAlC,EAAsCygG,QAAtC,CAAgD,CAAhD,CAAf;;AAEA,MAAK,CAAE6F,WAAWx1F,MAAX,CAAmBy1F,QAAnB,CAAP,EAAuC;;AAEtC,QAAKL,MAAL,CAAYtlG,IAAZ,CAAkB,IAAIykG,SAAJ,CAAekB,QAAf,EAAyBD,UAAzB,CAAlB;AAEA;AAED,EAtBqE;;AAwBtE;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA7F,WAAU,UAAW10F,CAAX,EAAe;;AAExB,MAAIkI,IAAIlI,IAAI,KAAK+0F,SAAL,EAAZ;AACA,MAAI0F,eAAe,KAAKC,eAAL,EAAnB;AACA,MAAIplG,IAAI,CAAR;;AAEA;;AAEA,SAAQA,IAAImlG,aAAaxmG,MAAzB,EAAkC;;AAEjC,OAAKwmG,aAAcnlG,CAAd,KAAqB4S,CAA1B,EAA8B;;AAE7B,QAAI48B,OAAO21D,aAAcnlG,CAAd,IAAoB4S,CAA/B;AACA,QAAImyF,QAAQ,KAAKF,MAAL,CAAa7kG,CAAb,CAAZ;;AAEA,QAAIogG,gBAAgB2E,MAAMtF,SAAN,EAApB;AACA,QAAI3nE,IAAIsoE,kBAAkB,CAAlB,GAAsB,CAAtB,GAA0B,IAAI5wD,OAAO4wD,aAA7C;;AAEA,WAAO2E,MAAMra,UAAN,CAAkB5yD,CAAlB,CAAP;AAEA;;AAED93B;AAEA;;AAED,SAAO,IAAP;;AAEA;AAEA,EA/DqE;;AAiEtE;AACA;AACA;;AAEAy/F,YAAW,YAAY;;AAEtB,MAAI4F,OAAO,KAAKD,eAAL,EAAX;AACA,SAAOC,KAAMA,KAAK1mG,MAAL,GAAc,CAApB,CAAP;AAEA,EA1EqE;;AA4EtE;AACAmhG,mBAAkB,YAAY;;AAE7B,OAAKprD,WAAL,GAAmB,IAAnB;AACA,OAAK4wD,YAAL,GAAoB,IAApB;AACA,OAAKF,eAAL;AAEA,EAnFqE;;AAqFtE;AACA;;AAEAA,kBAAiB,YAAY;;AAE5B;;AAEA,MAAK,KAAKE,YAAL,IAAqB,KAAKA,YAAL,CAAkB3mG,MAAlB,KAA6B,KAAKkmG,MAAL,CAAYlmG,MAAnE,EAA4E;;AAE3E,UAAO,KAAK2mG,YAAZ;AAEA;;AAED;AACA;;AAEA,MAAI5F,UAAU,EAAd;AAAA,MAAkB6F,OAAO,CAAzB;;AAEA,OAAM,IAAIvlG,IAAI,CAAR,EAAWC,IAAI,KAAK4kG,MAAL,CAAYlmG,MAAjC,EAAyCqB,IAAIC,CAA7C,EAAgDD,GAAhD,EAAuD;;AAEtDulG,WAAQ,KAAKV,MAAL,CAAa7kG,CAAb,EAAiBy/F,SAAjB,EAAR;AACAC,WAAQngG,IAAR,CAAcgmG,IAAd;AAEA;;AAED,OAAKD,YAAL,GAAoB5F,OAApB;;AAEA,SAAOA,OAAP;AAEA,EAlHqE;;AAoHtE5N,kBAAiB,UAAW0N,SAAX,EAAuB;;AAEvC,MAAKA,cAAcniG,SAAnB,EAA+BmiG,YAAY,EAAZ;;AAE/B,MAAIt3E,SAAS,EAAb;;AAEA,OAAM,IAAIloB,IAAI,CAAd,EAAiBA,KAAKw/F,SAAtB,EAAiCx/F,GAAjC,EAAwC;;AAEvCkoB,UAAO3oB,IAAP,CAAa,KAAK6/F,QAAL,CAAep/F,IAAIw/F,SAAnB,CAAb;AAEA;;AAED,MAAK,KAAKsF,SAAV,EAAsB;;AAErB58E,UAAO3oB,IAAP,CAAa2oB,OAAQ,CAAR,CAAb;AAEA;;AAED,SAAOA,MAAP;AAEA,EAxIqE;;AA0ItEq3E,YAAW,UAAWC,SAAX,EAAuB;;AAEjCA,cAAYA,aAAa,EAAzB;;AAEA,MAAIt3E,SAAS,EAAb;AAAA,MAAiBskE,IAAjB;;AAEA,OAAM,IAAIxsF,IAAI,CAAR,EAAW6kG,SAAS,KAAKA,MAA/B,EAAuC7kG,IAAI6kG,OAAOlmG,MAAlD,EAA0DqB,GAA1D,EAAiE;;AAEhE,OAAI+kG,QAAQF,OAAQ7kG,CAAR,CAAZ;AACA,OAAIwlG,aAAeT,SAASA,MAAMtD,cAAjB,GAAoCjC,YAAY,CAAhD,GACZuF,SAASA,MAAMd,WAAjB,GAAiC,CAAjC,GACGc,SAASA,MAAML,aAAjB,GAAmClF,YAAYuF,MAAM78E,MAAN,CAAavpB,MAA5D,GACC6gG,SAHL;;AAKA,OAAItP,MAAM6U,MAAMxF,SAAN,CAAiBiG,UAAjB,CAAV;;AAEA,QAAM,IAAIv6E,IAAI,CAAd,EAAiBA,IAAIilE,IAAIvxF,MAAzB,EAAiCssB,GAAjC,EAAwC;;AAEvC,QAAIjC,QAAQknE,IAAKjlE,CAAL,CAAZ;;AAEA,QAAKuhE,QAAQA,KAAK/8E,MAAL,CAAauZ,KAAb,CAAb,EAAoC,SAJG,CAIO;;AAE9Cd,WAAO3oB,IAAP,CAAaypB,KAAb;AACAwjE,WAAOxjE,KAAP;AAEA;AAED;;AAED,MAAK,KAAK87E,SAAL,IAAkB58E,OAAOvpB,MAAP,GAAgB,CAAlC,IAAuC,CAAEupB,OAAQA,OAAOvpB,MAAP,GAAgB,CAAxB,EAA4B8Q,MAA5B,CAAoCyY,OAAQ,CAAR,CAApC,CAA9C,EAAkG;;AAEjGA,UAAO3oB,IAAP,CAAa2oB,OAAQ,CAAR,CAAb;AAEA;;AAED,SAAOA,MAAP;AAEA,EA/KqE;;AAiLtExb,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBsgG,QAAMnhG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,OAAKimG,MAAL,GAAc,EAAd;;AAEA,OAAM,IAAI7kG,IAAI,CAAR,EAAWC,IAAIrB,OAAOimG,MAAP,CAAclmG,MAAnC,EAA2CqB,IAAIC,CAA/C,EAAkDD,GAAlD,EAAyD;;AAExD,OAAI+kG,QAAQnmG,OAAOimG,MAAP,CAAe7kG,CAAf,CAAZ;;AAEA,QAAK6kG,MAAL,CAAYtlG,IAAZ,CAAkBwlG,MAAMv4F,KAAN,EAAlB;AAEA;;AAED,OAAKs4F,SAAL,GAAiBlmG,OAAOkmG,SAAxB;;AAEA,SAAO,IAAP;AAEA,EAnMqE;;AAqMtE3gF,SAAQ,YAAY;;AAEnB,MAAIiD,OAAO83E,MAAMnhG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,CAAX;;AAEAqoB,OAAK09E,SAAL,GAAiB,KAAKA,SAAtB;AACA19E,OAAKy9E,MAAL,GAAc,EAAd;;AAEA,OAAM,IAAI7kG,IAAI,CAAR,EAAWC,IAAI,KAAK4kG,MAAL,CAAYlmG,MAAjC,EAAyCqB,IAAIC,CAA7C,EAAgDD,GAAhD,EAAuD;;AAEtD,OAAI+kG,QAAQ,KAAKF,MAAL,CAAa7kG,CAAb,CAAZ;AACAonB,QAAKy9E,MAAL,CAAYtlG,IAAZ,CAAkBwlG,MAAM5gF,MAAN,EAAlB;AAEA;;AAED,SAAOiD,IAAP;AAEA,EArNqE;;AAuNtE05E,WAAU,UAAWC,IAAX,EAAkB;;AAE3B7B,QAAMnhG,SAAN,CAAgB+iG,QAAhB,CAAyB/hG,IAAzB,CAA+B,IAA/B,EAAqCgiG,IAArC;;AAEA,OAAK+D,SAAL,GAAiB/D,KAAK+D,SAAtB;AACA,OAAKD,MAAL,GAAc,EAAd;;AAEA,OAAM,IAAI7kG,IAAI,CAAR,EAAWC,IAAI8gG,KAAK8D,MAAL,CAAYlmG,MAAjC,EAAyCqB,IAAIC,CAA7C,EAAgDD,GAAhD,EAAuD;;AAEtD,OAAI+kG,QAAQhE,KAAK8D,MAAL,CAAa7kG,CAAb,CAAZ;AACA,QAAK6kG,MAAL,CAAYtlG,IAAZ,CAAkB,IAAIolG,OAAQI,MAAM7lG,IAAd,CAAJ,GAA2B4hG,QAA3B,CAAqCiE,KAArC,CAAlB;AAEA;;AAED,SAAO,IAAP;AAEA;;AAvOqE,CAAjD,CAAtB;;AA2OA;;;;;AAKA,SAASU,IAAT,CAAev9E,MAAf,EAAwB;;AAEvB08E,WAAU7lG,IAAV,CAAgB,IAAhB;;AAEA,MAAKG,IAAL,GAAY,MAAZ;;AAEA,MAAKwmG,YAAL,GAAoB,IAAI75F,OAAJ,EAApB;;AAEA,KAAKqc,MAAL,EAAc;;AAEb,OAAKD,aAAL,CAAoBC,MAApB;AAEA;AAED;;AAEDu9E,KAAK1nG,SAAL,GAAiBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe4gF,UAAU7mG,SAAzB,CAAf,EAAqD;;AAErE0O,cAAag5F,IAFwD;;AAIrEx9E,gBAAe,UAAWC,MAAX,EAAoB;;AAElC,OAAKy9E,MAAL,CAAaz9E,OAAQ,CAAR,EAAYrqB,CAAzB,EAA4BqqB,OAAQ,CAAR,EAAYzd,CAAxC;;AAEA,OAAM,IAAIzK,IAAI,CAAR,EAAWC,IAAIioB,OAAOvpB,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,QAAK4lG,MAAL,CAAa19E,OAAQloB,CAAR,EAAYnC,CAAzB,EAA4BqqB,OAAQloB,CAAR,EAAYyK,CAAxC;AAEA;AAED,EAdoE;;AAgBrEk7F,SAAQ,UAAW9nG,CAAX,EAAc4M,CAAd,EAAkB;;AAEzB,OAAKi7F,YAAL,CAAkB35F,GAAlB,CAAuBlO,CAAvB,EAA0B4M,CAA1B,EAFyB,CAEM;AAE/B,EApBoE;;AAsBrEm7F,SAAQ,UAAW/nG,CAAX,EAAc4M,CAAd,EAAkB;;AAEzB,MAAIs6F,QAAQ,IAAIf,SAAJ,CAAe,KAAK0B,YAAL,CAAkBl5F,KAAlB,EAAf,EAA0C,IAAIX,OAAJ,CAAahO,CAAb,EAAgB4M,CAAhB,CAA1C,CAAZ;AACA,OAAKo6F,MAAL,CAAYtlG,IAAZ,CAAkBwlG,KAAlB;;AAEA,OAAKW,YAAL,CAAkB35F,GAAlB,CAAuBlO,CAAvB,EAA0B4M,CAA1B;AAEA,EA7BoE;;AA+BrEo7F,mBAAkB,UAAWC,IAAX,EAAiBC,IAAjB,EAAuB9E,EAAvB,EAA2BC,EAA3B,EAAgC;;AAEjD,MAAI6D,QAAQ,IAAIV,oBAAJ,CACX,KAAKqB,YAAL,CAAkBl5F,KAAlB,EADW,EAEX,IAAIX,OAAJ,CAAai6F,IAAb,EAAmBC,IAAnB,CAFW,EAGX,IAAIl6F,OAAJ,CAAao1F,EAAb,EAAiBC,EAAjB,CAHW,CAAZ;;AAMA,OAAK2D,MAAL,CAAYtlG,IAAZ,CAAkBwlG,KAAlB;;AAEA,OAAKW,YAAL,CAAkB35F,GAAlB,CAAuBk1F,EAAvB,EAA2BC,EAA3B;AAEA,EA3CoE;;AA6CrE8E,gBAAe,UAAWC,KAAX,EAAkBC,KAAlB,EAAyBC,KAAzB,EAAgCC,KAAhC,EAAuCnF,EAAvC,EAA2CC,EAA3C,EAAgD;;AAE9D,MAAI6D,QAAQ,IAAIpB,gBAAJ,CACX,KAAK+B,YAAL,CAAkBl5F,KAAlB,EADW,EAEX,IAAIX,OAAJ,CAAao6F,KAAb,EAAoBC,KAApB,CAFW,EAGX,IAAIr6F,OAAJ,CAAas6F,KAAb,EAAoBC,KAApB,CAHW,EAIX,IAAIv6F,OAAJ,CAAao1F,EAAb,EAAiBC,EAAjB,CAJW,CAAZ;;AAOA,OAAK2D,MAAL,CAAYtlG,IAAZ,CAAkBwlG,KAAlB;;AAEA,OAAKW,YAAL,CAAkB35F,GAAlB,CAAuBk1F,EAAvB,EAA2BC,EAA3B;AAEA,EA1DoE;;AA4DrEmF,aAAY,UAAWnW,GAAX,CAAe,mBAAf,EAAqC;;AAEhD,MAAIoW,OAAO,CAAE,KAAKZ,YAAL,CAAkBl5F,KAAlB,EAAF,EAA8B4lF,MAA9B,CAAsClC,GAAtC,CAAX;;AAEA,MAAI6U,QAAQ,IAAIN,WAAJ,CAAiB6B,IAAjB,CAAZ;AACA,OAAKzB,MAAL,CAAYtlG,IAAZ,CAAkBwlG,KAAlB;;AAEA,OAAKW,YAAL,CAAkBh5F,IAAlB,CAAwBwjF,IAAKA,IAAIvxF,MAAJ,GAAa,CAAlB,CAAxB;AAEA,EArEoE;;AAuErE+sF,MAAK,UAAWuV,EAAX,EAAeC,EAAf,EAAmBY,OAAnB,EAA4BT,WAA5B,EAAyCC,SAAzC,EAAoDC,UAApD,EAAiE;;AAErE,MAAI7lF,KAAK,KAAKgqF,YAAL,CAAkB7nG,CAA3B;AACA,MAAI8d,KAAK,KAAK+pF,YAAL,CAAkBj7F,CAA3B;;AAEA,OAAK87F,MAAL,CAAatF,KAAKvlF,EAAlB,EAAsBwlF,KAAKvlF,EAA3B,EAA+BmmF,OAA/B,EACCT,WADD,EACcC,SADd,EACyBC,UADzB;AAGA,EA/EoE;;AAiFrEgF,SAAQ,UAAWtF,EAAX,EAAeC,EAAf,EAAmBY,OAAnB,EAA4BT,WAA5B,EAAyCC,SAAzC,EAAoDC,UAApD,EAAiE;;AAExE,OAAKiF,UAAL,CAAiBvF,EAAjB,EAAqBC,EAArB,EAAyBY,OAAzB,EAAkCA,OAAlC,EAA2CT,WAA3C,EAAwDC,SAAxD,EAAmEC,UAAnE;AAEA,EArFoE;;AAuFrEkF,UAAS,UAAWxF,EAAX,EAAeC,EAAf,EAAmBC,OAAnB,EAA4BC,OAA5B,EAAqCC,WAArC,EAAkDC,SAAlD,EAA6DC,UAA7D,EAAyEC,SAAzE,EAAqF;;AAE7F,MAAI9lF,KAAK,KAAKgqF,YAAL,CAAkB7nG,CAA3B;AACA,MAAI8d,KAAK,KAAK+pF,YAAL,CAAkBj7F,CAA3B;;AAEA,OAAK+7F,UAAL,CAAiBvF,KAAKvlF,EAAtB,EAA0BwlF,KAAKvlF,EAA/B,EAAmCwlF,OAAnC,EAA4CC,OAA5C,EAAqDC,WAArD,EAAkEC,SAAlE,EAA6EC,UAA7E,EAAyFC,SAAzF;AAEA,EA9FoE;;AAgGrEgF,aAAY,UAAWvF,EAAX,EAAeC,EAAf,EAAmBC,OAAnB,EAA4BC,OAA5B,EAAqCC,WAArC,EAAkDC,SAAlD,EAA6DC,UAA7D,EAAyEC,SAAzE,EAAqF;;AAEhG,MAAIuD,QAAQ,IAAI/D,YAAJ,CAAkBC,EAAlB,EAAsBC,EAAtB,EAA0BC,OAA1B,EAAmCC,OAAnC,EAA4CC,WAA5C,EAAyDC,SAAzD,EAAoEC,UAApE,EAAgFC,SAAhF,CAAZ;;AAEA,MAAK,KAAKqD,MAAL,CAAYlmG,MAAZ,GAAqB,CAA1B,EAA8B;;AAE7B;AACA,OAAI+nG,aAAa3B,MAAM3F,QAAN,CAAgB,CAAhB,CAAjB;;AAEA,OAAK,CAAEsH,WAAWj3F,MAAX,CAAmB,KAAKi2F,YAAxB,CAAP,EAAgD;;AAE/C,SAAKE,MAAL,CAAac,WAAW7oG,CAAxB,EAA2B6oG,WAAWj8F,CAAtC;AAEA;AAED;;AAED,OAAKo6F,MAAL,CAAYtlG,IAAZ,CAAkBwlG,KAAlB;;AAEA,MAAI4B,YAAY5B,MAAM3F,QAAN,CAAgB,CAAhB,CAAhB;AACA,OAAKsG,YAAL,CAAkBh5F,IAAlB,CAAwBi6F,SAAxB;AAEA,EAtHoE;;AAwHrEj6F,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBgmG,YAAU7mG,SAAV,CAAoB2O,IAApB,CAAyB3N,IAAzB,CAA+B,IAA/B,EAAqCH,MAArC;;AAEA,OAAK8mG,YAAL,CAAkBh5F,IAAlB,CAAwB9N,OAAO8mG,YAA/B;;AAEA,SAAO,IAAP;AAEA,EAhIoE;;AAkIrEvhF,SAAQ,YAAY;;AAEnB,MAAIiD,OAAOw9E,UAAU7mG,SAAV,CAAoBomB,MAApB,CAA2BplB,IAA3B,CAAiC,IAAjC,CAAX;;AAEAqoB,OAAKs+E,YAAL,GAAoB,KAAKA,YAAL,CAAkB91F,OAAlB,EAApB;;AAEA,SAAOwX,IAAP;AAEA,EA1IoE;;AA4IrE05E,WAAU,UAAWC,IAAX,EAAkB;;AAE3B6D,YAAU7mG,SAAV,CAAoB+iG,QAApB,CAA6B/hG,IAA7B,CAAmC,IAAnC,EAAyCgiG,IAAzC;;AAEA,OAAK2E,YAAL,CAAkBh2F,SAAlB,CAA6BqxF,KAAK2E,YAAlC;;AAEA,SAAO,IAAP;AAEA;;AApJoE,CAArD,CAAjB;;AAwJA;;;;;AAKA;AACA;AACA;AACA;AACA;;AAEA,SAASkB,KAAT,CAAgB1+E,MAAhB,EAAyB;;AAExBu9E,MAAK1mG,IAAL,CAAW,IAAX,EAAiBmpB,MAAjB;;AAEA,MAAKve,IAAL,GAAYX,MAAMI,YAAN,EAAZ;;AAEA,MAAKlK,IAAL,GAAY,OAAZ;;AAEA,MAAKkxF,KAAL,GAAa,EAAb;AAEA;;AAEDwW,MAAM7oG,SAAN,GAAkBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAeyhF,KAAK1nG,SAApB,CAAf,EAAgD;;AAEjE0O,cAAam6F,KAFoD;;AAIjEC,iBAAgB,UAAWrH,SAAX,EAAuB;;AAEtC,MAAIsH,WAAW,EAAf;;AAEA,OAAM,IAAI9mG,IAAI,CAAR,EAAWC,IAAI,KAAKmwF,KAAL,CAAWzxF,MAAhC,EAAwCqB,IAAIC,CAA5C,EAA+CD,GAA/C,EAAsD;;AAErD8mG,YAAU9mG,CAAV,IAAgB,KAAKowF,KAAL,CAAYpwF,CAAZ,EAAgBu/F,SAAhB,CAA2BC,SAA3B,CAAhB;AAEA;;AAED,SAAOsH,QAAP;AAEA,EAhBgE;;AAkBjE;;AAEA5U,gBAAe,UAAWsN,SAAX,EAAuB;;AAErC,SAAO;;AAEN/2D,UAAO,KAAK82D,SAAL,CAAgBC,SAAhB,CAFD;AAGNpP,UAAO,KAAKyW,cAAL,CAAqBrH,SAArB;;AAHD,GAAP;AAOA,EA7BgE;;AA+BjE9yF,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB6mG,OAAK1nG,SAAL,CAAe2O,IAAf,CAAoB3N,IAApB,CAA0B,IAA1B,EAAgCH,MAAhC;;AAEA,OAAKwxF,KAAL,GAAa,EAAb;;AAEA,OAAM,IAAIpwF,IAAI,CAAR,EAAWC,IAAIrB,OAAOwxF,KAAP,CAAazxF,MAAlC,EAA0CqB,IAAIC,CAA9C,EAAiDD,GAAjD,EAAwD;;AAEvD,OAAIuuF,OAAO3vF,OAAOwxF,KAAP,CAAcpwF,CAAd,CAAX;;AAEA,QAAKowF,KAAL,CAAW7wF,IAAX,CAAiBgvF,KAAK/hF,KAAL,EAAjB;AAEA;;AAED,SAAO,IAAP;AAEA,EA/CgE;;AAiDjE2X,SAAQ,YAAY;;AAEnB,MAAIiD,OAAOq+E,KAAK1nG,SAAL,CAAeomB,MAAf,CAAsBplB,IAAtB,CAA4B,IAA5B,CAAX;;AAEAqoB,OAAKzd,IAAL,GAAY,KAAKA,IAAjB;AACAyd,OAAKgpE,KAAL,GAAa,EAAb;;AAEA,OAAM,IAAIpwF,IAAI,CAAR,EAAWC,IAAI,KAAKmwF,KAAL,CAAWzxF,MAAhC,EAAwCqB,IAAIC,CAA5C,EAA+CD,GAA/C,EAAsD;;AAErD,OAAIuuF,OAAO,KAAK6B,KAAL,CAAYpwF,CAAZ,CAAX;AACAonB,QAAKgpE,KAAL,CAAW7wF,IAAX,CAAiBgvF,KAAKpqE,MAAL,EAAjB;AAEA;;AAED,SAAOiD,IAAP;AAEA,EAjEgE;;AAmEjE05E,WAAU,UAAWC,IAAX,EAAkB;;AAE3B0E,OAAK1nG,SAAL,CAAe+iG,QAAf,CAAwB/hG,IAAxB,CAA8B,IAA9B,EAAoCgiG,IAApC;;AAEA,OAAKp3F,IAAL,GAAYo3F,KAAKp3F,IAAjB;AACA,OAAKymF,KAAL,GAAa,EAAb;;AAEA,OAAM,IAAIpwF,IAAI,CAAR,EAAWC,IAAI8gG,KAAK3Q,KAAL,CAAWzxF,MAAhC,EAAwCqB,IAAIC,CAA5C,EAA+CD,GAA/C,EAAsD;;AAErD,OAAIuuF,OAAOwS,KAAK3Q,KAAL,CAAYpwF,CAAZ,CAAX;AACA,QAAKowF,KAAL,CAAW7wF,IAAX,CAAiB,IAAIkmG,IAAJ,GAAW3E,QAAX,CAAqBvS,IAArB,CAAjB;AAEA;;AAED,SAAO,IAAP;AAEA;;AAnFgE,CAAhD,CAAlB;;AAuFA;;;;;AAKA,SAASwY,KAAT,CAAgB7tE,KAAhB,EAAuBgiC,SAAvB,EAAmC;;AAElCp2B,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,OAAZ;;AAEA,MAAKg6B,KAAL,GAAa,IAAIZ,KAAJ,CAAWY,KAAX,CAAb;AACA,MAAKgiC,SAAL,GAAiBA,cAAc79D,SAAd,GAA0B69D,SAA1B,GAAsC,CAAvD;;AAEA,MAAKx1B,aAAL,GAAqBroC,SAArB;AAEA;;AAED0pG,MAAMhpG,SAAN,GAAkBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAErE0O,cAAas6F,KAFwD;;AAIrE5oB,UAAS,IAJ4D;;AAMrEzxE,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBkmC,WAAS/mC,SAAT,CAAmB2O,IAAnB,CAAwB3N,IAAxB,CAA8B,IAA9B,EAAoCH,MAApC;;AAEA,OAAKs6B,KAAL,CAAWxsB,IAAX,CAAiB9N,OAAOs6B,KAAxB;AACA,OAAKgiC,SAAL,GAAiBt8D,OAAOs8D,SAAxB;;AAEA,SAAO,IAAP;AAEA,EAfoE;;AAiBrE/2C,SAAQ,UAAWC,IAAX,EAAkB;;AAEzB,MAAIgD,OAAO0d,SAAS/mC,SAAT,CAAmBomB,MAAnB,CAA0BplB,IAA1B,CAAgC,IAAhC,EAAsCqlB,IAAtC,CAAX;;AAEAgD,OAAKsB,MAAL,CAAYwQ,KAAZ,GAAoB,KAAKA,KAAL,CAAWU,MAAX,EAApB;AACAxS,OAAKsB,MAAL,CAAYwyC,SAAZ,GAAwB,KAAKA,SAA7B;;AAEA,MAAK,KAAKx8B,WAAL,KAAqBrhC,SAA1B,EAAsC+pB,KAAKsB,MAAL,CAAYgW,WAAZ,GAA0B,KAAKA,WAAL,CAAiB9E,MAAjB,EAA1B;;AAEtC,MAAK,KAAKrJ,QAAL,KAAkBlzB,SAAvB,EAAmC+pB,KAAKsB,MAAL,CAAY6H,QAAZ,GAAuB,KAAKA,QAA5B;AACnC,MAAK,KAAK1hB,KAAL,KAAexR,SAApB,EAAgC+pB,KAAKsB,MAAL,CAAY7Z,KAAZ,GAAoB,KAAKA,KAAzB;AAChC,MAAK,KAAKmvB,KAAL,KAAe3gC,SAApB,EAAgC+pB,KAAKsB,MAAL,CAAYsV,KAAZ,GAAoB,KAAKA,KAAzB;AAChC,MAAK,KAAKw9B,QAAL,KAAkBn+D,SAAvB,EAAmC+pB,KAAKsB,MAAL,CAAY8yC,QAAZ,GAAuB,KAAKA,QAA5B;;AAEnC,MAAK,KAAKj+B,MAAL,KAAgBlgC,SAArB,EAAiC+pB,KAAKsB,MAAL,CAAY6U,MAAZ,GAAqB,KAAKA,MAAL,CAAYpZ,MAAZ,EAArB;;AAEjC,SAAOiD,IAAP;AAEA;;AAnCoE,CAApD,CAAlB;;AAuCA;;;;AAIA,SAAS4/E,eAAT,CAA0BvoE,QAA1B,EAAoCC,WAApC,EAAiDw8B,SAAjD,EAA6D;;AAE5D6rC,OAAMhoG,IAAN,CAAY,IAAZ,EAAkB0/B,QAAlB,EAA4By8B,SAA5B;;AAEA,MAAKh8D,IAAL,GAAY,iBAAZ;;AAEA,MAAKumC,UAAL,GAAkBpoC,SAAlB;;AAEA,MAAKmb,QAAL,CAAc9L,IAAd,CAAoBo4B,SAASG,SAA7B;AACA,MAAK/gB,YAAL;;AAEA,MAAKwa,WAAL,GAAmB,IAAIpG,KAAJ,CAAWoG,WAAX,CAAnB;AAEA;;AAEDsoE,gBAAgBjpG,SAAhB,GAA4BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe+iF,MAAMhpG,SAArB,CAAf,EAAiD;;AAE5E0O,cAAau6F,eAF+D;;AAI5ErrC,oBAAmB,IAJyD;;AAM5EjvD,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBmoG,QAAMhpG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,OAAK8/B,WAAL,CAAiBhyB,IAAjB,CAAuB9N,OAAO8/B,WAA9B;;AAEA,SAAO,IAAP;AAEA;;AAd2E,CAAjD,CAA5B;;AAkBA;;;;AAIA,SAASuoE,WAAT,CAAsBhnF,MAAtB,EAA+B;;AAE9B,MAAKA,MAAL,GAAcA,MAAd;;AAEA,MAAKo7C,IAAL,GAAY,CAAZ;AACA,MAAK75C,MAAL,GAAc,CAAd;;AAEA,MAAK85C,OAAL,GAAe,IAAIzvD,OAAJ,CAAa,GAAb,EAAkB,GAAlB,CAAf;;AAEA,MAAK8uB,GAAL,GAAW,IAAX;AACA,MAAK5gB,MAAL,GAAc,IAAIzJ,OAAJ,EAAd;AAEA;;AAEDtS,OAAOK,MAAP,CAAe4oG,YAAYlpG,SAA3B,EAAsC;;AAErC2O,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB,OAAKqhB,MAAL,GAAcrhB,OAAOqhB,MAAP,CAAczT,KAAd,EAAd;;AAEA,OAAK6uD,IAAL,GAAYz8D,OAAOy8D,IAAnB;AACA,OAAK75C,MAAL,GAAc5iB,OAAO4iB,MAArB;;AAEA,OAAK85C,OAAL,CAAa5uD,IAAb,CAAmB9N,OAAO08D,OAA1B;;AAEA,SAAO,IAAP;AAEA,EAboC;;AAerC9uD,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EAnBoC;;AAqBrCyX,SAAQ,YAAY;;AAEnB,MAAIuE,SAAS,EAAb;;AAEA,MAAK,KAAK2yC,IAAL,KAAc,CAAnB,EAAuB3yC,OAAO2yC,IAAP,GAAc,KAAKA,IAAnB;AACvB,MAAK,KAAK75C,MAAL,KAAgB,CAArB,EAAyBkH,OAAOlH,MAAP,GAAgB,KAAKA,MAArB;AACzB,MAAK,KAAK85C,OAAL,CAAaz9D,CAAb,KAAmB,GAAnB,IAA0B,KAAKy9D,OAAL,CAAa7wD,CAAb,KAAmB,GAAlD,EAAwDie,OAAO4yC,OAAP,GAAiB,KAAKA,OAAL,CAAa1rD,OAAb,EAAjB;;AAExD8Y,SAAOzI,MAAP,GAAgB,KAAKA,MAAL,CAAYkE,MAAZ,CAAoB,KAApB,EAA4BuE,MAA5C;AACA,SAAOA,OAAOzI,MAAP,CAAclG,MAArB;;AAEA,SAAO2O,MAAP;AAEA;;AAlCoC,CAAtC;;AAsCA;;;;AAIA,SAASw+E,eAAT,GAA2B;;AAE1BD,aAAYloG,IAAZ,CAAkB,IAAlB,EAAwB,IAAIuyE,iBAAJ,CAAuB,EAAvB,EAA2B,CAA3B,EAA8B,GAA9B,EAAmC,GAAnC,CAAxB;AAEA;;AAED41B,gBAAgBnpG,SAAhB,GAA4BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAeijF,YAAYlpG,SAA3B,CAAf,EAAuD;;AAElF0O,cAAay6F,eAFqE;;AAIlFvoC,oBAAmB,IAJ+D;;AAMlFniD,SAAQ,UAAW69C,KAAX,EAAmB;;AAE1B,MAAIp6C,SAAS,KAAKA,MAAlB;;AAEA,MAAIsxD,MAAMvoE,MAAMG,OAAN,GAAgB,CAAhB,GAAoBkxD,MAAMxrD,KAApC;AACA,MAAI2iE,SAAS,KAAKlW,OAAL,CAAa12C,KAAb,GAAqB,KAAK02C,OAAL,CAAaz2C,MAA/C;AACA,MAAInK,MAAM2/C,MAAM9pC,QAAN,IAAkBtQ,OAAOvF,GAAnC;;AAEA,MAAK62D,QAAQtxD,OAAOsxD,GAAf,IAAsBC,WAAWvxD,OAAOuxD,MAAxC,IAAkD92D,QAAQuF,OAAOvF,GAAtE,EAA4E;;AAE3EuF,UAAOsxD,GAAP,GAAaA,GAAb;AACAtxD,UAAOuxD,MAAP,GAAgBA,MAAhB;AACAvxD,UAAOvF,GAAP,GAAaA,GAAb;AACAuF,UAAOspB,sBAAP;AAEA;AAED;;AAvBiF,CAAvD,CAA5B;;AA2BA;;;;AAIA,SAAS49D,SAAT,CAAoBjuE,KAApB,EAA2BgiC,SAA3B,EAAsC3qC,QAAtC,EAAgD1hB,KAAhD,EAAuD2sD,QAAvD,EAAiEx9B,KAAjE,EAAyE;;AAExE+oE,OAAMhoG,IAAN,CAAY,IAAZ,EAAkBm6B,KAAlB,EAAyBgiC,SAAzB;;AAEA,MAAKh8D,IAAL,GAAY,WAAZ;;AAEA,MAAKsZ,QAAL,CAAc9L,IAAd,CAAoBo4B,SAASG,SAA7B;AACA,MAAK/gB,YAAL;;AAEA,MAAK5lB,MAAL,GAAc,IAAIwmC,QAAJ,EAAd;;AAEA9mC,QAAOC,cAAP,CAAuB,IAAvB,EAA6B,OAA7B,EAAsC;AACrCC,OAAK,YAAY;;AAEhB;AACA;AACA,UAAO,KAAKg9D,SAAL,GAAiB59D,KAAK4L,EAA7B;AAEA,GAPoC;AAQrC6C,OAAK,UAAWq7F,KAAX,EAAmB;;AAEvB;AACA;AACA,QAAKlsC,SAAL,GAAiBksC,QAAQ9pG,KAAK4L,EAA9B;AAEA;AAdoC,EAAtC;;AAiBA,MAAKqnB,QAAL,GAAkBA,aAAalzB,SAAf,GAA6BkzB,QAA7B,GAAwC,CAAxD;AACA,MAAK1hB,KAAL,GAAeA,UAAUxR,SAAZ,GAA0BwR,KAA1B,GAAkCvR,KAAK4L,EAAL,GAAU,CAAzD;AACA,MAAKsyD,QAAL,GAAkBA,aAAan+D,SAAf,GAA6Bm+D,QAA7B,GAAwC,CAAxD;AACA,MAAKx9B,KAAL,GAAeA,UAAU3gC,SAAZ,GAA0B2gC,KAA1B,GAAkC,CAA/C,CA/BwE,CA+BtB;;AAElD,MAAKT,MAAL,GAAc,IAAI2pE,eAAJ,EAAd;AAEA;;AAEDC,UAAUppG,SAAV,GAAsBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe+iF,MAAMhpG,SAArB,CAAf,EAAiD;;AAEtE0O,cAAa06F,SAFyD;;AAItE5rC,cAAa,IAJyD;;AAMtE7uD,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBmoG,QAAMhpG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,OAAK2xB,QAAL,GAAgB3xB,OAAO2xB,QAAvB;AACA,OAAK1hB,KAAL,GAAajQ,OAAOiQ,KAApB;AACA,OAAK2sD,QAAL,GAAgB58D,OAAO48D,QAAvB;AACA,OAAKx9B,KAAL,GAAap/B,OAAOo/B,KAApB;;AAEA,OAAK1/B,MAAL,GAAcM,OAAON,MAAP,CAAckO,KAAd,EAAd;;AAEA,OAAK+wB,MAAL,GAAc3+B,OAAO2+B,MAAP,CAAc/wB,KAAd,EAAd;;AAEA,SAAO,IAAP;AAEA;;AArBqE,CAAjD,CAAtB;;AAyBA;;;;AAKA,SAAS66F,UAAT,CAAqBnuE,KAArB,EAA4BgiC,SAA5B,EAAuC3qC,QAAvC,EAAiDyN,KAAjD,EAAyD;;AAExD+oE,OAAMhoG,IAAN,CAAY,IAAZ,EAAkBm6B,KAAlB,EAAyBgiC,SAAzB;;AAEA,MAAKh8D,IAAL,GAAY,YAAZ;;AAEAlB,QAAOC,cAAP,CAAuB,IAAvB,EAA6B,OAA7B,EAAsC;AACrCC,OAAK,YAAY;;AAEhB;AACA;AACA,UAAO,KAAKg9D,SAAL,GAAiB,CAAjB,GAAqB59D,KAAK4L,EAAjC;AAEA,GAPoC;AAQrC6C,OAAK,UAAWq7F,KAAX,EAAmB;;AAEvB;AACA;AACA,QAAKlsC,SAAL,GAAiBksC,SAAU,IAAI9pG,KAAK4L,EAAnB,CAAjB;AAEA;AAdoC,EAAtC;;AAiBA,MAAKqnB,QAAL,GAAkBA,aAAalzB,SAAf,GAA6BkzB,QAA7B,GAAwC,CAAxD;AACA,MAAKyN,KAAL,GAAeA,UAAU3gC,SAAZ,GAA0B2gC,KAA1B,GAAkC,CAA/C,CAxBwD,CAwBN;;AAElD,MAAKT,MAAL,GAAc,IAAI0pE,WAAJ,CAAiB,IAAI31B,iBAAJ,CAAuB,EAAvB,EAA2B,CAA3B,EAA8B,GAA9B,EAAmC,GAAnC,CAAjB,CAAd;AAEA;;AAED+1B,WAAWtpG,SAAX,GAAuBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe+iF,MAAMhpG,SAArB,CAAf,EAAiD;;AAEvE0O,cAAa46F,UAF0D;;AAIvE3rC,eAAc,IAJyD;;AAMvEhvD,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBmoG,QAAMhpG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,OAAK2xB,QAAL,GAAgB3xB,OAAO2xB,QAAvB;AACA,OAAKyN,KAAL,GAAap/B,OAAOo/B,KAApB;;AAEA,OAAKT,MAAL,GAAc3+B,OAAO2+B,MAAP,CAAc/wB,KAAd,EAAd;;AAEA,SAAO,IAAP;AAEA;;AAjBsE,CAAjD,CAAvB;;AAqBA;;;;AAIA,SAAS86F,sBAAT,GAAmC;;AAElCL,aAAYloG,IAAZ,CAAkB,IAAlB,EAAwB,IAAIqqC,kBAAJ,CAAwB,CAAE,CAA1B,EAA6B,CAA7B,EAAgC,CAAhC,EAAmC,CAAE,CAArC,EAAwC,GAAxC,EAA6C,GAA7C,CAAxB;AAEA;;AAEDk+D,uBAAuBvpG,SAAvB,GAAmCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAeijF,YAAYlpG,SAA3B,CAAf,EAAuD;;AAEzF0O,cAAa66F;;AAF4E,CAAvD,CAAnC;;AAMA;;;;;AAKA,SAASC,gBAAT,CAA2BruE,KAA3B,EAAkCgiC,SAAlC,EAA8C;;AAE7C6rC,OAAMhoG,IAAN,CAAY,IAAZ,EAAkBm6B,KAAlB,EAAyBgiC,SAAzB;;AAEA,MAAKh8D,IAAL,GAAY,kBAAZ;;AAEA,MAAKsZ,QAAL,CAAc9L,IAAd,CAAoBo4B,SAASG,SAA7B;AACA,MAAK/gB,YAAL;;AAEA,MAAK5lB,MAAL,GAAc,IAAIwmC,QAAJ,EAAd;;AAEA,MAAKvH,MAAL,GAAc,IAAI+pE,sBAAJ,EAAd;AAEA;;AAEDC,iBAAiBxpG,SAAjB,GAA6BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe+iF,MAAMhpG,SAArB,CAAf,EAAiD;;AAE7E0O,cAAa86F,gBAFgE;;AAI7EnsC,qBAAoB,IAJyD;;AAM7E1uD,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBmoG,QAAMhpG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,OAAKN,MAAL,GAAcM,OAAON,MAAP,CAAckO,KAAd,EAAd;;AAEA,OAAK+wB,MAAL,GAAc3+B,OAAO2+B,MAAP,CAAc/wB,KAAd,EAAd;;AAEA,SAAO,IAAP;AAEA;;AAhB4E,CAAjD,CAA7B;;AAoBA;;;;AAIA,SAASg7F,YAAT,CAAuBtuE,KAAvB,EAA8BgiC,SAA9B,EAA0C;;AAEzC6rC,OAAMhoG,IAAN,CAAY,IAAZ,EAAkBm6B,KAAlB,EAAyBgiC,SAAzB;;AAEA,MAAKh8D,IAAL,GAAY,cAAZ;;AAEA,MAAKumC,UAAL,GAAkBpoC,SAAlB;AAEA;;AAEDmqG,aAAazpG,SAAb,GAAyBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe+iF,MAAMhpG,SAArB,CAAf,EAAiD;;AAEzE0O,cAAa+6F,YAF4D;;AAIzErsC,iBAAgB;;AAJyD,CAAjD,CAAzB;;AAQA;;;;AAIA,SAASssC,aAAT,CAAwBvuE,KAAxB,EAA+BgiC,SAA/B,EAA0Ct2C,KAA1C,EAAiDC,MAAjD,EAA0D;;AAEzDkiF,OAAMhoG,IAAN,CAAY,IAAZ,EAAkBm6B,KAAlB,EAAyBgiC,SAAzB;;AAEA,MAAKh8D,IAAL,GAAY,eAAZ;;AAEA,MAAK0lB,KAAL,GAAeA,UAAUvnB,SAAZ,GAA0BunB,KAA1B,GAAkC,EAA/C;AACA,MAAKC,MAAL,GAAgBA,WAAWxnB,SAAb,GAA2BwnB,MAA3B,GAAoC,EAAlD;AAEA;;AAED4iF,cAAc1pG,SAAd,GAA0BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe+iF,MAAMhpG,SAArB,CAAf,EAAiD;;AAE1E0O,cAAag7F,aAF6D;;AAI1EhsC,kBAAiB,IAJyD;;AAM1E/uD,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBmoG,QAAMhpG,SAAN,CAAgB2O,IAAhB,CAAqB3N,IAArB,CAA2B,IAA3B,EAAiCH,MAAjC;;AAEA,OAAKgmB,KAAL,GAAahmB,OAAOgmB,KAApB;AACA,OAAKC,MAAL,GAAcjmB,OAAOimB,MAArB;;AAEA,SAAO,IAAP;AAEA,EAfyE;;AAiB1EV,SAAQ,UAAWC,IAAX,EAAkB;;AAEzB,MAAIgD,OAAO2/E,MAAMhpG,SAAN,CAAgBomB,MAAhB,CAAuBplB,IAAvB,CAA6B,IAA7B,EAAmCqlB,IAAnC,CAAX;;AAEAgD,OAAKsB,MAAL,CAAY9D,KAAZ,GAAoB,KAAKA,KAAzB;AACAwC,OAAKsB,MAAL,CAAY7D,MAAZ,GAAqB,KAAKA,MAA1B;;AAEA,SAAOuC,IAAP;AAEA;;AA1ByE,CAAjD,CAA1B;;AA8BA;;;;;;;;;;AAUA,SAASsgF,mBAAT,CAA8BtkF,IAA9B,EAAoCukF,KAApC,EAA2C7+D,MAA3C,EAAmD8+D,aAAnD,EAAmE;;AAElEC,eAAc9oG,IAAd,CAAoB,IAApB,EAA0BqkB,IAA1B,EAAgCukF,KAAhC,EAAuC7+D,MAAvC,EAA+C8+D,aAA/C;AAEA;;AAEDF,oBAAoB3pG,SAApB,GAAgCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe6jF,cAAc9pG,SAA7B,CAAf,EAAyD;;AAExF0O,cAAai7F,mBAF2E;;AAIxFI,gBAAe,QAJyE;AAKxFC,kBAAiB5vE,KALuE;;AAOxF6vE,uBAAsBngG,mBAPkE;;AASxFogG,iCAAgC5qG,SATwD;;AAWxF6qG,iCAAgC7qG;;AAXwD,CAAzD,CAAhC;;AAeA;;;;;;;;;;AAUA,SAAS8qG,oBAAT,CAA+B/kF,IAA/B,EAAqCukF,KAArC,EAA4C7+D,MAA5C,EAAqD;;AAEpD++D,eAAc9oG,IAAd,CAAoB,IAApB,EAA0BqkB,IAA1B,EAAgCukF,KAAhC,EAAuC7+D,MAAvC;AAEA;;AAEDq/D,qBAAqBpqG,SAArB,GAAiCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe6jF,cAAc9pG,SAA7B,CAAf,EAAyD;;AAEzF0O,cAAa07F,oBAF4E;;AAIzFL,gBAAe,MAJ0E;AAKzFC,kBAAiB5vE,KALwE;;AAOzF6vE,uBAAsBngG,mBAPmE;;AASzFogG,iCAAgC5qG,SATyD;AAUzF6qG,iCAAgC7qG;;AAEhC;AACA;AACA;;AAdyF,CAAzD,CAAjC;;AAkBA;;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAS+qG,WAAT,CAAsBC,kBAAtB,EAA0CC,YAA1C,EAAwDC,UAAxD,EAAoEC,YAApE,EAAmF;;AAElF,MAAKH,kBAAL,GAA0BA,kBAA1B;AACA,MAAKI,YAAL,GAAoB,CAApB;;AAEA,MAAKD,YAAL,GAAoBA,iBAAiBnrG,SAAjB,GACnBmrG,YADmB,GACJ,IAAIF,aAAa77F,WAAjB,CAA8B87F,UAA9B,CADhB;AAEA,MAAKD,YAAL,GAAoBA,YAApB;AACA,MAAKI,SAAL,GAAiBH,UAAjB;AAEA;;AAEDvqG,OAAOK,MAAP,CAAe+pG,YAAYrqG,SAA3B,EAAsC;;AAErC4qG,WAAU,UAAWj+F,CAAX,EAAe;;AAExB,MAAIk+F,KAAK,KAAKP,kBAAd;AAAA,MACC1oD,KAAK,KAAK8oD,YADX;AAAA,MAGCzrD,KAAK4rD,GAAIjpD,EAAJ,CAHN;AAAA,MAIC5C,KAAK6rD,GAAIjpD,KAAK,CAAT,CAJN;;AAMAkpD,qBAAmB;;AAElBC,SAAM;;AAEL,QAAIxuF,KAAJ;;AAEAyuF,iBAAa;;AAEZ;AACA;AACA;AACA;AACAC,mBAAc,IAAK,EAAIt+F,IAAIsyC,EAAR,CAAL,EAAoB;;AAEjC,WAAM,IAAIisD,WAAWtpD,KAAK,CAA1B,IAAiC;;AAEhC,WAAK3C,OAAO3/C,SAAZ,EAAwB;;AAEvB,YAAKqN,IAAIqyC,EAAT,EAAc,MAAMisD,YAAN;;AAEd;;AAEArpD,aAAKipD,GAAGjqG,MAAR;AACA,aAAK8pG,YAAL,GAAoB9oD,EAApB;AACA,eAAO,KAAKupD,SAAL,CAAgBvpD,KAAK,CAArB,EAAwBj1C,CAAxB,EAA2BqyC,EAA3B,CAAP;AAEA;;AAED,WAAK4C,OAAOspD,QAAZ,EAAuB,MAdS,CAcF;;AAE9BlsD,YAAKC,EAAL;AACAA,YAAK4rD,GAAI,EAAGjpD,EAAP,CAAL;;AAEA,WAAKj1C,IAAIsyC,EAAT,EAAc;;AAEb;AACA,cAAM8rD,IAAN;AAEA;AAED;;AAED;AACAxuF,cAAQsuF,GAAGjqG,MAAX;AACA,YAAMoqG,WAAN;AAEA;;AAED;AACA;AACA,SAAK,EAAIr+F,KAAKqyC,EAAT,CAAL,EAAqB;;AAEpB;;AAEA,UAAIosD,WAAWP,GAAI,CAAJ,CAAf;;AAEA,UAAKl+F,IAAIy+F,QAAT,EAAoB;;AAEnBxpD,YAAK,CAAL,CAFmB,CAEX;AACR5C,YAAKosD,QAAL;AAEA;;AAED;;AAEA,WAAM,IAAIF,WAAWtpD,KAAK,CAA1B,IAAiC;;AAEhC,WAAK5C,OAAO1/C,SAAZ,EAAwB;;AAEvB;;AAEA,aAAKorG,YAAL,GAAoB,CAApB;AACA,eAAO,KAAKW,YAAL,CAAmB,CAAnB,EAAsB1+F,CAAtB,EAAyBsyC,EAAzB,CAAP;AAEA;;AAED,WAAK2C,OAAOspD,QAAZ,EAAuB,MAXS,CAWF;;AAE9BjsD,YAAKD,EAAL;AACAA,YAAK6rD,GAAI,EAAGjpD,EAAH,GAAQ,CAAZ,CAAL;;AAEA,WAAKj1C,KAAKqyC,EAAV,EAAe;;AAEd;AACA,cAAM+rD,IAAN;AAEA;AAED;;AAED;AACAxuF,cAAQqlC,EAAR;AACAA,WAAK,CAAL;AACA,YAAMopD,WAAN;AAEA;;AAED;;AAEA,WAAMF,iBAAN;AAEA,KAnGI,CAmGH;;AAEF;;AAEA,WAAQlpD,KAAKrlC,KAAb,EAAqB;;AAEpB,SAAI+uF,MAAQ1pD,KAAKrlC,KAAP,KAAmB,CAA7B;;AAEA,SAAK5P,IAAIk+F,GAAIS,GAAJ,CAAT,EAAqB;;AAEpB/uF,cAAQ+uF,GAAR;AAEA,MAJD,MAIO;;AAEN1pD,WAAK0pD,MAAM,CAAX;AAEA;AAED;;AAEDrsD,SAAK4rD,GAAIjpD,EAAJ,CAAL;AACA5C,SAAK6rD,GAAIjpD,KAAK,CAAT,CAAL;;AAEA;;AAEA,QAAK5C,OAAO1/C,SAAZ,EAAwB;;AAEvB,UAAKorG,YAAL,GAAoB,CAApB;AACA,YAAO,KAAKW,YAAL,CAAmB,CAAnB,EAAsB1+F,CAAtB,EAAyBsyC,EAAzB,CAAP;AAEA;;AAED,QAAKA,OAAO3/C,SAAZ,EAAwB;;AAEvBsiD,UAAKipD,GAAGjqG,MAAR;AACA,UAAK8pG,YAAL,GAAoB9oD,EAApB;AACA,YAAO,KAAKupD,SAAL,CAAgBvpD,KAAK,CAArB,EAAwB5C,EAAxB,EAA4BryC,CAA5B,CAAP;AAEA;AAED,IA7IiB,CA6IhB;;AAEF,QAAK+9F,YAAL,GAAoB9oD,EAApB;;AAEA,QAAK2pD,gBAAL,CAAuB3pD,EAAvB,EAA2B5C,EAA3B,EAA+BC,EAA/B;AAEA,GA3JuB,CA2JtB;;AAEF,SAAO,KAAKusD,YAAL,CAAmB5pD,EAAnB,EAAuB5C,EAAvB,EAA2BryC,CAA3B,EAA8BsyC,EAA9B,CAAP;AAEA,EAjKoC;;AAmKrCwsD,WAAU,IAnK2B,EAmKrB;AAChB;;AAEA;;AAEAC,mBAAkB,EAxKmB;;AA0KrCC,eAAc,YAAY;;AAEzB,SAAO,KAAKF,QAAL,IAAiB,KAAKC,gBAA7B;AAEA,EA9KoC;;AAgLrCE,mBAAkB,UAAWlrG,KAAX,EAAmB;;AAEpC;;AAEA,MAAIygE,SAAS,KAAKspC,YAAlB;AAAA,MACC1/D,SAAS,KAAKw/D,YADf;AAAA,MAEC3qB,SAAS,KAAK+qB,SAFf;AAAA,MAGC/4F,SAASlR,QAAQk/E,MAHlB;;AAKA,OAAM,IAAI39E,IAAI,CAAd,EAAiBA,MAAM29E,MAAvB,EAA+B,EAAG39E,CAAlC,EAAsC;;AAErCk/D,UAAQl/D,CAAR,IAAc8oC,OAAQn5B,SAAS3P,CAAjB,CAAd;AAEA;;AAED,SAAOk/D,MAAP;AAEA,EAjMoC;;AAmMrC;;AAEAqqC,eAAc,YAAW,mBAAsB;;AAE9C,QAAM,IAAIj9F,KAAJ,CAAW,yBAAX,CAAN;AACA;AAEA,EA1MoC;;AA4MrCg9F,mBAAkB,YAAW,gBAAmB;;AAE/C;;AAEA;;AAhNoC,CAAtC;;AAoNA;AACAtrG,OAAOK,MAAP,CAAe+pG,YAAYrqG,SAA3B,EAAsC;;AAErC;AACAqrG,eAAchB,YAAYrqG,SAAZ,CAAsB4rG,gBAHC;;AAKrC;AACAT,YAAWd,YAAYrqG,SAAZ,CAAsB4rG;;AANI,CAAtC;;AAUA;;;;;;AAMA,SAASC,2BAAT,CAAsCvB,kBAAtC,EAA0DC,YAA1D,EAAwEC,UAAxE,EAAoFC,YAApF,EAAmG;;AAElGJ,aAAYrpG,IAAZ,CAAkB,IAAlB,EAAwBspG,kBAAxB,EAA4CC,YAA5C,EAA0DC,UAA1D,EAAsEC,YAAtE;AAEA;;AAEDoB,4BAA4B7rG,SAA5B,GAAwCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAeokF,YAAYrqG,SAA3B,CAAf,EAAuD;;AAE9F0O,cAAam9F,2BAFiF;;AAI9FL,eAAc,UAAW5pD,EAAX,EAAe5C,EAAf,EAAmBryC,CAAnB,EAAsBsyC,EAAtB,EAA2B;;AAExC,MAAIkiB,SAAS,KAAKspC,YAAlB;AAAA,MACC1/D,SAAS,KAAKw/D,YADf;AAAA,MAEC3qB,SAAS,KAAK+qB,SAFf;AAAA,MAIC/4F,SAASgwC,KAAKg+B,MAJf;AAAA,MAMCtuE,QAAQ,CAAE3E,IAAIqyC,EAAN,KAAeC,KAAKD,EAApB,CANT;;AAQA,OAAM,IAAI3uB,MAAMze,SAASguE,MAAzB,EAAiChuE,WAAWye,GAA5C,EAAiDze,UAAU,CAA3D,EAA+D;;AAE9DmL,cAAWK,SAAX,CAAsB+jD,MAAtB,EAA8B,CAA9B,EAAiCp2B,MAAjC,EAAyCn5B,SAASguE,MAAlD,EAA0D70C,MAA1D,EAAkEn5B,MAAlE,EAA0EN,KAA1E;AAEA;;AAED,SAAO6vD,MAAP;AAEA;;AAtB6F,CAAvD,CAAxC;;AA0BA;;;;;;;;;AASA,SAAS2qC,uBAAT,CAAkCzmF,IAAlC,EAAwCukF,KAAxC,EAA+C7+D,MAA/C,EAAuD8+D,aAAvD,EAAuE;;AAEtEC,eAAc9oG,IAAd,CAAoB,IAApB,EAA0BqkB,IAA1B,EAAgCukF,KAAhC,EAAuC7+D,MAAvC,EAA+C8+D,aAA/C;AAEA;;AAEDiC,wBAAwB9rG,SAAxB,GAAoCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe6jF,cAAc9pG,SAA7B,CAAf,EAAyD;;AAE5F0O,cAAao9F,uBAF+E;;AAI5F/B,gBAAe,YAJ6E;;AAM5F;;AAEAE,uBAAsBlgG,iBARsE;;AAU5FmgG,iCAAgC,UAAW/oC,MAAX,EAAoB;;AAEnD,SAAO,IAAI0qC,2BAAJ,CAAiC,KAAKjC,KAAtC,EAA6C,KAAK7+D,MAAlD,EAA0D,KAAKghE,YAAL,EAA1D,EAA+E5qC,MAA/E,CAAP;AAEA,EAd2F;;AAgB5FgpC,iCAAgC7qG,SAhB4D,CAgBlD;;AAhBkD,CAAzD,CAApC;;AAoBA;;;;;;;;;;AAUA,SAAS0sG,kBAAT,CAA6B3mF,IAA7B,EAAmCukF,KAAnC,EAA0C7+D,MAA1C,EAAkD8+D,aAAlD,EAAkE;;AAEjEC,eAAc9oG,IAAd,CAAoB,IAApB,EAA0BqkB,IAA1B,EAAgCukF,KAAhC,EAAuC7+D,MAAvC,EAA+C8+D,aAA/C;AAEA;;AAEDmC,mBAAmBhsG,SAAnB,GAA+BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe6jF,cAAc9pG,SAA7B,CAAf,EAAyD;;AAEvF0O,cAAas9F,kBAF0E;;AAIvFjC,gBAAe;;AAEf;;AAEA;;AAEA;AACA;;AAXuF,CAAzD,CAA/B;;AAeA;;;;;;;;;AASA,SAASkC,mBAAT,CAA8B5mF,IAA9B,EAAoCukF,KAApC,EAA2C7+D,MAA3C,EAAmD8+D,aAAnD,EAAmE;;AAElEC,eAAc9oG,IAAd,CAAoB,IAApB,EAA0BqkB,IAA1B,EAAgCukF,KAAhC,EAAuC7+D,MAAvC,EAA+C8+D,aAA/C;AAEA;;AAEDoC,oBAAoBjsG,SAApB,GAAgCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe6jF,cAAc9pG,SAA7B,CAAf,EAAyD;;AAExF0O,cAAau9F,mBAF2E;;AAIxFlC,gBAAe;;AAEf;;AAEA;;AARwF,CAAzD,CAAhC;;AAYA;;;;;;;;;;AAUA,SAASmC,gBAAT,CAA2B5B,kBAA3B,EAA+CC,YAA/C,EAA6DC,UAA7D,EAAyEC,YAAzE,EAAwF;;AAEvFJ,aAAYrpG,IAAZ,CAAkB,IAAlB,EAAwBspG,kBAAxB,EAA4CC,YAA5C,EAA0DC,UAA1D,EAAsEC,YAAtE;;AAEA,MAAK0B,WAAL,GAAmB,CAAE,CAArB;AACA,MAAKC,WAAL,GAAmB,CAAE,CAArB;AACA,MAAKC,WAAL,GAAmB,CAAE,CAArB;AACA,MAAKC,WAAL,GAAmB,CAAE,CAArB;AAEA;;AAEDJ,iBAAiBlsG,SAAjB,GAA6BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAeokF,YAAYrqG,SAA3B,CAAf,EAAuD;;AAEnF0O,cAAaw9F,gBAFsE;;AAInFR,mBAAkB;;AAEjBa,eAAatiG,mBAFI;AAGjBuiG,aAAWviG;;AAHM,EAJiE;;AAWnFshG,mBAAkB,UAAW3pD,EAAX,EAAe5C,EAAf,EAAmBC,EAAnB,EAAwB;;AAEzC,MAAI4rD,KAAK,KAAKP,kBAAd;AAAA,MACCmC,QAAQ7qD,KAAK,CADd;AAAA,MAEC8qD,QAAQ9qD,KAAK,CAFd;AAAA,MAIC+qD,QAAQ9B,GAAI4B,KAAJ,CAJT;AAAA,MAKCG,QAAQ/B,GAAI6B,KAAJ,CALT;;AAOA,MAAKC,UAAUrtG,SAAf,EAA2B;;AAE1B,WAAS,KAAKqsG,YAAL,GAAoBY,WAA7B;;AAEC,SAAKriG,eAAL;;AAEC;AACAuiG,aAAQ7qD,EAAR;AACA+qD,aAAQ,IAAI3tD,EAAJ,GAASC,EAAjB;;AAEA;;AAED,SAAK90C,gBAAL;;AAEC;AACAsiG,aAAQ5B,GAAGjqG,MAAH,GAAY,CAApB;AACA+rG,aAAQ3tD,KAAK6rD,GAAI4B,KAAJ,CAAL,GAAmB5B,GAAI4B,QAAQ,CAAZ,CAA3B;;AAEA;;AAED;AAAS;;AAER;AACAA,aAAQ7qD,EAAR;AACA+qD,aAAQ1tD,EAAR;;AAtBF;AA0BA;;AAED,MAAK2tD,UAAUttG,SAAf,EAA2B;;AAE1B,WAAS,KAAKqsG,YAAL,GAAoBa,SAA7B;;AAEC,SAAKtiG,eAAL;;AAEC;AACAwiG,aAAQ9qD,EAAR;AACAgrD,aAAQ,IAAI3tD,EAAJ,GAASD,EAAjB;;AAEA;;AAED,SAAK70C,gBAAL;;AAEC;AACAuiG,aAAQ,CAAR;AACAE,aAAQ3tD,KAAK4rD,GAAI,CAAJ,CAAL,GAAeA,GAAI,CAAJ,CAAvB;;AAEA;;AAED;AAAS;;AAER;AACA6B,aAAQ9qD,KAAK,CAAb;AACAgrD,aAAQ5tD,EAAR;;AAtBF;AA0BA;;AAED,MAAI6tD,SAAS,CAAE5tD,KAAKD,EAAP,IAAc,GAA3B;AAAA,MACC4gC,SAAS,KAAK+qB,SADf;;AAGA,OAAKwB,WAAL,GAAmBU,UAAW7tD,KAAK2tD,KAAhB,CAAnB;AACA,OAAKN,WAAL,GAAmBQ,UAAWD,QAAQ3tD,EAAnB,CAAnB;AACA,OAAKmtD,WAAL,GAAmBK,QAAQ7sB,MAA3B;AACA,OAAK0sB,WAAL,GAAmBI,QAAQ9sB,MAA3B;AAEA,EAxFkF;;AA0FnF4rB,eAAc,UAAW5pD,EAAX,EAAe5C,EAAf,EAAmBryC,CAAnB,EAAsBsyC,EAAtB,EAA2B;;AAExC,MAAIkiB,SAAS,KAAKspC,YAAlB;AAAA,MACC1/D,SAAS,KAAKw/D,YADf;AAAA,MAEC3qB,SAAS,KAAK+qB,SAFf;AAAA,MAICmC,KAAKlrD,KAAKg+B,MAJX;AAAA,MAIoBmtB,KAAKD,KAAKltB,MAJ9B;AAAA,MAKCotB,KAAK,KAAKZ,WALX;AAAA,MAKyBa,KAAK,KAAKX,WALnC;AAAA,MAMCY,KAAK,KAAKf,WANX;AAAA,MAMwBgB,KAAK,KAAKd,WANlC;AAAA,MAQCvvF,IAAI,CAAEnQ,IAAIqyC,EAAN,KAAeC,KAAKD,EAApB,CARL;AAAA,MASC6rD,KAAK/tF,IAAIA,CATV;AAAA,MAUCswF,MAAMvC,KAAK/tF,CAVZ;;AAYA;;AAEA,MAAIuwF,KAAK,CAAEH,EAAF,GAAOE,GAAP,GAAa,IAAIF,EAAJ,GAASrC,EAAtB,GAA2BqC,KAAKpwF,CAAzC;AACA,MAAI0hC,KAAK,CAAE,IAAI0uD,EAAN,IAAaE,GAAb,GAAmB,CAAE,CAAE,GAAF,GAAQ,IAAIF,EAAd,IAAqBrC,EAAxC,GAA6C,CAAE,CAAE,GAAF,GAAQqC,EAAV,IAAiBpwF,CAA9D,GAAkE,CAA3E;AACA,MAAI+B,KAAK,CAAE,CAAE,CAAF,GAAMsuF,EAAR,IAAeC,GAAf,GAAqB,CAAE,MAAMD,EAAR,IAAetC,EAApC,GAAyC,MAAM/tF,CAAxD;AACA,MAAIwwF,KAAKH,KAAKC,GAAL,GAAWD,KAAKtC,EAAzB;;AAEA;;AAEA,OAAM,IAAI5oG,IAAI,CAAd,EAAiBA,MAAM29E,MAAvB,EAA+B,EAAG39E,CAAlC,EAAsC;;AAErCk/D,UAAQl/D,CAAR,IACEorG,KAAKtiE,OAAQiiE,KAAK/qG,CAAb,CAAL,GACAu8C,KAAKzT,OAAQgiE,KAAK9qG,CAAb,CADL,GAEA4c,KAAKksB,OAAQ+hE,KAAK7qG,CAAb,CAFL,GAGAqrG,KAAKviE,OAAQkiE,KAAKhrG,CAAb,CAJP;AAMA;;AAED,SAAOk/D,MAAP;AAEA;;AA7HkF,CAAvD,CAA7B;;AAiIA;;;;AAIA,SAASosC,iBAAT,CAA4BjD,kBAA5B,EAAgDC,YAAhD,EAA8DC,UAA9D,EAA0EC,YAA1E,EAAyF;;AAExFJ,aAAYrpG,IAAZ,CAAkB,IAAlB,EAAwBspG,kBAAxB,EAA4CC,YAA5C,EAA0DC,UAA1D,EAAsEC,YAAtE;AAEA;;AAED8C,kBAAkBvtG,SAAlB,GAA8BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAeokF,YAAYrqG,SAA3B,CAAf,EAAuD;;AAEpF0O,cAAa6+F,iBAFuE;;AAIpF/B,eAAc,UAAW5pD,EAAX,EAAe5C,EAAf,EAAmBryC,CAAnB,EAAsBsyC,EAAtB,EAA2B;;AAExC,MAAIkiB,SAAS,KAAKspC,YAAlB;AAAA,MACC1/D,SAAS,KAAKw/D,YADf;AAAA,MAEC3qB,SAAS,KAAK+qB,SAFf;AAAA,MAIC6C,UAAU5rD,KAAKg+B,MAJhB;AAAA,MAKC6tB,UAAUD,UAAU5tB,MALrB;AAAA,MAOC8tB,UAAU,CAAE/gG,IAAIqyC,EAAN,KAAeC,KAAKD,EAApB,CAPX;AAAA,MAQC2uD,UAAU,IAAID,OARf;;AAUA,OAAM,IAAIzrG,IAAI,CAAd,EAAiBA,MAAM29E,MAAvB,EAA+B,EAAG39E,CAAlC,EAAsC;;AAErCk/D,UAAQl/D,CAAR,IACE8oC,OAAQ0iE,UAAUxrG,CAAlB,IAAwB0rG,OAAxB,GACA5iE,OAAQyiE,UAAUvrG,CAAlB,IAAwByrG,OAF1B;AAIA;;AAED,SAAOvsC,MAAP;AAEA;;AA1BmF,CAAvD,CAA9B;;AA8BA;;;;;;;;AAQA,SAASysC,mBAAT,CAA8BtD,kBAA9B,EAAkDC,YAAlD,EAAgEC,UAAhE,EAA4EC,YAA5E,EAA2F;;AAE1FJ,aAAYrpG,IAAZ,CAAkB,IAAlB,EAAwBspG,kBAAxB,EAA4CC,YAA5C,EAA0DC,UAA1D,EAAsEC,YAAtE;AAEA;;AAEDmD,oBAAoB5tG,SAApB,GAAgCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAeokF,YAAYrqG,SAA3B,CAAf,EAAuD;;AAEtF0O,cAAak/F,mBAFyE;;AAItFpC,eAAc,UAAW5pD,EAAX,CAAc,gBAAd,EAAiC;;AAE9C,SAAO,KAAKgqD,gBAAL,CAAuBhqD,KAAK,CAA5B,CAAP;AAEA;;AARqF,CAAvD,CAAhC;;AAYA;;;;;;AAMA,IAAIisD,iBAAiB;;AAEpB;AACAC,aAAY,UAAW/rG,KAAX,EAAkBgsG,IAAlB,EAAwBC,EAAxB,EAA6B;;AAExC,MAAKH,eAAeI,YAAf,CAA6BlsG,KAA7B,CAAL,EAA4C;;AAE3C;AACA;AACA,UAAO,IAAIA,MAAM2M,WAAV,CAAuB3M,MAAMujC,QAAN,CAAgByoE,IAAhB,EAAsBC,OAAO1uG,SAAP,GAAmB0uG,EAAnB,GAAwBjsG,MAAMnB,MAApD,CAAvB,CAAP;AAEA;;AAED,SAAOmB,MAAMC,KAAN,CAAa+rG,IAAb,EAAmBC,EAAnB,CAAP;AAEA,EAfmB;;AAiBpB;AACAE,eAAc,UAAWnsG,KAAX,EAAkBZ,IAAlB,EAAwBgtG,UAAxB,EAAqC;;AAElD,MAAK,CAAEpsG,KAAF,IAAW;AACd,GAAEosG,UAAF,IAAgBpsG,MAAM2M,WAAN,KAAsBvN,IADxC,EAC+C,OAAOY,KAAP;;AAE/C,MAAK,OAAOZ,KAAK+jC,iBAAZ,KAAkC,QAAvC,EAAkD;;AAEjD,UAAO,IAAI/jC,IAAJ,CAAUY,KAAV,CAAP,CAFiD,CAEvB;AAE1B;;AAED,SAAOq4B,MAAMp6B,SAAN,CAAgBgC,KAAhB,CAAsBhB,IAAtB,CAA4Be,KAA5B,CAAP,CAXkD,CAWN;AAE5C,EA/BmB;;AAiCpBksG,eAAc,UAAWtjF,MAAX,EAAoB;;AAEjC,SAAOyjF,YAAYC,MAAZ,CAAoB1jF,MAApB,KACL,EAAIA,kBAAkB2jF,QAAtB,CADF;AAGA,EAtCmB;;AAwCpB;AACAC,mBAAkB,UAAW3E,KAAX,EAAmB;;AAEpC,WAAS4E,WAAT,CAAsBvsG,CAAtB,EAAyBirB,CAAzB,EAA6B;;AAE5B,UAAO08E,MAAO3nG,CAAP,IAAa2nG,MAAO18E,CAAP,CAApB;AAEA;;AAED,MAAIhhB,IAAI09F,MAAMhpG,MAAd;AACA,MAAIugE,SAAS,IAAI/mC,KAAJ,CAAWluB,CAAX,CAAb;AACA,OAAM,IAAIjK,IAAI,CAAd,EAAiBA,MAAMiK,CAAvB,EAA0B,EAAGjK,CAA7B,EAAiCk/D,OAAQl/D,CAAR,IAAcA,CAAd;;AAEjCk/D,SAAOtvB,IAAP,CAAa28D,WAAb;;AAEA,SAAOrtC,MAAP;AAEA,EAzDmB;;AA2DpB;AACAstC,cAAa,UAAW1jE,MAAX,EAAmB60C,MAAnB,EAA2B7qE,KAA3B,EAAmC;;AAE/C,MAAI25F,UAAU3jE,OAAOnqC,MAArB;AACA,MAAIugE,SAAS,IAAIp2B,OAAOr8B,WAAX,CAAwBggG,OAAxB,CAAb;;AAEA,OAAM,IAAIzsG,IAAI,CAAR,EAAWqb,YAAY,CAA7B,EAAgCA,cAAcoxF,OAA9C,EAAuD,EAAGzsG,CAA1D,EAA8D;;AAE7D,OAAI0sG,YAAY55F,MAAO9S,CAAP,IAAa29E,MAA7B;;AAEA,QAAM,IAAI1yD,IAAI,CAAd,EAAiBA,MAAM0yD,MAAvB,EAA+B,EAAG1yD,CAAlC,EAAsC;;AAErCi0C,WAAQ7jD,WAAR,IAAyBytB,OAAQ4jE,YAAYzhF,CAApB,CAAzB;AAEA;AAED;;AAED,SAAOi0C,MAAP;AAEA,EA/EmB;;AAiFpB;AACAytC,cAAa,UAAWC,QAAX,EAAqBjF,KAArB,EAA4B7+D,MAA5B,EAAoC+jE,iBAApC,EAAwD;;AAEpE,MAAI7sG,IAAI,CAAR;AAAA,MAAW+oC,MAAM6jE,SAAU,CAAV,CAAjB;;AAEA,SAAQ7jE,QAAQ1rC,SAAR,IAAqB0rC,IAAK8jE,iBAAL,MAA6BxvG,SAA1D,EAAsE;;AAErE0rC,SAAM6jE,SAAU5sG,GAAV,CAAN;AAEA;;AAED,MAAK+oC,QAAQ1rC,SAAb,EAAyB,OAV2C,CAUnC;;AAEjC,MAAII,QAAQsrC,IAAK8jE,iBAAL,CAAZ;AACA,MAAKpvG,UAAUJ,SAAf,EAA2B,OAbyC,CAajC;;AAEnC,MAAK86B,MAAMC,OAAN,CAAe36B,KAAf,CAAL,EAA8B;;AAE7B,MAAG;;AAEFA,YAAQsrC,IAAK8jE,iBAAL,CAAR;;AAEA,QAAKpvG,UAAUJ,SAAf,EAA2B;;AAE1BsqG,WAAMpoG,IAAN,CAAYwpC,IAAIlI,IAAhB;AACAiI,YAAOvpC,IAAP,CAAYkqE,KAAZ,CAAmB3gC,MAAnB,EAA2BrrC,KAA3B,EAH0B,CAGU;AAEpC;;AAEDsrC,UAAM6jE,SAAU5sG,GAAV,CAAN;AAEA,IAbD,QAaU+oC,QAAQ1rC,SAblB;AAeA,GAjBD,MAiBO,IAAKI,MAAMmS,OAAN,KAAkBvS,SAAvB,EAAmC;;AAEzC;;AAEA,MAAG;;AAEFI,YAAQsrC,IAAK8jE,iBAAL,CAAR;;AAEA,QAAKpvG,UAAUJ,SAAf,EAA2B;;AAE1BsqG,WAAMpoG,IAAN,CAAYwpC,IAAIlI,IAAhB;AACApjC,WAAMmS,OAAN,CAAek5B,MAAf,EAAuBA,OAAOnqC,MAA9B;AAEA;;AAEDoqC,UAAM6jE,SAAU5sG,GAAV,CAAN;AAEA,IAbD,QAaU+oC,QAAQ1rC,SAblB;AAeA,GAnBM,MAmBA;;AAEN;;AAEA,MAAG;;AAEFI,YAAQsrC,IAAK8jE,iBAAL,CAAR;;AAEA,QAAKpvG,UAAUJ,SAAf,EAA2B;;AAE1BsqG,WAAMpoG,IAAN,CAAYwpC,IAAIlI,IAAhB;AACAiI,YAAOvpC,IAAP,CAAa9B,KAAb;AAEA;;AAEDsrC,UAAM6jE,SAAU5sG,GAAV,CAAN;AAEA,IAbD,QAaU+oC,QAAQ1rC,SAblB;AAeA;AAED;;AA1JmB,CAArB;;AA8JA;;;;;;;;;;AAUA,SAASwqG,aAAT,CAAwBzkF,IAAxB,EAA8BukF,KAA9B,EAAqC7+D,MAArC,EAA6C8+D,aAA7C,EAA6D;;AAE5D,KAAKxkF,SAAS/lB,SAAd,EAA0B,MAAM,IAAIiP,KAAJ,CAAW,8CAAX,CAAN;AAC1B,KAAKq7F,UAAUtqG,SAAV,IAAuBsqG,MAAMhpG,MAAN,KAAiB,CAA7C,EAAiD,MAAM,IAAI2N,KAAJ,CAAW,sDAAsD8W,IAAjE,CAAN;;AAEjD,MAAKA,IAAL,GAAYA,IAAZ;;AAEA,MAAKukF,KAAL,GAAaiE,eAAeK,YAAf,CAA6BtE,KAA7B,EAAoC,KAAKmF,cAAzC,CAAb;AACA,MAAKhkE,MAAL,GAAc8iE,eAAeK,YAAf,CAA6BnjE,MAA7B,EAAqC,KAAKi/D,eAA1C,CAAd;;AAEA,MAAKgF,gBAAL,CAAuBnF,iBAAiB,KAAKI,oBAA7C;;AAEA,MAAKgF,QAAL;AACA,MAAKC,QAAL;AAEA;;AAED;;AAEAjvG,OAAOK,MAAP,CAAewpG,aAAf,EAA8B;;AAE7B;AACA;;AAEA5+D,QAAO,UAAW83D,IAAX,EAAkB;;AAExB,MAAKA,KAAK7hG,IAAL,KAAc7B,SAAnB,EAA+B;;AAE9B,SAAM,IAAIiP,KAAJ,CAAW,0DAAX,CAAN;AAEA;;AAED,MAAI4gG,YAAYrF,cAAcsF,6BAAd,CAA6CpM,KAAK7hG,IAAlD,CAAhB;;AAEA,MAAK6hG,KAAK4G,KAAL,KAAetqG,SAApB,EAAgC;;AAE/B,OAAIsqG,QAAQ,EAAZ;AAAA,OAAgB7+D,SAAS,EAAzB;;AAEA8iE,kBAAee,WAAf,CAA4B5L,KAAKhrD,IAAjC,EAAuC4xD,KAAvC,EAA8C7+D,MAA9C,EAAsD,OAAtD;;AAEAi4D,QAAK4G,KAAL,GAAaA,KAAb;AACA5G,QAAKj4D,MAAL,GAAcA,MAAd;AAEA;;AAED;AACA,MAAKokE,UAAUjkE,KAAV,KAAoB5rC,SAAzB,EAAqC;;AAEpC,UAAO6vG,UAAUjkE,KAAV,CAAiB83D,IAAjB,CAAP;AAEA,GAJD,MAIO;;AAEN;AACA,UAAO,IAAImM,SAAJ,CAAenM,KAAK39E,IAApB,EAA0B29E,KAAK4G,KAA/B,EAAsC5G,KAAKj4D,MAA3C,EAAmDi4D,KAAK6G,aAAxD,CAAP;AAEA;AAED,EAtC4B;;AAwC7BzjF,SAAQ,UAAWipF,KAAX,EAAmB;;AAE1B,MAAIF,YAAYE,MAAM3gG,WAAtB;;AAEA,MAAIs0F,IAAJ;;AAEA;AACA,MAAKmM,UAAU/oF,MAAV,KAAqB9mB,SAA1B,EAAsC;;AAErC0jG,UAAOmM,UAAU/oF,MAAV,CAAkBipF,KAAlB,CAAP;AAEA,GAJD,MAIO;;AAEN;AACArM,UAAO;;AAEN,YAAQqM,MAAMhqF,IAFR;AAGN,aAASwoF,eAAeK,YAAf,CAA6BmB,MAAMzF,KAAnC,EAA0CxvE,KAA1C,CAHH;AAIN,cAAUyzE,eAAeK,YAAf,CAA6BmB,MAAMtkE,MAAnC,EAA2C3Q,KAA3C;;AAJJ,IAAP;;AAQA,OAAIyvE,gBAAgBwF,MAAMC,gBAAN,EAApB;;AAEA,OAAKzF,kBAAkBwF,MAAMpF,oBAA7B,EAAoD;;AAEnDjH,SAAK6G,aAAL,GAAqBA,aAArB;AAEA;AAED;;AAED7G,OAAK7hG,IAAL,GAAYkuG,MAAMtF,aAAlB,CAhC0B,CAgCO;;AAEjC,SAAO/G,IAAP;AAEA,EA5E4B;;AA8E7BoM,gCAA+B,UAAWG,QAAX,EAAsB;;AAEpD,UAASA,SAAS/Q,WAAT,EAAT;;AAEC,QAAK,QAAL;AACA,QAAK,QAAL;AACA,QAAK,OAAL;AACA,QAAK,QAAL;AACA,QAAK,SAAL;;AAEC,WAAOyN,mBAAP;;AAED,QAAK,QAAL;AACA,QAAK,SAAL;AACA,QAAK,SAAL;AACA,QAAK,SAAL;;AAEC,WAAOuD,mBAAP;;AAED,QAAK,OAAL;;AAEC,WAAOxD,kBAAP;;AAED,QAAK,YAAL;;AAEC,WAAOF,uBAAP;;AAED,QAAK,MAAL;AACA,QAAK,SAAL;;AAEC,WAAO1B,oBAAP;;AAED,QAAK,QAAL;;AAEC,WAAOT,mBAAP;;AAhCF;;AAoCA,QAAM,IAAIp7F,KAAJ,CAAW,gDAAgDghG,QAA3D,CAAN;AAEA;;AAtH4B,CAA9B;;AA0HAtvG,OAAOK,MAAP,CAAewpG,cAAc9pG,SAA7B,EAAwC;;AAEvC0O,cAAao7F,aAF0B;;AAIvCiF,iBAAgB5qE,YAJuB;;AAMvC6lE,kBAAiB7lE,YANsB;;AAQvC8lE,uBAAsBlgG,iBARiB;;AAUvC0lG,mCAAkC,UAAWtuC,MAAX,EAAoB;;AAErD,SAAO,IAAIysC,mBAAJ,CAAyB,KAAKhE,KAA9B,EAAqC,KAAK7+D,MAA1C,EAAkD,KAAKghE,YAAL,EAAlD,EAAuE5qC,MAAvE,CAAP;AAEA,EAdsC;;AAgBvC+oC,iCAAgC,UAAW/oC,MAAX,EAAoB;;AAEnD,SAAO,IAAIosC,iBAAJ,CAAuB,KAAK3D,KAA5B,EAAmC,KAAK7+D,MAAxC,EAAgD,KAAKghE,YAAL,EAAhD,EAAqE5qC,MAArE,CAAP;AAEA,EApBsC;;AAsBvCgpC,iCAAgC,UAAWhpC,MAAX,EAAoB;;AAEnD,SAAO,IAAI+qC,gBAAJ,CAAsB,KAAKtC,KAA3B,EAAkC,KAAK7+D,MAAvC,EAA+C,KAAKghE,YAAL,EAA/C,EAAoE5qC,MAApE,CAAP;AAEA,EA1BsC;;AA4BvC6tC,mBAAkB,UAAWnF,aAAX,EAA2B;;AAE5C,MAAI6F,aAAJ;;AAEA,UAAS7F,aAAT;;AAEC,QAAK//F,mBAAL;;AAEC4lG,oBAAgB,KAAKD,gCAArB;;AAEA;;AAED,QAAK1lG,iBAAL;;AAEC2lG,oBAAgB,KAAKxF,8BAArB;;AAEA;;AAED,QAAKlgG,iBAAL;;AAEC0lG,oBAAgB,KAAKvF,8BAArB;;AAEA;;AAlBF;;AAsBA,MAAKuF,kBAAkBpwG,SAAvB,EAAmC;;AAElC,OAAIo8E,UAAU,mCACb,KAAKquB,aADQ,GACQ,wBADR,GACmC,KAAK1kF,IADtD;;AAGA,OAAK,KAAKsqF,iBAAL,KAA2BrwG,SAAhC,EAA4C;;AAE3C;AACA,QAAKuqG,kBAAkB,KAAKI,oBAA5B,EAAmD;;AAElD,UAAK+E,gBAAL,CAAuB,KAAK/E,oBAA5B;AAEA,KAJD,MAIO;;AAEN,WAAM,IAAI17F,KAAJ,CAAWmtE,OAAX,CAAN,CAFM,CAEsB;AAE5B;AAED;;AAED3sE,WAAQC,IAAR,CAAc,sBAAd,EAAsC0sE,OAAtC;AACA;AAEA;;AAED,OAAKi0B,iBAAL,GAAyBD,aAAzB;AAEA,EAjFsC;;AAmFvCJ,mBAAkB,YAAY;;AAE7B,UAAS,KAAKK,iBAAd;;AAEC,QAAK,KAAKF,gCAAV;;AAEC,WAAO3lG,mBAAP;;AAED,QAAK,KAAKogG,8BAAV;;AAEC,WAAOngG,iBAAP;;AAED,QAAK,KAAKogG,8BAAV;;AAEC,WAAOngG,iBAAP;;AAZF;AAgBA,EArGsC;;AAuGvC+hG,eAAc,YAAY;;AAEzB,SAAO,KAAKhhE,MAAL,CAAYnqC,MAAZ,GAAqB,KAAKgpG,KAAL,CAAWhpG,MAAvC;AAEA,EA3GsC;;AA6GvC;AACAgvG,QAAO,UAAWC,UAAX,EAAwB;;AAE9B,MAAKA,eAAe,GAApB,EAA0B;;AAEzB,OAAIjG,QAAQ,KAAKA,KAAjB;;AAEA,QAAM,IAAI3nG,IAAI,CAAR,EAAWiK,IAAI09F,MAAMhpG,MAA3B,EAAmCqB,MAAMiK,CAAzC,EAA4C,EAAGjK,CAA/C,EAAmD;;AAElD2nG,UAAO3nG,CAAP,KAAc4tG,UAAd;AAEA;AAED;;AAED,SAAO,IAAP;AAEA,EA9HsC;;AAgIvC;AACAp2F,QAAO,UAAWq2F,SAAX,EAAuB;;AAE7B,MAAKA,cAAc,GAAnB,EAAyB;;AAExB,OAAIlG,QAAQ,KAAKA,KAAjB;;AAEA,QAAM,IAAI3nG,IAAI,CAAR,EAAWiK,IAAI09F,MAAMhpG,MAA3B,EAAmCqB,MAAMiK,CAAzC,EAA4C,EAAGjK,CAA/C,EAAmD;;AAElD2nG,UAAO3nG,CAAP,KAAc6tG,SAAd;AAEA;AAED;;AAED,SAAO,IAAP;AAEA,EAjJsC;;AAmJvC;AACA;AACAr4C,OAAM,UAAWs4C,SAAX,EAAsBC,OAAtB,EAAgC;;AAErC,MAAIpG,QAAQ,KAAKA,KAAjB;AAAA,MACCqG,QAAQrG,MAAMhpG,MADf;AAAA,MAECmtG,OAAO,CAFR;AAAA,MAGCC,KAAKiC,QAAQ,CAHd;;AAKA,SAAQlC,SAASkC,KAAT,IAAkBrG,MAAOmE,IAAP,IAAgBgC,SAA1C,EAAsD;;AAErD,KAAGhC,IAAH;AAEA;;AAED,SAAQC,OAAO,CAAE,CAAT,IAAcpE,MAAOoE,EAAP,IAAcgC,OAApC,EAA8C;;AAE7C,KAAGhC,EAAH;AAEA;;AAED,IAAGA,EAAH,CAnBqC,CAmB9B;;AAEP,MAAKD,SAAS,CAAT,IAAcC,OAAOiC,KAA1B,EAAkC;;AAEjC;AACA,OAAKlC,QAAQC,EAAb,EAAkBA,KAAKzuG,KAAKyM,GAAL,CAAUgiG,EAAV,EAAc,CAAd,CAAL,EAAwBD,OAAOC,KAAK,CAApC;;AAElB,OAAIpuB,SAAS,KAAKmsB,YAAL,EAAb;AACA,QAAKnC,KAAL,GAAaiE,eAAeC,UAAf,CAA2BlE,KAA3B,EAAkCmE,IAAlC,EAAwCC,EAAxC,CAAb;AACA,QAAKjjE,MAAL,GAAc8iE,eAAeC,UAAf,CAA2B,KAAK/iE,MAAhC,EAAwCgjE,OAAOnuB,MAA/C,EAAuDouB,KAAKpuB,MAA5D,CAAd;AAEA;;AAED,SAAO,IAAP;AAEA,EAvLsC;;AAyLvC;AACAqvB,WAAU,YAAY;;AAErB,MAAIiB,QAAQ,IAAZ;;AAEA,MAAIvF,YAAY,KAAKoB,YAAL,EAAhB;AACA,MAAKpB,YAAYprG,KAAKK,KAAL,CAAY+qG,SAAZ,CAAZ,KAAwC,CAA7C,EAAiD;;AAEhD57F,WAAQyD,KAAR,CAAe,mDAAf,EAAoE,IAApE;AACA09F,WAAQ,KAAR;AAEA;;AAED,MAAItG,QAAQ,KAAKA,KAAjB;AAAA,MACC7+D,SAAS,KAAKA,MADf;AAAA,MAGCklE,QAAQrG,MAAMhpG,MAHf;;AAKA,MAAKqvG,UAAU,CAAf,EAAmB;;AAElBlhG,WAAQyD,KAAR,CAAe,sCAAf,EAAuD,IAAvD;AACA09F,WAAQ,KAAR;AAEA;;AAED,MAAIC,WAAW,IAAf;;AAEA,OAAM,IAAIluG,IAAI,CAAd,EAAiBA,MAAMguG,KAAvB,EAA8BhuG,GAA9B,EAAqC;;AAEpC,OAAImuG,WAAWxG,MAAO3nG,CAAP,CAAf;;AAEA,OAAK,OAAOmuG,QAAP,KAAoB,QAApB,IAAgCj5D,MAAOi5D,QAAP,CAArC,EAAyD;;AAExDrhG,YAAQyD,KAAR,CAAe,kDAAf,EAAmE,IAAnE,EAAyEvQ,CAAzE,EAA4EmuG,QAA5E;AACAF,YAAQ,KAAR;AACA;AAEA;;AAED,OAAKC,aAAa,IAAb,IAAqBA,WAAWC,QAArC,EAAgD;;AAE/CrhG,YAAQyD,KAAR,CAAe,yCAAf,EAA0D,IAA1D,EAAgEvQ,CAAhE,EAAmEmuG,QAAnE,EAA6ED,QAA7E;AACAD,YAAQ,KAAR;AACA;AAEA;;AAEDC,cAAWC,QAAX;AAEA;;AAED,MAAKrlE,WAAWzrC,SAAhB,EAA4B;;AAE3B,OAAKuuG,eAAeI,YAAf,CAA6BljE,MAA7B,CAAL,EAA6C;;AAE5C,SAAM,IAAI9oC,IAAI,CAAR,EAAWiK,IAAI6+B,OAAOnqC,MAA5B,EAAoCqB,MAAMiK,CAA1C,EAA6C,EAAGjK,CAAhD,EAAoD;;AAEnD,SAAIvC,QAAQqrC,OAAQ9oC,CAAR,CAAZ;;AAEA,SAAKk1C,MAAOz3C,KAAP,CAAL,EAAsB;;AAErBqP,cAAQyD,KAAR,CAAe,mDAAf,EAAoE,IAApE,EAA0EvQ,CAA1E,EAA6EvC,KAA7E;AACAwwG,cAAQ,KAAR;AACA;AAEA;AAED;AAED;AAED;;AAED,SAAOA,KAAP;AAEA,EApQsC;;AAsQvC;AACA;AACAhB,WAAU,YAAY;;AAErB,MAAItF,QAAQ,KAAKA,KAAjB;AAAA,MACC7+D,SAAS,KAAKA,MADf;AAAA,MAEC60C,SAAS,KAAKmsB,YAAL,EAFV;AAAA,MAICsE,sBAAsB,KAAKf,gBAAL,OAA4BtlG,iBAJnD;AAAA,MAMCsmG,aAAa,CANd;AAAA,MAOC7+C,YAAYm4C,MAAMhpG,MAAN,GAAe,CAP5B;;AASA,OAAM,IAAIqB,IAAI,CAAd,EAAiBA,IAAIwvD,SAArB,EAAgC,EAAGxvD,CAAnC,EAAuC;;AAEtC,OAAIsuG,OAAO,KAAX;;AAEA,OAAIztE,OAAO8mE,MAAO3nG,CAAP,CAAX;AACA,OAAIuuG,WAAW5G,MAAO3nG,IAAI,CAAX,CAAf;;AAEA;;AAEA,OAAK6gC,SAAS0tE,QAAT,KAAuBvuG,MAAM,CAAN,IAAW6gC,SAASA,KAAM,CAAN,CAA3C,CAAL,EAA8D;;AAE7D,QAAK,CAAEutE,mBAAP,EAA6B;;AAE5B;;AAEA,SAAIz+F,SAAS3P,IAAI29E,MAAjB;AAAA,SACC6wB,UAAU7+F,SAASguE,MADpB;AAAA,SAEC8wB,UAAU9+F,SAASguE,MAFpB;;AAIA,UAAM,IAAI1yD,IAAI,CAAd,EAAiBA,MAAM0yD,MAAvB,EAA+B,EAAG1yD,CAAlC,EAAsC;;AAErC,UAAIxtB,QAAQqrC,OAAQn5B,SAASsb,CAAjB,CAAZ;;AAEA,UAAKxtB,UAAUqrC,OAAQ0lE,UAAUvjF,CAAlB,CAAV,IACJxtB,UAAUqrC,OAAQ2lE,UAAUxjF,CAAlB,CADX,EACmC;;AAElCqjF,cAAO,IAAP;AACA;AAEA;AAED;AAED,KAtBD,MAsBO;;AAENA,YAAO,IAAP;AAEA;AAED;;AAED;;AAEA,OAAKA,IAAL,EAAY;;AAEX,QAAKtuG,MAAMquG,UAAX,EAAwB;;AAEvB1G,WAAO0G,UAAP,IAAsB1G,MAAO3nG,CAAP,CAAtB;;AAEA,SAAI0uG,aAAa1uG,IAAI29E,MAArB;AAAA,SACCgxB,cAAcN,aAAa1wB,MAD5B;;AAGA,UAAM,IAAI1yD,IAAI,CAAd,EAAiBA,MAAM0yD,MAAvB,EAA+B,EAAG1yD,CAAlC,EAAsC;;AAErC6d,aAAQ6lE,cAAc1jF,CAAtB,IAA4B6d,OAAQ4lE,aAAazjF,CAArB,CAA5B;AAEA;AAED;;AAED,MAAGojF,UAAH;AAEA;AAED;;AAED;;AAEA,MAAK7+C,YAAY,CAAjB,EAAqB;;AAEpBm4C,SAAO0G,UAAP,IAAsB1G,MAAOn4C,SAAP,CAAtB;;AAEA,QAAM,IAAIk/C,aAAal/C,YAAYmuB,MAA7B,EAAqCgxB,cAAcN,aAAa1wB,MAAhE,EAAwE1yD,IAAI,CAAlF,EAAqFA,MAAM0yD,MAA3F,EAAmG,EAAG1yD,CAAtG,EAA0G;;AAEzG6d,WAAQ6lE,cAAc1jF,CAAtB,IAA4B6d,OAAQ4lE,aAAazjF,CAArB,CAA5B;AAEA;;AAED,KAAGojF,UAAH;AAEA;;AAED,MAAKA,eAAe1G,MAAMhpG,MAA1B,EAAmC;;AAElC,QAAKgpG,KAAL,GAAaiE,eAAeC,UAAf,CAA2BlE,KAA3B,EAAkC,CAAlC,EAAqC0G,UAArC,CAAb;AACA,QAAKvlE,MAAL,GAAc8iE,eAAeC,UAAf,CAA2B/iE,MAA3B,EAAmC,CAAnC,EAAsCulE,aAAa1wB,MAAnD,CAAd;AAEA;;AAED,SAAO,IAAP;AAEA;;AA9WsC,CAAxC;;AAkXA;;;;;;;;;;AAUA,SAAS4vB,mBAAT,CAA8BnqF,IAA9B,EAAoCukF,KAApC,EAA2C7+D,MAA3C,EAAmD8+D,aAAnD,EAAmE;;AAElEC,eAAc9oG,IAAd,CAAoB,IAApB,EAA0BqkB,IAA1B,EAAgCukF,KAAhC,EAAuC7+D,MAAvC,EAA+C8+D,aAA/C;AAEA;;AAED2F,oBAAoBxvG,SAApB,GAAgCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe6jF,cAAc9pG,SAA7B,CAAf,EAAyD;;AAExF0O,cAAa8gG,mBAF2E;;AAIxFzF,gBAAe;;AAEf;;AAEA;;AARwF,CAAzD,CAAhC;;AAYA;;;;;;;;AAQA,SAAS8G,aAAT,CAAwBxrF,IAAxB,EAA8ByrF,QAA9B,EAAwCC,MAAxC,EAAiD;;AAEhD,MAAK1rF,IAAL,GAAYA,IAAZ;AACA,MAAK0rF,MAAL,GAAcA,MAAd;AACA,MAAKD,QAAL,GAAkBA,aAAaxxG,SAAf,GAA6BwxG,QAA7B,GAAwC,CAAE,CAA1D;;AAEA,MAAKllG,IAAL,GAAYX,MAAMI,YAAN,EAAZ;;AAEA;AACA,KAAK,KAAKylG,QAAL,GAAgB,CAArB,EAAyB;;AAExB,OAAKE,aAAL;AAEA;;AAED,MAAK9B,QAAL;AAEA;;AAEDjvG,OAAOK,MAAP,CAAeuwG,aAAf,EAA8B;;AAE7B3lE,QAAO,UAAW83D,IAAX,EAAkB;;AAExB,MAAI+N,SAAS,EAAb;AAAA,MACCE,aAAajO,KAAK+N,MADnB;AAAA,MAECG,YAAY,OAAQlO,KAAKmO,GAAL,IAAY,GAApB,CAFb;;AAIA,OAAM,IAAIlvG,IAAI,CAAR,EAAWiK,IAAI+kG,WAAWrwG,MAAhC,EAAwCqB,MAAMiK,CAA9C,EAAiD,EAAGjK,CAApD,EAAwD;;AAEvD8uG,UAAOvvG,IAAP,CAAasoG,cAAc5+D,KAAd,CAAqB+lE,WAAYhvG,CAAZ,CAArB,EAAuCwX,KAAvC,CAA8Cy3F,SAA9C,CAAb;AAEA;;AAED,SAAO,IAAIL,aAAJ,CAAmB7N,KAAK39E,IAAxB,EAA8B29E,KAAK8N,QAAnC,EAA6CC,MAA7C,CAAP;AAEA,EAhB4B;;AAkB7B3qF,SAAQ,UAAWgrF,IAAX,EAAkB;;AAEzB,MAAIL,SAAS,EAAb;AAAA,MACCM,aAAaD,KAAKL,MADnB;;AAGA,MAAI/N,OAAO;;AAEV,WAAQoO,KAAK/rF,IAFH;AAGV,eAAY+rF,KAAKN,QAHP;AAIV,aAAUC,MAJA;AAKV,WAAQK,KAAKxlG;;AALH,GAAX;;AASA,OAAM,IAAI3J,IAAI,CAAR,EAAWiK,IAAImlG,WAAWzwG,MAAhC,EAAwCqB,MAAMiK,CAA9C,EAAiD,EAAGjK,CAApD,EAAwD;;AAEvD8uG,UAAOvvG,IAAP,CAAasoG,cAAc1jF,MAAd,CAAsBirF,WAAYpvG,CAAZ,CAAtB,CAAb;AAEA;;AAED,SAAO+gG,IAAP;AAEA,EAxC4B;;AA0C7BsO,gCAA+B,UAAWjsF,IAAX,EAAiBksF,mBAAjB,EAAsCJ,GAAtC,EAA2CK,MAA3C,EAAoD;;AAElF,MAAIC,kBAAkBF,oBAAoB3wG,MAA1C;AACA,MAAImwG,SAAS,EAAb;;AAEA,OAAM,IAAI9uG,IAAI,CAAd,EAAiBA,IAAIwvG,eAArB,EAAsCxvG,GAAtC,EAA6C;;AAE5C,OAAI2nG,QAAQ,EAAZ;AACA,OAAI7+D,SAAS,EAAb;;AAEA6+D,SAAMpoG,IAAN,CACC,CAAES,IAAIwvG,eAAJ,GAAsB,CAAxB,IAA8BA,eAD/B,EAECxvG,CAFD,EAGC,CAAEA,IAAI,CAAN,IAAYwvG,eAHb;;AAKA1mE,UAAOvpC,IAAP,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB;;AAEA,OAAIuT,QAAQ84F,eAAeU,gBAAf,CAAiC3E,KAAjC,CAAZ;AACAA,WAAQiE,eAAeY,WAAf,CAA4B7E,KAA5B,EAAmC,CAAnC,EAAsC70F,KAAtC,CAAR;AACAg2B,YAAS8iE,eAAeY,WAAf,CAA4B1jE,MAA5B,EAAoC,CAApC,EAAuCh2B,KAAvC,CAAT;;AAEA;AACA;AACA,OAAK,CAAEy8F,MAAF,IAAY5H,MAAO,CAAP,MAAe,CAAhC,EAAoC;;AAEnCA,UAAMpoG,IAAN,CAAYiwG,eAAZ;AACA1mE,WAAOvpC,IAAP,CAAaupC,OAAQ,CAAR,CAAb;AAEA;;AAEDgmE,UAAOvvG,IAAP,CACC,IAAIyqG,mBAAJ,CACC,4BAA4BsF,oBAAqBtvG,CAArB,EAAyBojB,IAArD,GAA4D,GAD7D,EAECukF,KAFD,EAEQ7+D,MAFR,EAGEtxB,KAHF,CAGS,MAAM03F,GAHf,CADD;AAMA;;AAED,SAAO,IAAIN,aAAJ,CAAmBxrF,IAAnB,EAAyB,CAAE,CAA3B,EAA8B0rF,MAA9B,CAAP;AAEA,EAlF4B;;AAoF7BW,aAAY,UAAWC,iBAAX,EAA8BtsF,IAA9B,EAAqC;;AAEhD,MAAIusF,YAAYD,iBAAhB;;AAEA,MAAK,CAAEv3E,MAAMC,OAAN,CAAes3E,iBAAf,CAAP,EAA4C;;AAE3C,OAAIxoB,IAAIwoB,iBAAR;AACAC,eAAYzoB,EAAE59D,QAAF,IAAc49D,EAAE59D,QAAF,CAAWsmF,UAAzB,IAAuC1oB,EAAE0oB,UAArD;AAEA;;AAED,OAAM,IAAI5vG,IAAI,CAAd,EAAiBA,IAAI2vG,UAAUhxG,MAA/B,EAAuCqB,GAAvC,EAA8C;;AAE7C,OAAK2vG,UAAW3vG,CAAX,EAAeojB,IAAf,KAAwBA,IAA7B,EAAoC;;AAEnC,WAAOusF,UAAW3vG,CAAX,CAAP;AAEA;AAED;;AAED,SAAO,IAAP;AAEA,EA3G4B;;AA6G7B6vG,sCAAqC,UAAWhlE,YAAX,EAAyBqkE,GAAzB,EAA8BK,MAA9B,EAAuC;;AAE3E,MAAIO,0BAA0B,EAA9B;;AAEA;AACA;AACA,MAAIh9C,UAAU,oBAAd;;AAEA;AACA;AACA,OAAM,IAAI9yD,IAAI,CAAR,EAAWooB,KAAKyiB,aAAalsC,MAAnC,EAA2CqB,IAAIooB,EAA/C,EAAmDpoB,GAAnD,EAA0D;;AAEzD,OAAIkxC,cAAcrG,aAAc7qC,CAAd,CAAlB;AACA,OAAI+vG,QAAQ7+D,YAAY9tB,IAAZ,CAAiBhlB,KAAjB,CAAwB00D,OAAxB,CAAZ;;AAEA,OAAKi9C,SAASA,MAAMpxG,MAAN,GAAe,CAA7B,EAAiC;;AAEhC,QAAIykB,OAAO2sF,MAAO,CAAP,CAAX;;AAEA,QAAIC,wBAAwBF,wBAAyB1sF,IAAzB,CAA5B;AACA,QAAK,CAAE4sF,qBAAP,EAA+B;;AAE9BF,6BAAyB1sF,IAAzB,IAAkC4sF,wBAAwB,EAA1D;AAEA;;AAEDA,0BAAsBzwG,IAAtB,CAA4B2xC,WAA5B;AAEA;AAED;;AAED,MAAI++D,QAAQ,EAAZ;;AAEA,OAAM,IAAI7sF,IAAV,IAAkB0sF,uBAAlB,EAA4C;;AAE3CG,SAAM1wG,IAAN,CAAYqvG,cAAcS,6BAAd,CAA6CjsF,IAA7C,EAAmD0sF,wBAAyB1sF,IAAzB,CAAnD,EAAoF8rF,GAApF,EAAyFK,MAAzF,CAAZ;AAEA;;AAED,SAAOU,KAAP;AAEA,EAvJ4B;;AAyJ7B;AACAC,iBAAgB,UAAWh8B,SAAX,EAAsBvc,KAAtB,EAA8B;;AAE7C,MAAK,CAAEuc,SAAP,EAAmB;;AAElBpnE,WAAQyD,KAAR,CAAe,uDAAf;AACA,UAAO,IAAP;AAEA;;AAED,MAAI4/F,mBAAmB,UAAWjD,SAAX,EAAsBkD,SAAtB,EAAiCC,aAAjC,EAAgDC,YAAhD,EAA8DC,UAA9D,EAA2E;;AAEjG;AACA,OAAKF,cAAc1xG,MAAd,KAAyB,CAA9B,EAAkC;;AAEjC,QAAIgpG,QAAQ,EAAZ;AACA,QAAI7+D,SAAS,EAAb;;AAEA8iE,mBAAee,WAAf,CAA4B0D,aAA5B,EAA2C1I,KAA3C,EAAkD7+D,MAAlD,EAA0DwnE,YAA1D;;AAEA;AACA,QAAK3I,MAAMhpG,MAAN,KAAiB,CAAtB,EAA0B;;AAEzB4xG,gBAAWhxG,IAAX,CAAiB,IAAI2tG,SAAJ,CAAekD,SAAf,EAA0BzI,KAA1B,EAAiC7+D,MAAjC,CAAjB;AAEA;AAED;AAED,GAnBD;;AAqBA,MAAIgmE,SAAS,EAAb;;AAEA,MAAI0B,WAAWt8B,UAAU9wD,IAAV,IAAkB,SAAjC;AACA;AACA,MAAIyrF,WAAW36B,UAAUv1E,MAAV,IAAoB,CAAE,CAArC;AACA,MAAIuwG,MAAMh7B,UAAUg7B,GAAV,IAAiB,EAA3B;;AAEA,MAAIuB,kBAAkBv8B,UAAUw8B,SAAV,IAAuB,EAA7C;;AAEA,OAAM,IAAI91F,IAAI,CAAd,EAAiBA,IAAI61F,gBAAgB9xG,MAArC,EAA6Cic,GAA7C,EAAoD;;AAEnD,OAAIy1F,gBAAgBI,gBAAiB71F,CAAjB,EAAqBm7B,IAAzC;;AAEA;AACA,OAAK,CAAEs6D,aAAF,IAAmBA,cAAc1xG,MAAd,KAAyB,CAAjD,EAAqD;;AAErD;AACA,OAAK0xG,cAAe,CAAf,EAAmBxlE,YAAxB,EAAuC;;AAEtC;AACA,QAAI8lE,mBAAmB,EAAvB;;AAEA,SAAM,IAAI5/D,IAAI,CAAd,EAAiBA,IAAIs/D,cAAc1xG,MAAnC,EAA2CoyC,GAA3C,EAAkD;;AAEjD,SAAKs/D,cAAet/D,CAAf,EAAmBlG,YAAxB,EAAuC;;AAEtC,WAAM,IAAI3gC,IAAI,CAAd,EAAiBA,IAAImmG,cAAet/D,CAAf,EAAmBlG,YAAnB,CAAgClsC,MAArD,EAA6DuL,GAA7D,EAAoE;;AAEnEymG,wBAAkBN,cAAet/D,CAAf,EAAmBlG,YAAnB,CAAiC3gC,CAAjC,CAAlB,IAA2D,CAAE,CAA7D;AAEA;AAED;AAED;;AAED;AACA;AACA;AACA,SAAM,IAAI0mG,eAAV,IAA6BD,gBAA7B,EAAgD;;AAE/C,SAAIhJ,QAAQ,EAAZ;AACA,SAAI7+D,SAAS,EAAb;;AAEA,UAAM,IAAI5+B,IAAI,CAAd,EAAiBA,MAAMmmG,cAAet/D,CAAf,EAAmBlG,YAAnB,CAAgClsC,MAAvD,EAA+D,EAAGuL,CAAlE,EAAsE;;AAErE,UAAI2mG,eAAeR,cAAet/D,CAAf,CAAnB;;AAEA42D,YAAMpoG,IAAN,CAAYsxG,aAAahwE,IAAzB;AACAiI,aAAOvpC,IAAP,CAAesxG,aAAa3/D,WAAb,KAA6B0/D,eAA/B,GAAmD,CAAnD,GAAuD,CAApE;AAEA;;AAED9B,YAAOvvG,IAAP,CAAa,IAAIyqG,mBAAJ,CAAyB,2BAA2B4G,eAA3B,GAA6C,GAAtE,EAA2EjJ,KAA3E,EAAkF7+D,MAAlF,CAAb;AAEA;;AAED+lE,eAAW8B,iBAAiBhyG,MAAjB,IAA4BuwG,OAAO,GAAnC,CAAX;AAEA,IA1CD,MA0CO;;AAEN;;AAEA,QAAI4B,WAAW,YAAYn5C,MAAO/8C,CAAP,EAAWwI,IAAvB,GAA8B,GAA7C;;AAEA+sF,qBACC5C,mBADD,EACsBuD,WAAW,WADjC,EAECT,aAFD,EAEgB,KAFhB,EAEuBvB,MAFvB;;AAIAqB,qBACCtG,uBADD,EAC0BiH,WAAW,aADrC,EAECT,aAFD,EAEgB,KAFhB,EAEuBvB,MAFvB;;AAIAqB,qBACC5C,mBADD,EACsBuD,WAAW,QADjC,EAECT,aAFD,EAEgB,KAFhB,EAEuBvB,MAFvB;AAIA;AAED;;AAED,MAAKA,OAAOnwG,MAAP,KAAkB,CAAvB,EAA2B;;AAE1B,UAAO,IAAP;AAEA;;AAED,MAAIwwG,OAAO,IAAIP,aAAJ,CAAmB4B,QAAnB,EAA6B3B,QAA7B,EAAuCC,MAAvC,CAAX;;AAEA,SAAOK,IAAP;AAEA;;AAnR4B,CAA9B;;AAuRAnxG,OAAOK,MAAP,CAAeuwG,cAAc7wG,SAA7B,EAAwC;;AAEvCgxG,gBAAe,YAAY;;AAE1B,MAAID,SAAS,KAAKA,MAAlB;AAAA,MAA0BD,WAAW,CAArC;;AAEA,OAAM,IAAI7uG,IAAI,CAAR,EAAWiK,IAAI6kG,OAAOnwG,MAA5B,EAAoCqB,MAAMiK,CAA1C,EAA6C,EAAGjK,CAAhD,EAAoD;;AAEnD,OAAIotG,QAAQ,KAAK0B,MAAL,CAAa9uG,CAAb,CAAZ;;AAEA6uG,cAAWvxG,KAAKyM,GAAL,CAAU8kG,QAAV,EAAoBzB,MAAMzF,KAAN,CAAayF,MAAMzF,KAAN,CAAYhpG,MAAZ,GAAqB,CAAlC,CAApB,CAAX;AAEA;;AAED,OAAKkwG,QAAL,GAAgBA,QAAhB;AAEA,EAhBsC;;AAkBvCr5C,OAAM,YAAY;;AAEjB,OAAM,IAAIx1D,IAAI,CAAd,EAAiBA,IAAI,KAAK8uG,MAAL,CAAYnwG,MAAjC,EAAyCqB,GAAzC,EAAgD;;AAE/C,QAAK8uG,MAAL,CAAa9uG,CAAb,EAAiBw1D,IAAjB,CAAuB,CAAvB,EAA0B,KAAKq5C,QAA/B;AAEA;;AAED,SAAO,IAAP;AAEA,EA5BsC;;AA8BvC5B,WAAU,YAAY;;AAErB,OAAM,IAAIjtG,IAAI,CAAd,EAAiBA,IAAI,KAAK8uG,MAAL,CAAYnwG,MAAjC,EAAyCqB,GAAzC,EAAgD;;AAE/C,QAAK8uG,MAAL,CAAa9uG,CAAb,EAAiBitG,QAAjB;AAEA;;AAED,SAAO,IAAP;AAEA;;AAxCsC,CAAxC;;AA4CA;;;;AAIA,SAAS8D,cAAT,CAAyBpV,OAAzB,EAAmC;;AAElC,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;AACA,MAAKl3E,QAAL,GAAgB,EAAhB;AAEA;;AAEDtmB,OAAOK,MAAP,CAAe0yG,eAAehzG,SAA9B,EAAyC;;AAExC69F,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAIzxE,QAAQ,IAAZ;;AAEA,MAAI20E,SAAS,IAAIpC,UAAJ,CAAgBvyE,MAAMwyE,OAAtB,CAAb;AACAmC,SAAOlC,IAAP,CAAap2E,GAAb,EAAkB,UAAW6wE,IAAX,EAAkB;;AAEnCqE,UAAQvxE,MAAM8f,KAAN,CAAad,KAAKc,KAAL,CAAYotD,IAAZ,CAAb,CAAR;AAEA,GAJD,EAIGsE,UAJH,EAIeC,OAJf;AAMA,EAbuC;;AAexCoW,cAAa,UAAWvzG,KAAX,EAAmB;;AAE/B,OAAK6mB,QAAL,GAAgB7mB,KAAhB;AAEA,EAnBuC;;AAqBxCwrC,QAAO,UAAW83D,IAAX,EAAkB;;AAExB,MAAIz8E,WAAW,KAAKA,QAApB;;AAEA,WAAS2sF,UAAT,CAAqB7tF,IAArB,EAA4B;;AAE3B,OAAKkB,SAAUlB,IAAV,MAAqB/lB,SAA1B,EAAsC;;AAErCyP,YAAQC,IAAR,CAAc,yCAAd,EAAyDqW,IAAzD;AAEA;;AAED,UAAOkB,SAAUlB,IAAV,CAAP;AAEA;;AAED,MAAIslB,WAAW,IAAI2xD,UAAW0G,KAAK7hG,IAAhB,CAAJ,EAAf;;AAEA,MAAK6hG,KAAKp3F,IAAL,KAActM,SAAnB,EAA+BqrC,SAAS/+B,IAAT,GAAgBo3F,KAAKp3F,IAArB;AAC/B,MAAKo3F,KAAK39E,IAAL,KAAc/lB,SAAnB,EAA+BqrC,SAAStlB,IAAT,GAAgB29E,KAAK39E,IAArB;AAC/B,MAAK29E,KAAK7nE,KAAL,KAAe77B,SAApB,EAAgCqrC,SAASxP,KAAT,CAAeV,MAAf,CAAuBuoE,KAAK7nE,KAA5B;AAChC,MAAK6nE,KAAKzhE,SAAL,KAAmBjiC,SAAxB,EAAoCqrC,SAASpJ,SAAT,GAAqByhE,KAAKzhE,SAA1B;AACpC,MAAKyhE,KAAKxhE,SAAL,KAAmBliC,SAAxB,EAAoCqrC,SAASnJ,SAAT,GAAqBwhE,KAAKxhE,SAA1B;AACpC,MAAKwhE,KAAK9hE,QAAL,KAAkB5hC,SAAvB,EAAmCqrC,SAASzJ,QAAT,CAAkBzG,MAAlB,CAA0BuoE,KAAK9hE,QAA/B;AACnC,MAAK8hE,KAAK5hE,QAAL,KAAkB9hC,SAAvB,EAAmCqrC,SAASvJ,QAAT,CAAkB3G,MAAlB,CAA0BuoE,KAAK5hE,QAA/B;AACnC,MAAK4hE,KAAK3hE,SAAL,KAAmB/hC,SAAxB,EAAoCqrC,SAAStJ,SAAT,GAAqB2hE,KAAK3hE,SAA1B;AACpC,MAAK2hE,KAAKxgE,SAAL,KAAmBljC,SAAxB,EAAoCqrC,SAASnI,SAAT,GAAqBwgE,KAAKxgE,SAA1B;AACpC,MAAKwgE,KAAKvgE,kBAAL,KAA4BnjC,SAAjC,EAA6CqrC,SAASlI,kBAAT,GAA8BugE,KAAKvgE,kBAAnC;AAC7C,MAAKugE,KAAKnpE,QAAL,KAAkBv6B,SAAvB,EAAmCqrC,SAAS9Q,QAAT,GAAoBmpE,KAAKnpE,QAAzB;AACnC,MAAKmpE,KAAKjiE,YAAL,KAAsBzhC,SAA3B,EAAuCqrC,SAAS5J,YAAT,GAAwBiiE,KAAKjiE,YAA7B;AACvC,MAAKiiE,KAAKhiE,cAAL,KAAwB1hC,SAA7B,EAAyCqrC,SAAS3J,cAAT,GAA0BgiE,KAAKhiE,cAA/B;AACzC,MAAKgiE,KAAKx2D,YAAL,KAAsBltC,SAA3B,EAAuCqrC,SAAS6B,YAAT,GAAwBw2D,KAAKx2D,YAA7B;AACvC,MAAKw2D,KAAKjkE,GAAL,KAAaz/B,SAAlB,EAA8BqrC,SAAS5L,GAAT,GAAeikE,KAAKjkE,GAApB;AAC9B,MAAKikE,KAAK/oD,WAAL,KAAqB36C,SAA1B,EAAsCqrC,SAASsP,WAAT,GAAuB+oD,KAAK/oD,WAA5B;AACtC,MAAK+oD,KAAKjpD,QAAL,KAAkBz6C,SAAvB,EAAmCqrC,SAASoP,QAAT,GAAoBipD,KAAKjpD,QAAzB;AACnC,MAAKipD,KAAKhpD,IAAL,KAAc16C,SAAnB,EAA+BqrC,SAASqP,IAAT,GAAgBgpD,KAAKhpD,IAArB;AAC/B,MAAKgpD,KAAKrmE,OAAL,KAAiBr9B,SAAtB,EAAkCqrC,SAAShO,OAAT,GAAmBqmE,KAAKrmE,OAAxB;AAClC,MAAKqmE,KAAK9oD,WAAL,KAAqB56C,SAA1B,EAAsCqrC,SAASuP,WAAT,GAAuB8oD,KAAK9oD,WAA5B;AACtC,MAAK8oD,KAAK3nD,SAAL,KAAmB/7C,SAAxB,EAAoCqrC,SAAS0Q,SAAT,GAAqB2nD,KAAK3nD,SAA1B;AACpC,MAAK2nD,KAAKtoD,SAAL,KAAmBp7C,SAAxB,EAAoCqrC,SAAS+P,SAAT,GAAqBsoD,KAAKtoD,SAA1B;AACpC,MAAKsoD,KAAKroD,UAAL,KAAoBr7C,SAAzB,EAAqCqrC,SAASgQ,UAAT,GAAsBqoD,KAAKroD,UAA3B;AACrC,MAAKqoD,KAAKhoD,UAAL,KAAoB17C,SAAzB,EAAqCqrC,SAASqQ,UAAT,GAAsBgoD,KAAKhoD,UAA3B;AACrC,MAAKgoD,KAAK9mD,SAAL,KAAmB58C,SAAxB,EAAoCqrC,SAASuR,SAAT,GAAqB8mD,KAAK9mD,SAA1B;AACpC,MAAK8mD,KAAK7mD,kBAAL,KAA4B78C,SAAjC,EAA6CqrC,SAASwR,kBAAT,GAA8B6mD,KAAK7mD,kBAAnC;AAC7C,MAAK6mD,KAAK5mD,gBAAL,KAA0B98C,SAA/B,EAA2CqrC,SAASyR,gBAAT,GAA4B4mD,KAAK5mD,gBAAjC;AAC3C,MAAK4mD,KAAK3mD,iBAAL,KAA2B/8C,SAAhC,EAA4CqrC,SAAS0R,iBAAT,GAA6B2mD,KAAK3mD,iBAAlC;;AAE5C,MAAK2mD,KAAK3+E,QAAL,KAAkB/kB,SAAvB,EAAmCqrC,SAAStmB,QAAT,GAAoB2+E,KAAK3+E,QAAzB;;AAEnC,MAAK2+E,KAAKhnD,SAAL,KAAmB,CAAxB,EAA4BrR,SAASqR,SAAT,GAAqBgnD,KAAKhnD,SAA1B;AAC5B,MAAKgnD,KAAKrhE,QAAL,KAAkBriC,SAAvB,EAAmCqrC,SAAShJ,QAAT,GAAoBqhE,KAAKrhE,QAAzB;AACnC,MAAKqhE,KAAK/mD,OAAL,KAAiB38C,SAAtB,EAAkCqrC,SAASsR,OAAT,GAAmB+mD,KAAK/mD,OAAxB;AAClC,MAAK+mD,KAAKvpF,KAAL,KAAena,SAApB,EAAgCqrC,SAASlxB,KAAT,GAAiBupF,KAAKvpF,KAAtB;;AAEhC,MAAKupF,KAAK/nD,aAAL,KAAuB37C,SAA5B,EAAwCqrC,SAASsQ,aAAT,GAAyB+nD,KAAK/nD,aAA9B;AACxC,MAAK+nD,KAAK9nD,mBAAL,KAA6B57C,SAAlC,EAA8CqrC,SAASuQ,mBAAT,GAA+B8nD,KAAK9nD,mBAApC;AAC9C,MAAK8nD,KAAK7nD,kBAAL,KAA4B77C,SAAjC,EAA6CqrC,SAASwQ,kBAAT,GAA8B6nD,KAAK7nD,kBAAnC;;AAE7C,MAAK6nD,KAAK1mD,QAAL,KAAkBh9C,SAAvB,EAAmCqrC,SAAS2R,QAAT,GAAoB0mD,KAAK1mD,QAAzB;AACnC,MAAK0mD,KAAKl2D,YAAL,KAAsBxtC,SAA3B,EAAuCqrC,SAASmC,YAAT,GAAwBk2D,KAAKl2D,YAA7B;AACvC,MAAKk2D,KAAK5nD,SAAL,KAAmB97C,SAAxB,EAAoCqrC,SAASyQ,SAAT,GAAqB4nD,KAAK5nD,SAA1B;;AAEpC,MAAK4nD,KAAKv7D,OAAL,KAAiBnoC,SAAtB,EAAkCqrC,SAASlD,OAAT,GAAmBu7D,KAAKv7D,OAAxB;AAClC,MAAKu7D,KAAKl7D,QAAL,KAAkBxoC,SAAvB,EAAmCqrC,SAAS7C,QAAT,GAAoBk7D,KAAKl7D,QAAzB;;AAEnC;;AAEA,MAAKk7D,KAAKmQ,OAAL,KAAiB7zG,SAAtB,EAAkCqrC,SAASsP,WAAT,GAAuB+oD,KAAKmQ,OAAL,KAAiB,CAAxC,CAnEV,CAmEqD;;AAE7E;;AAEA,MAAKnQ,KAAKx4E,IAAL,KAAclrB,SAAnB,EAA+BqrC,SAASngB,IAAT,GAAgBw4E,KAAKx4E,IAArB;AAC/B,MAAKw4E,KAAKjnD,eAAL,KAAyBz8C,SAA9B,EAA0CqrC,SAASoR,eAAT,GAA2BinD,KAAKjnD,eAAhC;;AAE1C;;AAEA,MAAKinD,KAAKpmE,GAAL,KAAat9B,SAAlB,EAA8BqrC,SAAS/N,GAAT,GAAes2E,WAAYlQ,KAAKpmE,GAAjB,CAAf;;AAE9B,MAAKomE,KAAKlmE,QAAL,KAAkBx9B,SAAvB,EAAmC;;AAElCqrC,YAAS7N,QAAT,GAAoBo2E,WAAYlQ,KAAKlmE,QAAjB,CAApB;AACA6N,YAASuP,WAAT,GAAuB,IAAvB;AAEA;;AAED,MAAK8oD,KAAKhlE,OAAL,KAAiB1+B,SAAtB,EAAkCqrC,SAAS3M,OAAT,GAAmBk1E,WAAYlQ,KAAKhlE,OAAjB,CAAnB;AAClC,MAAKglE,KAAK/kE,SAAL,KAAmB3+B,SAAxB,EAAoCqrC,SAAS1M,SAAT,GAAqB+kE,KAAK/kE,SAA1B;;AAEpC,MAAK+kE,KAAK7kE,SAAL,KAAmB7+B,SAAxB,EAAoCqrC,SAASxM,SAAT,GAAqB+0E,WAAYlQ,KAAK7kE,SAAjB,CAArB;AACpC,MAAK6kE,KAAK5kE,WAAL,KAAqB9+B,SAA1B,EAAsC;;AAErC,OAAI8+B,cAAc4kE,KAAK5kE,WAAvB;;AAEA,OAAKhE,MAAMC,OAAN,CAAe+D,WAAf,MAAiC,KAAtC,EAA8C;;AAE7C;;AAEAA,kBAAc,CAAEA,WAAF,EAAeA,WAAf,CAAd;AAEA;;AAEDuM,YAASvM,WAAT,GAAuB,IAAItwB,OAAJ,GAAc6D,SAAd,CAAyBysB,WAAzB,CAAvB;AAEA;;AAED,MAAK4kE,KAAK1kE,eAAL,KAAyBh/B,SAA9B,EAA0CqrC,SAASrM,eAAT,GAA2B40E,WAAYlQ,KAAK1kE,eAAjB,CAA3B;AAC1C,MAAK0kE,KAAKzkE,iBAAL,KAA2Bj/B,SAAhC,EAA4CqrC,SAASpM,iBAAT,GAA6BykE,KAAKzkE,iBAAlC;AAC5C,MAAKykE,KAAKxkE,gBAAL,KAA0Bl/B,SAA/B,EAA2CqrC,SAASnM,gBAAT,GAA4BwkE,KAAKxkE,gBAAjC;;AAE3C,MAAKwkE,KAAKtkE,YAAL,KAAsBp/B,SAA3B,EAAuCqrC,SAASjM,YAAT,GAAwBw0E,WAAYlQ,KAAKtkE,YAAjB,CAAxB;AACvC,MAAKskE,KAAKpkE,YAAL,KAAsBt/B,SAA3B,EAAuCqrC,SAAS/L,YAAT,GAAwBs0E,WAAYlQ,KAAKpkE,YAAjB,CAAxB;;AAEvC,MAAKokE,KAAKllE,WAAL,KAAqBx+B,SAA1B,EAAsCqrC,SAAS7M,WAAT,GAAuBo1E,WAAYlQ,KAAKllE,WAAjB,CAAvB;AACtC,MAAKklE,KAAKlnD,iBAAL,KAA2Bx8C,SAAhC,EAA4CqrC,SAASmR,iBAAT,GAA6BknD,KAAKlnD,iBAAlC;;AAE5C,MAAKknD,KAAKhmE,WAAL,KAAqB19B,SAA1B,EAAsCqrC,SAAS3N,WAAT,GAAuBk2E,WAAYlQ,KAAKhmE,WAAjB,CAAvB;;AAEtC,MAAKgmE,KAAK9lE,MAAL,KAAgB59B,SAArB,EAAiCqrC,SAASzN,MAAT,GAAkBg2E,WAAYlQ,KAAK9lE,MAAjB,CAAlB;;AAEjC,MAAK8lE,KAAK5lE,YAAL,KAAsB99B,SAA3B,EAAuCqrC,SAASvN,YAAT,GAAwB4lE,KAAK5lE,YAA7B;;AAEvC,MAAK4lE,KAAKrlE,QAAL,KAAkBr+B,SAAvB,EAAmCqrC,SAAShN,QAAT,GAAoBu1E,WAAYlQ,KAAKrlE,QAAjB,CAApB;AACnC,MAAKqlE,KAAKplE,iBAAL,KAA2Bt+B,SAAhC,EAA4CqrC,SAAS/M,iBAAT,GAA6BolE,KAAKplE,iBAAlC;;AAE5C,MAAKolE,KAAKxlE,KAAL,KAAel+B,SAApB,EAAgCqrC,SAASnN,KAAT,GAAiB01E,WAAYlQ,KAAKxlE,KAAjB,CAAjB;AAChC,MAAKwlE,KAAKvlE,cAAL,KAAwBn+B,SAA7B,EAAyCqrC,SAASlN,cAAT,GAA0BulE,KAAKvlE,cAA/B;;AAEzC,MAAKulE,KAAKlkE,WAAL,KAAqBx/B,SAA1B,EAAsCqrC,SAAS7L,WAAT,GAAuBo0E,WAAYlQ,KAAKlkE,WAAjB,CAAvB;;AAEtC,SAAO6L,QAAP;AAEA;;AAxJuC,CAAzC;;AA4JA;;;;AAIA,SAASyoE,oBAAT,CAA+BxV,OAA/B,EAAyC;;AAExC,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;AAEA;;AAEDx9F,OAAOK,MAAP,CAAe8yG,qBAAqBpzG,SAApC,EAA+C;;AAE9C69F,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAIzxE,QAAQ,IAAZ;;AAEA,MAAI20E,SAAS,IAAIpC,UAAJ,CAAgBvyE,MAAMwyE,OAAtB,CAAb;AACAmC,SAAOlC,IAAP,CAAap2E,GAAb,EAAkB,UAAW6wE,IAAX,EAAkB;;AAEnCqE,UAAQvxE,MAAM8f,KAAN,CAAad,KAAKc,KAAL,CAAYotD,IAAZ,CAAb,CAAR;AAEA,GAJD,EAIGsE,UAJH,EAIeC,OAJf;AAMA,EAb6C;;AAe9C3xD,QAAO,UAAW83D,IAAX,EAAkB;;AAExB,MAAIz3E,WAAW,IAAIyqB,cAAJ,EAAf;;AAEA,MAAIt1C,QAAQsiG,KAAK35E,IAAL,CAAU3oB,KAAtB;;AAEA,MAAKA,UAAUpB,SAAf,EAA2B;;AAE1B,OAAI+zG,aAAa,IAAIC,aAAc5yG,MAAMS,IAApB,CAAJ,CAAgCT,MAAMqB,KAAtC,CAAjB;AACAwpB,YAAS6qB,QAAT,CAAmB,IAAI7C,eAAJ,CAAqB8/D,UAArB,EAAiC,CAAjC,CAAnB;AAEA;;AAED,MAAI1nF,aAAaq3E,KAAK35E,IAAL,CAAUsC,UAA3B;;AAEA,OAAM,IAAIqf,GAAV,IAAiBrf,UAAjB,EAA8B;;AAE7B,OAAI5Z,YAAY4Z,WAAYqf,GAAZ,CAAhB;AACA,OAAIqoE,aAAa,IAAIC,aAAcvhG,UAAU5Q,IAAxB,CAAJ,CAAoC4Q,UAAUhQ,KAA9C,CAAjB;;AAEAwpB,YAAS8qB,YAAT,CAAuBrL,GAAvB,EAA4B,IAAIuI,eAAJ,CAAqB8/D,UAArB,EAAiCthG,UAAUyhC,QAA3C,EAAqDzhC,UAAU0hC,UAA/D,CAA5B;AAEA;;AAED,MAAI9E,SAASq0D,KAAK35E,IAAL,CAAUslB,MAAV,IAAoBq0D,KAAK35E,IAAL,CAAUkqF,SAA9B,IAA2CvQ,KAAK35E,IAAL,CAAUmqF,OAAlE;;AAEA,MAAK7kE,WAAWrvC,SAAhB,EAA4B;;AAE3B,QAAM,IAAI2C,IAAI,CAAR,EAAWiK,IAAIyiC,OAAO/tC,MAA5B,EAAoCqB,MAAMiK,CAA1C,EAA6C,EAAGjK,CAAhD,EAAoD;;AAEnD,QAAI2sC,QAAQD,OAAQ1sC,CAAR,CAAZ;;AAEAspB,aAASirB,QAAT,CAAmB5H,MAAM3e,KAAzB,EAAgC2e,MAAMp2B,KAAtC,EAA6Co2B,MAAMtC,aAAnD;AAEA;AAED;;AAED,MAAIna,iBAAiB6wE,KAAK35E,IAAL,CAAU8I,cAA/B;;AAEA,MAAKA,mBAAmB7yB,SAAxB,EAAoC;;AAEnC,OAAI6S,SAAS,IAAImC,OAAJ,EAAb;;AAEA,OAAK6d,eAAehgB,MAAf,KAA0B7S,SAA/B,EAA2C;;AAE1C6S,WAAOR,SAAP,CAAkBwgB,eAAehgB,MAAjC;AAEA;;AAEDoZ,YAAS4G,cAAT,GAA0B,IAAIzE,MAAJ,CAAYvb,MAAZ,EAAoBggB,eAAe1O,MAAnC,CAA1B;AAEA;;AAED,SAAO8H,QAAP;AAEA;;AAvE6C,CAA/C;;AA2EA,IAAI+nF,eAAe;AAClBzuE,YAAWA,SADO;AAElBE,aAAYA,UAFM;AAGlB;AACA6P,oBAAmB,OAAOA,iBAAP,KAA6B,WAA7B,GAA2CA,iBAA3C,GAA+D7P,UAJhE;AAKlBR,aAAYA,UALM;AAMlBF,cAAaA,WANK;AAOlBM,aAAYA,UAPM;AAQlBF,cAAaA,WARK;AASlBN,eAAcA,YATI;AAUlBC,eAAcA;AAVI,CAAnB;;AAaA;;;;AAIA,SAASqvE,MAAT,GAAkB,CAAE;;AAEpBA,OAAOC,QAAP,GAAkB;;AAEjBC,WAAU,EAFO;;AAIjB9kG,MAAK,UAAW+kG,KAAX,EAAkB7T,MAAlB,EAA2B;;AAE/B,OAAK4T,QAAL,CAAcnyG,IAAd,CAAoBoyG,KAApB,EAA2B7T,MAA3B;AAEA,EARgB;;AAUjB5/F,MAAK,UAAWs8F,IAAX,EAAkB;;AAEtB,MAAIkX,WAAW,KAAKA,QAApB;;AAEA,OAAM,IAAI1xG,IAAI,CAAR,EAAWC,IAAIyxG,SAAS/yG,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,KAAK,CAAlD,EAAsD;;AAErD,OAAI2xG,QAAQD,SAAU1xG,CAAV,CAAZ;AACA,OAAI89F,SAAS4T,SAAU1xG,IAAI,CAAd,CAAb;;AAEA,OAAK2xG,MAAMhtE,IAAN,CAAY61D,IAAZ,CAAL,EAA0B;;AAEzB,WAAOsD,MAAP;AAEA;AAED;;AAED,SAAO,IAAP;AAEA;;AA7BgB,CAAlB;;AAiCA9/F,OAAOK,MAAP,CAAemzG,OAAOzzG,SAAtB,EAAiC;;AAEhCwgG,cAAalhG,SAFmB;;AAIhCu0G,cAAa,YAAY,CAAE,CAJK;;AAMhCC,iBAAgB,YAAY,CAAE,CANE;;AAQhCC,iBAAgB,YAAY,CAAE,CARE;;AAUhCC,gBAAe,UAAW9pE,SAAX,EAAsB+pE,WAAtB,EAAmCzT,WAAnC,EAAiD;;AAE/D,MAAIz+F,QAAQ,EAAZ;;AAEA,OAAM,IAAIE,IAAI,CAAd,EAAiBA,IAAIioC,UAAUtpC,MAA/B,EAAuC,EAAGqB,CAA1C,EAA8C;;AAE7CF,SAAOE,CAAP,IAAa,KAAKiyG,cAAL,CAAqBhqE,UAAWjoC,CAAX,CAArB,EAAqCgyG,WAArC,EAAkDzT,WAAlD,CAAb;AAEA;;AAED,SAAOz+F,KAAP;AAEA,EAtB+B;;AAwBhCmyG,iBAAkB,YAAY;;AAE7B,MAAIC,eAAe;AAClB1wG,eAAYA,UADM;AAElBC,mBAAgBA,cAFE;AAGlBC,qBAAkBA,gBAHA;AAIlBC,wBAAqBA,mBAJH;AAKlBC,qBAAkBA,gBALA;AAMlBC,mBAAgBA;AANE,GAAnB;;AASA,MAAIq3B,QAAQ,IAAIZ,KAAJ,EAAZ;AACA,MAAI65E,gBAAgB,IAAIpT,aAAJ,EAApB;AACA,MAAIqT,iBAAiB,IAAIrB,cAAJ,EAArB;;AAEA,SAAO,SAASkB,cAAT,CAAyB/nG,CAAzB,EAA4B8nG,WAA5B,EAAyCzT,WAAzC,EAAuD;;AAE7D;;AAEA,OAAIj6E,WAAW,EAAf;;AAEA,YAASy5E,WAAT,CAAsBzuC,IAAtB,EAA4B9rC,MAA5B,EAAoC7T,MAApC,EAA4C2V,IAA5C,EAAkDpC,UAAlD,EAA+D;;AAE9D,QAAImvF,WAAWL,cAAc1iD,IAA7B;AACA,QAAIwuC,SAAS0T,OAAOC,QAAP,CAAgBvzG,GAAhB,CAAqBm0G,QAArB,CAAb;;AAEA,QAAI5rF,OAAJ;;AAEA,QAAKq3E,WAAW,IAAhB,EAAuB;;AAEtBr3E,eAAUq3E,OAAOlC,IAAP,CAAayW,QAAb,CAAV;AAEA,KAJD,MAIO;;AAENF,mBAAcvT,cAAd,CAA8BL,WAA9B;AACA93E,eAAU0rF,cAAcvW,IAAd,CAAoByW,QAApB,CAAV;AAEA;;AAED,QAAK7uF,WAAWnmB,SAAhB,EAA4B;;AAE3BopB,aAAQjD,MAAR,CAAe9T,SAAf,CAA0B8T,MAA1B;;AAEA,SAAKA,OAAQ,CAAR,MAAgB,CAArB,EAAyBiD,QAAQ5D,KAAR,GAAgBve,cAAhB;AACzB,SAAKkf,OAAQ,CAAR,MAAgB,CAArB,EAAyBiD,QAAQ3D,KAAR,GAAgBxe,cAAhB;AAEzB;;AAED,QAAKqL,WAAWtS,SAAhB,EAA4B;;AAE3BopB,aAAQ9W,MAAR,CAAeD,SAAf,CAA0BC,MAA1B;AAEA;;AAED,QAAK2V,SAASjoB,SAAd,EAA0B;;AAEzB,SAAKioB,KAAM,CAAN,MAAc,QAAnB,EAA8BmB,QAAQ5D,KAAR,GAAgBve,cAAhB;AAC9B,SAAKghB,KAAM,CAAN,MAAc,QAAnB,EAA8BmB,QAAQ5D,KAAR,GAAgBre,sBAAhB;;AAE9B,SAAK8gB,KAAM,CAAN,MAAc,QAAnB,EAA8BmB,QAAQ3D,KAAR,GAAgBxe,cAAhB;AAC9B,SAAKghB,KAAM,CAAN,MAAc,QAAnB,EAA8BmB,QAAQ3D,KAAR,GAAgBte,sBAAhB;AAE9B;;AAED,QAAK0e,eAAe7lB,SAApB,EAAgC;;AAE/BopB,aAAQvD,UAAR,GAAqBA,UAArB;AAEA;;AAED,QAAIvZ,OAAOX,MAAMI,YAAN,EAAX;;AAEAkb,aAAU3a,IAAV,IAAmB8c,OAAnB;;AAEA,WAAO9c,IAAP;AAEA;;AAED;;AAEA,OAAIo3F,OAAO;AACVp3F,UAAMX,MAAMI,YAAN,EADI;AAEVlK,UAAM;AAFI,IAAX;;AAKA,QAAM,IAAIkkB,IAAV,IAAkBlZ,CAAlB,EAAsB;;AAErB,QAAIzM,QAAQyM,EAAGkZ,IAAH,CAAZ;;AAEA,YAASA,IAAT;;AAEC,UAAK,UAAL;AACA,UAAK,UAAL;AACA,UAAK,gBAAL;AACA,UAAK,cAAL;AACC;AACD,UAAK,SAAL;AACC29E,WAAK39E,IAAL,GAAY3lB,KAAZ;AACA;AACD,UAAK,UAAL;AACCsjG,WAAKjpD,QAAL,GAAgBo6D,aAAcz0G,KAAd,CAAhB;AACA;AACD,UAAK,cAAL;AACA,UAAK,YAAL;AACCqP,cAAQC,IAAR,CAAc,8BAAd,EAA8CqW,IAA9C,EAAoD,yBAApD;AACA;AACD,UAAK,cAAL;AACC29E,WAAK7nE,KAAL,GAAaA,MAAMxpB,SAAN,CAAiBjS,KAAjB,EAAyBm8B,MAAzB,EAAb;AACA;AACD,UAAK,eAAL;AACCmnE,WAAK5hE,QAAL,GAAgBjG,MAAMxpB,SAAN,CAAiBjS,KAAjB,EAAyBm8B,MAAzB,EAAhB;AACA;AACD,UAAK,eAAL;AACCmnE,WAAK9hE,QAAL,GAAgB/F,MAAMxpB,SAAN,CAAiBjS,KAAjB,EAAyBm8B,MAAzB,EAAhB;AACA;AACD,UAAK,cAAL;AACCmnE,WAAK3hE,SAAL,GAAiB3hC,KAAjB;AACA;AACD,UAAK,SAAL;AACC,UAAKA,MAAM8+F,WAAN,OAAwB,OAA7B,EAAuCwE,KAAK7hG,IAAL,GAAY,mBAAZ;AACvC,UAAKzB,MAAM8+F,WAAN,OAAwB,OAA7B,EAAuCwE,KAAK7hG,IAAL,GAAY,mBAAZ;AACvC,UAAKzB,MAAM8+F,WAAN,OAAwB,UAA7B,EAA0CwE,KAAK7hG,IAAL,GAAY,sBAAZ;AAC1C;AACD,UAAK,YAAL;AACC6hG,WAAKpmE,GAAL,GAAWojE,YAAatgG,KAAb,EAAoByM,EAAEooG,gBAAtB,EAAwCpoG,EAAEqoG,gBAA1C,EAA4DroG,EAAEsoG,cAA9D,EAA8EtoG,EAAEuoG,oBAAhF,CAAX;AACA;AACD,UAAK,kBAAL;AACA,UAAK,kBAAL;AACA,UAAK,gBAAL;AACA,UAAK,sBAAL;AACC;AACD,UAAK,aAAL;AACC1R,WAAKllE,WAAL,GAAmBkiE,YAAatgG,KAAb,EAAoByM,EAAEwoG,iBAAtB,EAAyCxoG,EAAEyoG,iBAA3C,EAA8DzoG,EAAE0oG,eAAhE,EAAiF1oG,EAAE2oG,qBAAnF,CAAnB;AACA;AACD,UAAK,mBAAL;AACA,UAAK,mBAAL;AACA,UAAK,iBAAL;AACA,UAAK,uBAAL;AACC;AACD,UAAK,UAAL;AACC9R,WAAKrlE,QAAL,GAAgBqiE,YAAatgG,KAAb,EAAoByM,EAAE4oG,cAAtB,EAAsC5oG,EAAE6oG,cAAxC,EAAwD7oG,EAAE8oG,YAA1D,EAAwE9oG,EAAE+oG,kBAA1E,CAAhB;AACA;AACD,UAAK,gBAAL;AACA,UAAK,gBAAL;AACA,UAAK,cAAL;AACA,UAAK,oBAAL;AACC;AACD,UAAK,OAAL;AACClS,WAAKxlE,KAAL,GAAawiE,YAAatgG,KAAb,EAAoByM,EAAEgpG,WAAtB,EAAmChpG,EAAEipG,WAArC,EAAkDjpG,EAAEkpG,SAApD,EAA+DlpG,EAAEmpG,eAAjE,CAAb;AACA;AACD,UAAK,aAAL;AACA,UAAK,aAAL;AACA,UAAK,WAAL;AACA,UAAK,iBAAL;AACC;AACD,UAAK,SAAL;AACCtS,WAAKhlE,OAAL,GAAegiE,YAAatgG,KAAb,EAAoByM,EAAEopG,aAAtB,EAAqCppG,EAAEqpG,aAAvC,EAAsDrpG,EAAEspG,WAAxD,EAAqEtpG,EAAEupG,iBAAvE,CAAf;AACA;AACD,UAAK,cAAL;AACC1S,WAAK/kE,SAAL,GAAiBv+B,KAAjB;AACA;AACD,UAAK,eAAL;AACA,UAAK,eAAL;AACA,UAAK,aAAL;AACA,UAAK,mBAAL;AACC;AACD,UAAK,WAAL;AACCsjG,WAAK7kE,SAAL,GAAiB6hE,YAAatgG,KAAb,EAAoByM,EAAEwpG,eAAtB,EAAuCxpG,EAAEypG,eAAzC,EAA0DzpG,EAAE0pG,aAA5D,EAA2E1pG,EAAE2pG,mBAA7E,CAAjB;AACA;AACD,UAAK,iBAAL;AACC9S,WAAK5kE,WAAL,GAAmB1+B,KAAnB;AACA;AACD,UAAK,iBAAL;AACA,UAAK,iBAAL;AACA,UAAK,eAAL;AACA,UAAK,qBAAL;AACC;AACD,UAAK,aAAL;AACCsjG,WAAKhmE,WAAL,GAAmBgjE,YAAatgG,KAAb,EAAoByM,EAAE4pG,iBAAtB,EAAyC5pG,EAAE6pG,iBAA3C,EAA8D7pG,EAAE8pG,eAAhE,EAAiF9pG,EAAE+pG,qBAAnF,CAAnB;AACA;AACD,UAAK,mBAAL;AACA,UAAK,mBAAL;AACA,UAAK,iBAAL;AACA,UAAK,uBAAL;AACC;AACD,UAAK,cAAL;AACClT,WAAKpkE,YAAL,GAAoBohE,YAAatgG,KAAb,EAAoByM,EAAEgqG,kBAAtB,EAA0ChqG,EAAEiqG,kBAA5C,EAAgEjqG,EAAEkqG,gBAAlE,EAAoFlqG,EAAEmqG,sBAAtF,CAApB;AACA;AACD,UAAK,oBAAL;AACA,UAAK,oBAAL;AACA,UAAK,kBAAL;AACA,UAAK,wBAAL;AACC;AACD,UAAK,cAAL;AACCtT,WAAKtkE,YAAL,GAAoBshE,YAAatgG,KAAb,EAAoByM,EAAEoqG,kBAAtB,EAA0CpqG,EAAEqqG,kBAA5C,EAAgErqG,EAAEsqG,gBAAlE,EAAoFtqG,EAAEuqG,sBAAtF,CAApB;AACA;AACD,UAAK,oBAAL;AACA,UAAK,oBAAL;AACA,UAAK,kBAAL;AACA,UAAK,wBAAL;AACC;AACD,UAAK,UAAL;AACC1T,WAAKlmE,QAAL,GAAgBkjE,YAAatgG,KAAb,EAAoByM,EAAEwqG,cAAtB,EAAsCxqG,EAAEyqG,cAAxC,EAAwDzqG,EAAE0qG,YAA1D,EAAwE1qG,EAAE2qG,kBAA1E,CAAhB;AACA;AACD,UAAK,gBAAL;AACA,UAAK,gBAAL;AACA,UAAK,cAAL;AACA,UAAK,oBAAL;AACC;AACD,UAAK,WAAL;AACC9T,WAAKhpD,IAAL,GAAY92C,QAAZ;AACA;AACD,UAAK,aAAL;AACC8/F,WAAKhpD,IAAL,GAAY72C,UAAZ;AACA;AACD,UAAK,cAAL;AACC4L,cAAQC,IAAR,CAAc,uEAAd;AACAg0F,WAAKrmE,OAAL,GAAej9B,KAAf;AACA;AACD,UAAK,WAAL;AACA,UAAK,YAAL;AACA,UAAK,YAAL;AACA,UAAK,SAAL;AACA,UAAK,cAAL;AACA,UAAK,aAAL;AACA,UAAK,SAAL;AACA,UAAK,WAAL;AACCsjG,WAAM39E,IAAN,IAAe3lB,KAAf;AACA;AACD,UAAK,cAAL;AACC,UAAKA,UAAU,IAAf,EAAsBsjG,KAAKx2D,YAAL,GAAoBhpC,YAApB;AACtB,UAAK9D,UAAU,MAAf,EAAwBsjG,KAAKx2D,YAAL,GAAoBjpC,UAApB;AACxB;AACD;AACCwL,cAAQyD,KAAR,CAAe,0CAAf,EAA2D6S,IAA3D,EAAiE3lB,KAAjE;AACA;;AAlJF;AAsJA;;AAED,OAAKsjG,KAAK7hG,IAAL,KAAc,mBAAnB,EAAyC,OAAO6hG,KAAK9hE,QAAZ;AACzC,OAAK8hE,KAAK7hG,IAAL,KAAc,mBAAnB,EAAyC,OAAO6hG,KAAK5hE,QAAZ;;AAEzC,OAAK4hE,KAAKrmE,OAAL,GAAe,CAApB,EAAwBqmE,KAAK9oD,WAAL,GAAmB,IAAnB;;AAExBm6D,kBAAepB,WAAf,CAA4B1sF,QAA5B;;AAEA,UAAO8tF,eAAenpE,KAAf,CAAsB83D,IAAtB,CAAP;AAEA,GA3OD;AA6OA,EA5Pe;;AAxBgB,CAAjC;;AAwRA;;;;AAIA,IAAI+T,cAAc;;AAEjBC,aAAY,UAAWj1G,KAAX,EAAmB;;AAE9B,MAAK,OAAOk1G,WAAP,KAAuB,WAA5B,EAA0C;;AAEzC,UAAO,IAAIA,WAAJ,GAAkBC,MAAlB,CAA0Bn1G,KAA1B,CAAP;AAEA;;AAED;AACA;;AAEA,MAAIoN,IAAI,EAAR;;AAEA,OAAM,IAAIlN,IAAI,CAAR,EAAWooB,KAAKtoB,MAAMnB,MAA5B,EAAoCqB,IAAIooB,EAAxC,EAA4CpoB,GAA5C,EAAmD;;AAElD;AACAkN,QAAKwzC,OAAOw0D,YAAP,CAAqBp1G,MAAOE,CAAP,CAArB,CAAL;AAEA;;AAED;AACA,SAAOm8F,mBAAoBgZ,OAAQjoG,CAAR,CAApB,CAAP;AAEA,EAzBgB;;AA2BjBkoG,iBAAgB,UAAW5vF,GAAX,EAAiB;;AAEhC,MAAI/mB,QAAQ+mB,IAAI6vF,WAAJ,CAAiB,GAAjB,CAAZ;;AAEA,MAAK52G,UAAU,CAAE,CAAjB,EAAqB,OAAO,IAAP;;AAErB,SAAO+mB,IAAIk5E,MAAJ,CAAY,CAAZ,EAAejgG,QAAQ,CAAvB,CAAP;AAEA;;AAnCgB,CAAlB;;AAuCA;;;;;AAKA,SAAS62G,UAAT,CAAqB3Z,OAArB,EAA+B;;AAE9B,KAAK,OAAOA,OAAP,KAAmB,SAAxB,EAAoC;;AAEnC7uF,UAAQC,IAAR,CAAc,2EAAd;AACA4uF,YAAUt+F,SAAV;AAEA;;AAED,MAAKs+F,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;;AAEA,MAAK0B,eAAL,GAAuB,KAAvB;AAEA;;AAEDl/F,OAAOK,MAAP,CAAei3G,WAAWv3G,SAA1B,EAAqC;;AAEpC69F,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAIzxE,QAAQ,IAAZ;;AAEA,MAAI6oF,cAAc,KAAKA,WAAL,IAAsB,OAAO,KAAKA,WAAZ,KAA4B,QAAlD,GAA+D,KAAKA,WAApE,GAAkF8C,YAAYM,cAAZ,CAA4B5vF,GAA5B,CAApG;;AAEA,MAAIs4E,SAAS,IAAIpC,UAAJ,CAAgB,KAAKC,OAArB,CAAb;AACAmC,SAAOJ,kBAAP,CAA2B,KAAKR,eAAhC;AACAY,SAAOlC,IAAP,CAAap2E,GAAb,EAAkB,UAAW6wE,IAAX,EAAkB;;AAEnC,OAAI0K,OAAO54D,KAAKc,KAAL,CAAYotD,IAAZ,CAAX;AACA,OAAIjxE,WAAW27E,KAAK37E,QAApB;;AAEA,OAAKA,aAAa/nB,SAAlB,EAA8B;;AAE7B,QAAI6B,OAAOkmB,SAASlmB,IAApB;;AAEA,QAAKA,SAAS7B,SAAd,EAA0B;;AAEzB,SAAK6B,KAAKq9F,WAAL,OAAuB,QAA5B,EAAuC;;AAEtCzvF,cAAQyD,KAAR,CAAe,uBAAuBiV,GAAvB,GAA6B,oDAA5C;AACA;AAEA;AAED;AAED;;AAED,OAAIkD,SAASS,MAAM8f,KAAN,CAAa83D,IAAb,EAAmBiR,WAAnB,CAAb;AACAtX,UAAQhyE,OAAOY,QAAf,EAAyBZ,OAAOuf,SAAhC;AAEA,GAzBD,EAyBG0yD,UAzBH,EAyBeC,OAzBf;AA2BA,EArCmC;;AAuCpC2a,iBAAgB,UAAW93G,KAAX,EAAmB;;AAElC,OAAKu0G,WAAL,GAAmBv0G,KAAnB;AAEA,EA3CmC;;AA6CpCwrC,QAAS,YAAY;;AAEpB,WAASusE,UAAT,CAAqBzU,IAArB,EAA2Bz3E,QAA3B,EAAsC;;AAErC,YAASmsF,QAAT,CAAmBh4G,KAAnB,EAA0B+a,QAA1B,EAAqC;;AAEpC,WAAO/a,QAAU,KAAK+a,QAAtB;AAEA;;AAED,OAAIxY,CAAJ;AAAA,OAAOirB,CAAP;AAAA,OAAUyqF,EAAV;AAAA,OAEC/lG,MAFD;AAAA,OAESgmG,OAFT;AAAA,OAICC,UAJD;AAAA,OAIaC,WAJb;AAAA,OAI0BC,OAJ1B;AAAA,OAImCzrE,aAJnC;AAAA,OAMCnrC,IAND;AAAA,OAOC62G,MAPD;AAAA,OAQC7lE,WARD;AAAA,OASCE,eATD;AAAA,OAUCC,aAVD;AAAA,OAUgBC,mBAVhB;AAAA,OAWCC,YAXD;AAAA,OAWeC,kBAXf;AAAA,OAaC9E,MAbD;AAAA,OAaSC,IAbT;AAAA,OAaeqqE,KAbf;AAAA,OAasBC,KAbtB;AAAA,OAa6Bv9E,GAb7B;AAAA,OAakCzX,MAblC;AAAA,OAeCi1F,OAfD;AAAA,OAeUvwF,EAfV;AAAA,OAecmS,CAfd;AAAA,OAeiBnrB,CAfjB;AAAA,OAiBCg+B,QAAQo2D,KAAKp2D,KAjBd;AAAA,OAkBCnhB,WAAWu3E,KAAKv3E,QAlBjB;AAAA,OAmBC0iB,UAAU60D,KAAK70D,OAnBhB;AAAA,OAoBCxB,SAASq2D,KAAKr2D,MApBf;AAAA,OAsBClzB,QAAQupF,KAAKvpF,KAtBd;AAAA,OAwBC2+F,YAAY,CAxBb;;AA2BA,OAAKpV,KAAK50D,GAAL,KAAa9uC,SAAlB,EAA8B;;AAE7B;;AAEA,SAAM2C,IAAI,CAAV,EAAaA,IAAI+gG,KAAK50D,GAAL,CAASxtC,MAA1B,EAAkCqB,GAAlC,EAAyC;;AAExC,SAAK+gG,KAAK50D,GAAL,CAAUnsC,CAAV,EAAcrB,MAAnB,EAA4Bw3G;AAE5B;;AAED,SAAMn2G,IAAI,CAAV,EAAaA,IAAIm2G,SAAjB,EAA4Bn2G,GAA5B,EAAmC;;AAElCspB,cAASshB,aAAT,CAAwB5qC,CAAxB,IAA8B,EAA9B;AAEA;AAED;;AAED2P,YAAS,CAAT;AACAgmG,aAAUnsF,SAAS7qB,MAAnB;;AAEA,UAAQgR,SAASgmG,OAAjB,EAA2B;;AAE1BjqE,aAAS,IAAIr5B,OAAJ,EAAT;;AAEAq5B,WAAO7tC,CAAP,GAAW2rB,SAAU7Z,QAAV,IAAwB6H,KAAnC;AACAk0B,WAAOjhC,CAAP,GAAW+e,SAAU7Z,QAAV,IAAwB6H,KAAnC;AACAk0B,WAAOv5B,CAAP,GAAWqX,SAAU7Z,QAAV,IAAwB6H,KAAnC;;AAEA8R,aAASE,QAAT,CAAkBjqB,IAAlB,CAAwBmsC,MAAxB;AAEA;;AAED/7B,YAAS,CAAT;AACAgmG,aAAUhrE,MAAMhsC,MAAhB;;AAEA,UAAQgR,SAASgmG,OAAjB,EAA2B;;AAE1Bz2G,WAAOyrC,MAAOh7B,QAAP,CAAP;;AAEAomG,aAASN,SAAUv2G,IAAV,EAAgB,CAAhB,CAAT;AACAgxC,kBAAculE,SAAUv2G,IAAV,EAAgB,CAAhB,CAAd;AACAkxC,sBAAkBqlE,SAAUv2G,IAAV,EAAgB,CAAhB,CAAlB;AACAmxC,oBAAgBolE,SAAUv2G,IAAV,EAAgB,CAAhB,CAAhB;AACAoxC,0BAAsBmlE,SAAUv2G,IAAV,EAAgB,CAAhB,CAAtB;AACAqxC,mBAAeklE,SAAUv2G,IAAV,EAAgB,CAAhB,CAAf;AACAsxC,yBAAqBilE,SAAUv2G,IAAV,EAAgB,CAAhB,CAArB;;AAEA;;AAEA,QAAK62G,MAAL,EAAc;;AAEbC,aAAQ,IAAI5rE,KAAJ,EAAR;AACA4rE,WAAM7oG,CAAN,GAAUw9B,MAAOh7B,MAAP,CAAV;AACAqmG,WAAM5oG,CAAN,GAAUu9B,MAAOh7B,SAAS,CAAhB,CAAV;AACAqmG,WAAM7lG,CAAN,GAAUw6B,MAAOh7B,SAAS,CAAhB,CAAV;;AAEAsmG,aAAQ,IAAI7rE,KAAJ,EAAR;AACA6rE,WAAM9oG,CAAN,GAAUw9B,MAAOh7B,SAAS,CAAhB,CAAV;AACAsmG,WAAM7oG,CAAN,GAAUu9B,MAAOh7B,SAAS,CAAhB,CAAV;AACAsmG,WAAM9lG,CAAN,GAAUw6B,MAAOh7B,SAAS,CAAhB,CAAV;;AAEAA,eAAU,CAAV;;AAEA,SAAKugC,WAAL,EAAmB;;AAElB7F,sBAAgBM,MAAOh7B,QAAP,CAAhB;AACAqmG,YAAM3rE,aAAN,GAAsBA,aAAtB;AACA4rE,YAAM5rE,aAAN,GAAsBA,aAAtB;AAEA;;AAED;;AAEAqrE,UAAKpsF,SAASqhB,KAAT,CAAehsC,MAApB;;AAEA,SAAKyxC,eAAL,EAAuB;;AAEtB,WAAMpwC,IAAI,CAAV,EAAaA,IAAIm2G,SAAjB,EAA4Bn2G,GAA5B,EAAmC;;AAElCk2G,iBAAUnV,KAAK50D,GAAL,CAAUnsC,CAAV,CAAV;;AAEAspB,gBAASshB,aAAT,CAAwB5qC,CAAxB,EAA6B01G,EAA7B,IAAoC,EAApC;AACApsF,gBAASshB,aAAT,CAAwB5qC,CAAxB,EAA6B01G,KAAK,CAAlC,IAAwC,EAAxC;;AAEA,YAAMzqF,IAAI,CAAV,EAAaA,IAAI,CAAjB,EAAoBA,GAApB,EAA2B;;AAE1B6qF,kBAAUnrE,MAAOh7B,QAAP,CAAV;;AAEAmoB,YAAIo+E,QAASJ,UAAU,CAAnB,CAAJ;AACAnpG,YAAIupG,QAASJ,UAAU,CAAV,GAAc,CAAvB,CAAJ;;AAEAnwF,aAAK,IAAI9Z,OAAJ,CAAaisB,CAAb,EAAgBnrB,CAAhB,CAAL;;AAEA,YAAKse,MAAM,CAAX,EAAe3B,SAASshB,aAAT,CAAwB5qC,CAAxB,EAA6B01G,EAA7B,EAAkCn2G,IAAlC,CAAwComB,EAAxC;AACf,YAAKsF,MAAM,CAAX,EAAe3B,SAASshB,aAAT,CAAwB5qC,CAAxB,EAA6B01G,KAAK,CAAlC,EAAsCn2G,IAAtC,CAA4ComB,EAA5C;AAEf;AAED;AAED;;AAED,SAAK0qB,aAAL,EAAqB;;AAEpBwlE,oBAAclrE,MAAOh7B,QAAP,IAAqB,CAAnC;;AAEAqmG,YAAM/0F,MAAN,CAAalV,GAAb,CACCmgC,QAAS2pE,aAAT,CADD,EAEC3pE,QAAS2pE,aAAT,CAFD,EAGC3pE,QAAS2pE,WAAT,CAHD;;AAMAI,YAAMh1F,MAAN,CAAavU,IAAb,CAAmBspG,MAAM/0F,MAAzB;AAEA;;AAED,SAAKqvB,mBAAL,EAA2B;;AAE1B,WAAMtwC,IAAI,CAAV,EAAaA,IAAI,CAAjB,EAAoBA,GAApB,EAA2B;;AAE1B61G,qBAAclrE,MAAOh7B,QAAP,IAAqB,CAAnC;;AAEAsR,gBAAS,IAAI5O,OAAJ,CACR65B,QAAS2pE,aAAT,CADQ,EAER3pE,QAAS2pE,aAAT,CAFQ,EAGR3pE,QAAS2pE,WAAT,CAHQ,CAAT;;AAOA,WAAK71G,MAAM,CAAX,EAAeg2G,MAAM1rE,aAAN,CAAoB/qC,IAApB,CAA0B0hB,MAA1B;AACf,WAAKjhB,MAAM,CAAX,EAAei2G,MAAM3rE,aAAN,CAAoB/qC,IAApB,CAA0B0hB,MAA1B;AAEf;AAED;;AAGD,SAAKsvB,YAAL,EAAoB;;AAEnBqlE,mBAAajrE,MAAOh7B,QAAP,CAAb;AACA+oB,YAAMgS,OAAQkrE,UAAR,CAAN;;AAEAI,YAAM98E,KAAN,CAAYV,MAAZ,CAAoBE,GAApB;AACAu9E,YAAM/8E,KAAN,CAAYV,MAAZ,CAAoBE,GAApB;AAEA;;AAGD,SAAK8X,kBAAL,EAA0B;;AAEzB,WAAMxwC,IAAI,CAAV,EAAaA,IAAI,CAAjB,EAAoBA,GAApB,EAA2B;;AAE1B41G,oBAAajrE,MAAOh7B,QAAP,CAAb;AACA+oB,aAAMgS,OAAQkrE,UAAR,CAAN;;AAEA,WAAK51G,MAAM,CAAX,EAAeg2G,MAAMzrE,YAAN,CAAmBhrC,IAAnB,CAAyB,IAAI+4B,KAAJ,CAAWI,GAAX,CAAzB;AACf,WAAK14B,MAAM,CAAX,EAAei2G,MAAM1rE,YAAN,CAAmBhrC,IAAnB,CAAyB,IAAI+4B,KAAJ,CAAWI,GAAX,CAAzB;AAEf;AAED;;AAEDpP,cAASqhB,KAAT,CAAeprC,IAAf,CAAqBy2G,KAArB;AACA1sF,cAASqhB,KAAT,CAAeprC,IAAf,CAAqB02G,KAArB;AAEA,KApHD,MAoHO;;AAENtqE,YAAO,IAAIvB,KAAJ,EAAP;AACAuB,UAAKx+B,CAAL,GAASw9B,MAAOh7B,QAAP,CAAT;AACAg8B,UAAKv+B,CAAL,GAASu9B,MAAOh7B,QAAP,CAAT;AACAg8B,UAAKx7B,CAAL,GAASw6B,MAAOh7B,QAAP,CAAT;;AAEA,SAAKugC,WAAL,EAAmB;;AAElB7F,sBAAgBM,MAAOh7B,QAAP,CAAhB;AACAg8B,WAAKtB,aAAL,GAAqBA,aAArB;AAEA;;AAED;;AAEAqrE,UAAKpsF,SAASqhB,KAAT,CAAehsC,MAApB;;AAEA,SAAKyxC,eAAL,EAAuB;;AAEtB,WAAMpwC,IAAI,CAAV,EAAaA,IAAIm2G,SAAjB,EAA4Bn2G,GAA5B,EAAmC;;AAElCk2G,iBAAUnV,KAAK50D,GAAL,CAAUnsC,CAAV,CAAV;;AAEAspB,gBAASshB,aAAT,CAAwB5qC,CAAxB,EAA6B01G,EAA7B,IAAoC,EAApC;;AAEA,YAAMzqF,IAAI,CAAV,EAAaA,IAAI,CAAjB,EAAoBA,GAApB,EAA2B;;AAE1B6qF,kBAAUnrE,MAAOh7B,QAAP,CAAV;;AAEAmoB,YAAIo+E,QAASJ,UAAU,CAAnB,CAAJ;AACAnpG,YAAIupG,QAASJ,UAAU,CAAV,GAAc,CAAvB,CAAJ;;AAEAnwF,aAAK,IAAI9Z,OAAJ,CAAaisB,CAAb,EAAgBnrB,CAAhB,CAAL;;AAEA2c,iBAASshB,aAAT,CAAwB5qC,CAAxB,EAA6B01G,EAA7B,EAAkCn2G,IAAlC,CAAwComB,EAAxC;AAEA;AAED;AAED;;AAED,SAAK0qB,aAAL,EAAqB;;AAEpBwlE,oBAAclrE,MAAOh7B,QAAP,IAAqB,CAAnC;;AAEAg8B,WAAK1qB,MAAL,CAAYlV,GAAZ,CACCmgC,QAAS2pE,aAAT,CADD,EAEC3pE,QAAS2pE,aAAT,CAFD,EAGC3pE,QAAS2pE,WAAT,CAHD;AAMA;;AAED,SAAKvlE,mBAAL,EAA2B;;AAE1B,WAAMtwC,IAAI,CAAV,EAAaA,IAAI,CAAjB,EAAoBA,GAApB,EAA2B;;AAE1B61G,qBAAclrE,MAAOh7B,QAAP,IAAqB,CAAnC;;AAEAsR,gBAAS,IAAI5O,OAAJ,CACR65B,QAAS2pE,aAAT,CADQ,EAER3pE,QAAS2pE,aAAT,CAFQ,EAGR3pE,QAAS2pE,WAAT,CAHQ,CAAT;;AAMAlqE,YAAKrB,aAAL,CAAmB/qC,IAAnB,CAAyB0hB,MAAzB;AAEA;AAED;;AAGD,SAAKsvB,YAAL,EAAoB;;AAEnBqlE,mBAAajrE,MAAOh7B,QAAP,CAAb;AACAg8B,WAAKzS,KAAL,CAAWV,MAAX,CAAmBkS,OAAQkrE,UAAR,CAAnB;AAEA;;AAGD,SAAKplE,kBAAL,EAA0B;;AAEzB,WAAMxwC,IAAI,CAAV,EAAaA,IAAI,CAAjB,EAAoBA,GAApB,EAA2B;;AAE1B41G,oBAAajrE,MAAOh7B,QAAP,CAAb;AACAg8B,YAAKpB,YAAL,CAAkBhrC,IAAlB,CAAwB,IAAI+4B,KAAJ,CAAWoS,OAAQkrE,UAAR,CAAX,CAAxB;AAEA;AAED;;AAEDtsF,cAASqhB,KAAT,CAAeprC,IAAf,CAAqBosC,IAArB;AAEA;AAED;AAED;;AAED,WAASyqE,SAAT,CAAoBrV,IAApB,EAA0Bz3E,QAA1B,EAAqC;;AAEpC,OAAI+sF,sBAAwBtV,KAAKsV,mBAAL,KAA6Bh5G,SAA/B,GAA6C0jG,KAAKsV,mBAAlD,GAAwE,CAAlG;;AAEA,OAAKtV,KAAKh2D,WAAV,EAAwB;;AAEvB,SAAM,IAAI/qC,IAAI,CAAR,EAAWC,IAAI8gG,KAAKh2D,WAAL,CAAiBpsC,MAAtC,EAA8CqB,IAAIC,CAAlD,EAAqDD,KAAKq2G,mBAA1D,EAAgF;;AAE/E,SAAIx4G,IAAIkjG,KAAKh2D,WAAL,CAAkB/qC,CAAlB,CAAR;AACA,SAAIyK,IAAM4rG,sBAAsB,CAAxB,GAA8BtV,KAAKh2D,WAAL,CAAkB/qC,IAAI,CAAtB,CAA9B,GAA0D,CAAlE;AACA,SAAImS,IAAMkkG,sBAAsB,CAAxB,GAA8BtV,KAAKh2D,WAAL,CAAkB/qC,IAAI,CAAtB,CAA9B,GAA0D,CAAlE;AACA,SAAI6M,IAAMwpG,sBAAsB,CAAxB,GAA8BtV,KAAKh2D,WAAL,CAAkB/qC,IAAI,CAAtB,CAA9B,GAA0D,CAAlE;;AAEAspB,cAASyhB,WAAT,CAAqBxrC,IAArB,CAA2B,IAAIqmB,OAAJ,CAAa/nB,CAAb,EAAgB4M,CAAhB,EAAmB0H,CAAnB,EAAsBtF,CAAtB,CAA3B;AAEA;AAED;;AAED,OAAKk0F,KAAK/1D,WAAV,EAAwB;;AAEvB,SAAM,IAAIhrC,IAAI,CAAR,EAAWC,IAAI8gG,KAAK/1D,WAAL,CAAiBrsC,MAAtC,EAA8CqB,IAAIC,CAAlD,EAAqDD,KAAKq2G,mBAA1D,EAAgF;;AAE/E,SAAIlpG,IAAI4zF,KAAK/1D,WAAL,CAAkBhrC,CAAlB,CAAR;AACA,SAAIoN,IAAMipG,sBAAsB,CAAxB,GAA8BtV,KAAK/1D,WAAL,CAAkBhrC,IAAI,CAAtB,CAA9B,GAA0D,CAAlE;AACA,SAAImQ,IAAMkmG,sBAAsB,CAAxB,GAA8BtV,KAAK/1D,WAAL,CAAkBhrC,IAAI,CAAtB,CAA9B,GAA0D,CAAlE;AACA,SAAI4S,IAAMyjG,sBAAsB,CAAxB,GAA8BtV,KAAK/1D,WAAL,CAAkBhrC,IAAI,CAAtB,CAA9B,GAA0D,CAAlE;;AAEAspB,cAAS0hB,WAAT,CAAqBzrC,IAArB,CAA2B,IAAIqmB,OAAJ,CAAazY,CAAb,EAAgBC,CAAhB,EAAmB+C,CAAnB,EAAsByC,CAAtB,CAA3B;AAEA;AAED;;AAED0W,YAASquC,KAAT,GAAiBopC,KAAKppC,KAAtB;;AAEA,OAAKruC,SAASquC,KAAT,IAAkBruC,SAASquC,KAAT,CAAeh5D,MAAf,GAAwB,CAA1C,KAAiD2qB,SAASyhB,WAAT,CAAqBpsC,MAArB,KAAgC2qB,SAAS0hB,WAAT,CAAqBrsC,MAArD,IAA+D2qB,SAAS0hB,WAAT,CAAqBrsC,MAArB,KAAgC2qB,SAASE,QAAT,CAAkB7qB,MAAlK,CAAL,EAAkL;;AAEjLmO,YAAQC,IAAR,CAAc,wCAAwCuc,SAASE,QAAT,CAAkB7qB,MAA1D,GAAmE,kBAAnE,GACb2qB,SAAS0hB,WAAT,CAAqBrsC,MADR,GACiB,sBADjB,GAC0C2qB,SAASyhB,WAAT,CAAqBpsC,MAD/D,GACwE,iBADtF;AAGA;AAED;;AAED,WAAS23G,aAAT,CAAwBvV,IAAxB,EAA8Bz3E,QAA9B,EAAyC;;AAExC,OAAI9R,QAAQupF,KAAKvpF,KAAjB;;AAEA,OAAKupF,KAAKl2D,YAAL,KAAsBxtC,SAA3B,EAAuC;;AAEtC,SAAM,IAAI2C,IAAI,CAAR,EAAWC,IAAI8gG,KAAKl2D,YAAL,CAAkBlsC,MAAvC,EAA+CqB,IAAIC,CAAnD,EAAsDD,GAAtD,EAA6D;;AAE5DspB,cAASuhB,YAAT,CAAuB7qC,CAAvB,IAA6B,EAA7B;AACAspB,cAASuhB,YAAT,CAAuB7qC,CAAvB,EAA2BojB,IAA3B,GAAkC29E,KAAKl2D,YAAL,CAAmB7qC,CAAnB,EAAuBojB,IAAzD;AACAkG,cAASuhB,YAAT,CAAuB7qC,CAAvB,EAA2BwpB,QAA3B,GAAsC,EAAtC;;AAEA,SAAI+sF,cAAcjtF,SAASuhB,YAAT,CAAuB7qC,CAAvB,EAA2BwpB,QAA7C;AACA,SAAIgtF,cAAczV,KAAKl2D,YAAL,CAAmB7qC,CAAnB,EAAuBwpB,QAAzC;;AAEA,UAAM,IAAI7c,IAAI,CAAR,EAAW0gC,KAAKmpE,YAAY73G,MAAlC,EAA0CgO,IAAI0gC,EAA9C,EAAkD1gC,KAAK,CAAvD,EAA2D;;AAE1D,UAAI++B,SAAS,IAAIr5B,OAAJ,EAAb;AACAq5B,aAAO7tC,CAAP,GAAW24G,YAAa7pG,CAAb,IAAmB6K,KAA9B;AACAk0B,aAAOjhC,CAAP,GAAW+rG,YAAa7pG,IAAI,CAAjB,IAAuB6K,KAAlC;AACAk0B,aAAOv5B,CAAP,GAAWqkG,YAAa7pG,IAAI,CAAjB,IAAuB6K,KAAlC;;AAEA++F,kBAAYh3G,IAAZ,CAAkBmsC,MAAlB;AAEA;AAED;AAED;;AAED,OAAKq1D,KAAK0V,WAAL,KAAqBp5G,SAArB,IAAkC0jG,KAAK0V,WAAL,CAAiB93G,MAAjB,GAA0B,CAAjE,EAAqE;;AAEpEmO,YAAQC,IAAR,CAAc,iFAAd;;AAEA,QAAI49B,QAAQrhB,SAASqhB,KAArB;AACA,QAAI8rE,cAAc1V,KAAK0V,WAAL,CAAkB,CAAlB,EAAsB/rE,MAAxC;;AAEA,SAAM,IAAI1qC,IAAI,CAAR,EAAWC,IAAI0qC,MAAMhsC,MAA3B,EAAmCqB,IAAIC,CAAvC,EAA0CD,GAA1C,EAAiD;;AAEhD2qC,WAAO3qC,CAAP,EAAWk5B,KAAX,CAAiBxpB,SAAjB,CAA4B+mG,WAA5B,EAAyCz2G,IAAI,CAA7C;AAEA;AAED;AAED;;AAED,WAAS02G,eAAT,CAA0B3V,IAA1B,EAAgCz3E,QAAhC,EAA2C;;AAE1C,OAAIqtF,mBAAmB,EAAvB;;AAEA;AACA,OAAI/G,aAAa,EAAjB;;AAEA,OAAK7O,KAAK7sB,SAAL,KAAmB72E,SAAxB,EAAoC;;AAEnCuyG,eAAWrwG,IAAX,CAAiBwhG,KAAK7sB,SAAtB;AAEA;;AAED,OAAK6sB,KAAK6O,UAAL,KAAoBvyG,SAAzB,EAAqC;;AAEpC,QAAK0jG,KAAK6O,UAAL,CAAgBjxG,MAArB,EAA8B;;AAE7BixG,kBAAaA,WAAWxd,MAAX,CAAmB2O,KAAK6O,UAAxB,CAAb;AAEA,KAJD,MAIO;;AAENA,gBAAWrwG,IAAX,CAAiBwhG,KAAK6O,UAAtB;AAEA;AAED;;AAED,QAAM,IAAI5vG,IAAI,CAAd,EAAiBA,IAAI4vG,WAAWjxG,MAAhC,EAAwCqB,GAAxC,EAA+C;;AAE9C,QAAImvG,OAAOP,cAAcsB,cAAd,CAA8BN,WAAY5vG,CAAZ,CAA9B,EAA+CspB,SAASquC,KAAxD,CAAX;AACA,QAAKw3C,IAAL,EAAYwH,iBAAiBp3G,IAAjB,CAAuB4vG,IAAvB;AAEZ;;AAED;AACA,OAAK7lF,SAASuhB,YAAd,EAA6B;;AAE5B;AACA,QAAI+rE,sBAAsBhI,cAAciB,mCAAd,CAAmDvmF,SAASuhB,YAA5D,EAA0E,EAA1E,CAA1B;AACA8rE,uBAAmBA,iBAAiBvkB,MAAjB,CAAyBwkB,mBAAzB,CAAnB;AAEA;;AAED,OAAKD,iBAAiBh4G,MAAjB,GAA0B,CAA/B,EAAmC2qB,SAASsmF,UAAT,GAAsB+G,gBAAtB;AAEnC;;AAED,SAAO,SAAS1tE,KAAT,CAAgB83D,IAAhB,EAAsBiR,WAAtB,EAAoC;;AAE1C,OAAKjR,KAAK35E,IAAL,KAAc/pB,SAAnB,EAA+B;;AAE9B;AACA0jG,WAAOA,KAAK35E,IAAZ;AAEA;;AAED,OAAK25E,KAAKvpF,KAAL,KAAena,SAApB,EAAgC;;AAE/B0jG,SAAKvpF,KAAL,GAAa,MAAMupF,KAAKvpF,KAAxB;AAEA,IAJD,MAIO;;AAENupF,SAAKvpF,KAAL,GAAa,GAAb;AAEA;;AAED,OAAI8R,WAAW,IAAImhB,QAAJ,EAAf;;AAEA+qE,cAAYzU,IAAZ,EAAkBz3E,QAAlB;AACA8sF,aAAWrV,IAAX,EAAiBz3E,QAAjB;AACAgtF,iBAAevV,IAAf,EAAqBz3E,QAArB;AACAotF,mBAAiB3V,IAAjB,EAAuBz3E,QAAvB;;AAEAA,YAASsjB,kBAAT;AACAtjB,YAAS6G,qBAAT;;AAEA,OAAK4wE,KAAK94D,SAAL,KAAmB5qC,SAAnB,IAAgC0jG,KAAK94D,SAAL,CAAetpC,MAAf,KAA0B,CAA/D,EAAmE;;AAElE,WAAO,EAAE2qB,UAAUA,QAAZ,EAAP;AAEA,IAJD,MAIO;;AAEN,QAAI2e,YAAYupE,OAAOzzG,SAAP,CAAiBg0G,aAAjB,CAAgChR,KAAK94D,SAArC,EAAgD+pE,WAAhD,EAA6D,KAAKzT,WAAlE,CAAhB;;AAEA,WAAO,EAAEj1E,UAAUA,QAAZ,EAAsB2e,WAAWA,SAAjC,EAAP;AAEA;AAED,GAzCD;AA2CA,EAteM;;AA7C6B,CAArC;;AAuhBA;;;;AAIA,SAAS4uE,YAAT,CAAuBlb,OAAvB,EAAiC;;AAEhC,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;AACA,MAAKwW,WAAL,GAAmB,EAAnB;AAEA;;AAEDh0G,OAAOK,MAAP,CAAew4G,aAAa94G,SAA5B,EAAuC;;AAEtC69F,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAK,KAAKoX,WAAL,KAAqB,EAA1B,EAA+B;;AAE9B,QAAKA,WAAL,GAAmBxsF,IAAIsxF,SAAJ,CAAe,CAAf,EAAkBtxF,IAAI6vF,WAAJ,CAAiB,GAAjB,IAAyB,CAA3C,CAAnB;AAEA;;AAED,MAAIlsF,QAAQ,IAAZ;;AAEA,MAAI20E,SAAS,IAAIpC,UAAJ,CAAgBvyE,MAAMwyE,OAAtB,CAAb;AACAmC,SAAOlC,IAAP,CAAap2E,GAAb,EAAkB,UAAW6wE,IAAX,EAAkB;;AAEnC,OAAI0K,OAAO,IAAX;;AAEA,OAAI;;AAEHA,WAAO54D,KAAKc,KAAL,CAAYotD,IAAZ,CAAP;AAEA,IAJD,CAIE,OAAQ9lF,KAAR,EAAgB;;AAEjB,QAAKqqF,YAAYv9F,SAAjB,EAA6Bu9F,QAASrqF,KAAT;;AAE7BzD,YAAQyD,KAAR,CAAe,sCAAsCiV,GAAtC,GAA4C,GAA3D,EAAgEjV,MAAMkpE,OAAtE;;AAEA;AAEA;;AAED,OAAIr0D,WAAW27E,KAAK37E,QAApB;;AAEA,OAAKA,aAAa/nB,SAAb,IAA0B+nB,SAASlmB,IAAT,KAAkB7B,SAA5C,IAAyD+nB,SAASlmB,IAAT,CAAcq9F,WAAd,OAAgC,UAA9F,EAA2G;;AAE1GzvF,YAAQyD,KAAR,CAAe,qCAAqCiV,GAArC,GAA2C,iCAA1D;AACA;AAEA;;AAED2D,SAAM8f,KAAN,CAAa83D,IAAb,EAAmBrG,MAAnB;AAEA,GA7BD,EA6BGC,UA7BH,EA6BeC,OA7Bf;AA+BA,EA5CqC;;AA8CtC2a,iBAAgB,UAAW93G,KAAX,EAAmB;;AAElC,OAAKu0G,WAAL,GAAmBv0G,KAAnB;AACA,SAAO,IAAP;AAEA,EAnDqC;;AAqDtCmhG,iBAAgB,UAAWnhG,KAAX,EAAmB;;AAElC,OAAK8gG,WAAL,GAAmB9gG,KAAnB;AACA,SAAO,IAAP;AAEA,EA1DqC;;AA4DtCwrC,QAAO,UAAW83D,IAAX,EAAiBrG,MAAjB,EAA0B;;AAEhC,MAAIxyD,SAAS,KAAK6uE,UAAL,CAAiBhW,KAAK74D,MAAtB,CAAb;AACA,MAAIF,aAAa,KAAKgvE,eAAL,CAAsBjW,KAAK/4D,UAA3B,EAAuCE,MAAvC,CAAjB;;AAEA,MAAI3iB,SAAS,KAAK0xF,WAAL,CAAkBlW,KAAKx7E,MAAvB,EAA+B,YAAY;;AAEvD,OAAKm1E,WAAWr9F,SAAhB,EAA4Bq9F,OAAQhyE,MAAR;AAE5B,GAJY,CAAb;;AAMA,MAAIpE,WAAW,KAAK4yF,aAAL,CAAoBnW,KAAKz8E,QAAzB,EAAmCiB,MAAnC,CAAf;AACA,MAAI0iB,YAAY,KAAKkvE,cAAL,CAAqBpW,KAAK94D,SAA1B,EAAqC3jB,QAArC,CAAhB;;AAEA,MAAIoE,SAAS,KAAK0uF,WAAL,CAAkBrW,KAAKr4E,MAAvB,EAA+Bsf,UAA/B,EAA2CC,SAA3C,CAAb;;AAEA,MAAK84D,KAAK6O,UAAV,EAAuB;;AAEtBlnF,UAAOknF,UAAP,GAAoB,KAAK8G,eAAL,CAAsB3V,KAAK6O,UAA3B,CAApB;AAEA;;AAED,MAAK7O,KAAKx7E,MAAL,KAAgBloB,SAAhB,IAA6B0jG,KAAKx7E,MAAL,CAAY5mB,MAAZ,KAAuB,CAAzD,EAA6D;;AAE5D,OAAK+7F,WAAWr9F,SAAhB,EAA4Bq9F,OAAQhyE,MAAR;AAE5B;;AAED,SAAOA,MAAP;AAEA,EA1FqC;;AA4FtCquF,aAAY,UAAWhW,IAAX,EAAkB;;AAE7B,MAAI74D,SAAS,EAAb;;AAEA,MAAK64D,SAAS1jG,SAAd,EAA0B;;AAEzB,QAAM,IAAI2C,IAAI,CAAR,EAAWC,IAAI8gG,KAAKpiG,MAA1B,EAAkCqB,IAAIC,CAAtC,EAAyCD,GAAzC,EAAgD;;AAE/C,QAAIyoC,QAAQ,IAAIm+D,KAAJ,GAAY9F,QAAZ,CAAsBC,KAAM/gG,CAAN,CAAtB,CAAZ;;AAEAkoC,WAAQO,MAAM9+B,IAAd,IAAuB8+B,KAAvB;AAEA;AAED;;AAED,SAAOP,MAAP;AAEA,EA9GqC;;AAgHtC8uE,kBAAiB,UAAWjW,IAAX,EAAiB74D,MAAjB,EAA0B;;AAE1C,MAAIF,aAAa,EAAjB;;AAEA,MAAK+4D,SAAS1jG,SAAd,EAA0B;;AAEzB,OAAIg6G,iBAAiB,IAAI/B,UAAJ,EAArB;AACA,OAAIgC,uBAAuB,IAAInG,oBAAJ,EAA3B;;AAEA,QAAM,IAAInxG,IAAI,CAAR,EAAWC,IAAI8gG,KAAKpiG,MAA1B,EAAkCqB,IAAIC,CAAtC,EAAyCD,GAAzC,EAAgD;;AAE/C,QAAIspB,QAAJ;AACA,QAAIlC,OAAO25E,KAAM/gG,CAAN,CAAX;;AAEA,YAASonB,KAAKloB,IAAd;;AAEC,UAAK,eAAL;AACA,UAAK,qBAAL;;AAECoqB,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAKxC,KADK,EAEVwC,KAAKvC,MAFK,EAGVuC,KAAK8uB,aAHK,EAIV9uB,KAAK+uB,cAJK,CAAX;;AAOA;;AAED,UAAK,aAAL;AACA,UAAK,mBAAL;AACA,UAAK,cAAL;AAAqB;;AAEpB7sB,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAKxC,KADK,EAEVwC,KAAKvC,MAFK,EAGVuC,KAAKwY,KAHK,EAIVxY,KAAK8uB,aAJK,EAKV9uB,KAAK+uB,cALK,EAMV/uB,KAAKgvB,aANK,CAAX;;AASA;;AAED,UAAK,gBAAL;AACA,UAAK,sBAAL;;AAEC9sB,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAK5F,MADK,EAEV4F,KAAKywE,QAFK,EAGVzwE,KAAKyvE,UAHK,EAIVzvE,KAAK0vE,WAJK,CAAX;;AAOA;;AAED,UAAK,kBAAL;AACA,UAAK,wBAAL;;AAECxtE,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAK6xE,SADK,EAEV7xE,KAAK8xE,YAFK,EAGV9xE,KAAKvC,MAHK,EAIVuC,KAAKyiE,cAJK,EAKVziE,KAAK+uB,cALK,EAMV/uB,KAAK+xE,SANK,EAOV/xE,KAAKyvE,UAPK,EAQVzvE,KAAK0vE,WARK,CAAX;;AAWA;;AAED,UAAK,cAAL;AACA,UAAK,oBAAL;;AAECxtE,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAK5F,MADK,EAEV4F,KAAKvC,MAFK,EAGVuC,KAAKyiE,cAHK,EAIVziE,KAAK+uB,cAJK,EAKV/uB,KAAK+xE,SALK,EAMV/xE,KAAKyvE,UANK,EAOVzvE,KAAK0vE,WAPK,CAAX;;AAUA;;AAED,UAAK,gBAAL;AACA,UAAK,sBAAL;;AAECxtE,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAK5F,MADK,EAEV4F,KAAK8uB,aAFK,EAGV9uB,KAAK+uB,cAHK,EAIV/uB,KAAKuvE,QAJK,EAKVvvE,KAAKwvE,SALK,EAMVxvE,KAAKyvE,UANK,EAOVzvE,KAAK0vE,WAPK,CAAX;;AAUA;;AAED,UAAK,sBAAL;AACA,UAAK,4BAAL;AACA,UAAK,qBAAL;AACA,UAAK,2BAAL;AACA,UAAK,oBAAL;AACA,UAAK,0BAAL;AACA,UAAK,qBAAL;AACA,UAAK,2BAAL;;AAECxtE,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAK5F,MADK,EAEV4F,KAAK2gE,MAFK,CAAX;;AAKA;;AAED,UAAK,cAAL;AACA,UAAK,oBAAL;;AAECz+D,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAKgwE,WADK,EAEVhwE,KAAKiwE,WAFK,EAGVjwE,KAAKkwE,aAHK,EAIVlwE,KAAKmwE,WAJK,EAKVnwE,KAAKyvE,UALK,EAMVzvE,KAAK0vE,WANK,CAAX;;AASA;;AAED,UAAK,eAAL;AACA,UAAK,qBAAL;;AAECxtE,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAK5F,MADK,EAEV4F,KAAK0jE,IAFK,EAGV1jE,KAAKyiE,cAHK,EAIVziE,KAAKwiE,eAJK,EAKVxiE,KAAKskE,GALK,CAAX;;AAQA;;AAED,UAAK,mBAAL;AACA,UAAK,yBAAL;;AAECpiE,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAK5F,MADK,EAEV4F,KAAK0jE,IAFK,EAGV1jE,KAAKwiE,eAHK,EAIVxiE,KAAKyiE,cAJK,EAKVziE,KAAKvM,CALK,EAMVuM,KAAKtT,CANK,CAAX;;AASA;;AAED,UAAK,eAAL;AACA,UAAK,qBAAL;;AAECwV,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAKc,MADK,EAEVd,KAAKywE,QAFK,EAGVzwE,KAAKuvE,QAHK,EAIVvvE,KAAKwvE,SAJK,CAAX;;AAOA;;AAED,UAAK,oBAAL;AACA,UAAK,0BAAL;;AAECttE,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVkoB,KAAKoC,QADK,EAEVpC,KAAK4kB,OAFK,EAGV5kB,KAAK5F,MAHK,EAIV4F,KAAKmwF,OAJK,CAAX;;AAOA;;AAED,UAAK,eAAL;AACA,UAAK,qBAAL;;AAEC,UAAIC,iBAAiB,EAArB;;AAEA,WAAM,IAAIvsF,IAAI,CAAR,EAAW2gB,KAAKxkB,KAAK8gB,MAAL,CAAYvpC,MAAlC,EAA0CssB,IAAI2gB,EAA9C,EAAkD3gB,GAAlD,EAAyD;;AAExD,WAAIwd,QAAQP,OAAQ9gB,KAAK8gB,MAAL,CAAajd,CAAb,CAAR,CAAZ;;AAEAusF,sBAAej4G,IAAf,CAAqBkpC,KAArB;AAEA;;AAEDnf,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVs4G,cADU,EAEVpwF,KAAK0pE,aAFK,CAAX;;AAKA;;AAGD,UAAK,iBAAL;AACA,UAAK,uBAAL;;AAEC,UAAI0mB,iBAAiB,EAArB;;AAEA,WAAM,IAAIvsF,IAAI,CAAR,EAAW2gB,KAAKxkB,KAAK8gB,MAAL,CAAYvpC,MAAlC,EAA0CssB,IAAI2gB,EAA9C,EAAkD3gB,GAAlD,EAAyD;;AAExD,WAAIwd,QAAQP,OAAQ9gB,KAAK8gB,MAAL,CAAajd,CAAb,CAAR,CAAZ;;AAEAusF,sBAAej4G,IAAf,CAAqBkpC,KAArB;AAEA;;AAED,UAAI2oD,cAAchqE,KAAKf,OAAL,CAAa+qE,WAA/B;;AAEA,UAAKA,gBAAgB/zF,SAArB,EAAiC;;AAEhC+pB,YAAKf,OAAL,CAAa+qE,WAAb,GAA2B,IAAIuT,OAAQvT,YAAYlyF,IAApB,CAAJ,GAAiC4hG,QAAjC,CAA2C1P,WAA3C,CAA3B;AAEA;;AAED9nE,iBAAW,IAAI4wE,WAAY9yE,KAAKloB,IAAjB,CAAJ,CACVs4G,cADU,EAEVpwF,KAAKf,OAFK,CAAX;;AAKA;;AAED,UAAK,gBAAL;;AAECiD,iBAAWguF,qBAAqBruE,KAArB,CAA4B7hB,IAA5B,CAAX;;AAEA;;AAED,UAAK,UAAL;;AAECkC,iBAAW+tF,eAAepuE,KAAf,CAAsB7hB,IAAtB,EAA4B,KAAK4qF,WAAjC,EAA+C1oF,QAA1D;;AAEA;;AAED;;AAECxc,cAAQC,IAAR,CAAc,oDAAoDqa,KAAKloB,IAAzD,GAAgE,GAA9E;;AAEA;;AAzOF;;AA6OAoqB,aAAS3f,IAAT,GAAgByd,KAAKzd,IAArB;;AAEA,QAAKyd,KAAKhE,IAAL,KAAc/lB,SAAnB,EAA+BisB,SAASlG,IAAT,GAAgBgE,KAAKhE,IAArB;AAC/B,QAAKkG,SAASG,gBAAT,KAA8B,IAA9B,IAAsCrC,KAAKye,QAAL,KAAkBxoC,SAA7D,EAAyEisB,SAASuc,QAAT,GAAoBze,KAAKye,QAAzB;;AAEzEmC,eAAY5gB,KAAKzd,IAAjB,IAA0B2f,QAA1B;AAEA;AAED;;AAED,SAAO0e,UAAP;AAEA,EAxXqC;;AA0XtCmvE,iBAAgB,UAAWpW,IAAX,EAAiBz8E,QAAjB,EAA4B;;AAE3C,MAAI2jB,YAAY,EAAhB;;AAEA,MAAK84D,SAAS1jG,SAAd,EAA0B;;AAEzB,OAAIygG,SAAS,IAAIiT,cAAJ,EAAb;AACAjT,UAAOkT,WAAP,CAAoB1sF,QAApB;;AAEA,QAAM,IAAItkB,IAAI,CAAR,EAAWC,IAAI8gG,KAAKpiG,MAA1B,EAAkCqB,IAAIC,CAAtC,EAAyCD,GAAzC,EAAgD;;AAE/C,QAAIonB,OAAO25E,KAAM/gG,CAAN,CAAX;;AAEA,QAAKonB,KAAKloB,IAAL,KAAc,eAAnB,EAAqC;;AAEpC;;AAEA,SAAIY,QAAQ,EAAZ;;AAEA,UAAM,IAAImrB,IAAI,CAAd,EAAiBA,IAAI7D,KAAK6gB,SAAL,CAAetpC,MAApC,EAA4CssB,GAA5C,EAAmD;;AAElDnrB,YAAMP,IAAN,CAAYu+F,OAAO70D,KAAP,CAAc7hB,KAAK6gB,SAAL,CAAgBhd,CAAhB,CAAd,CAAZ;AAEA;;AAEDgd,eAAW7gB,KAAKzd,IAAhB,IAAyB7J,KAAzB;AAEA,KAdD,MAcO;;AAENmoC,eAAW7gB,KAAKzd,IAAhB,IAAyBm0F,OAAO70D,KAAP,CAAc7hB,IAAd,CAAzB;AAEA;AAED;AAED;;AAED,SAAO6gB,SAAP;AAEA,EAjaqC;;AAmatCyuE,kBAAiB,UAAW3V,IAAX,EAAkB;;AAElC,MAAI6O,aAAa,EAAjB;;AAEA,OAAM,IAAI5vG,IAAI,CAAd,EAAiBA,IAAI+gG,KAAKpiG,MAA1B,EAAkCqB,GAAlC,EAAyC;;AAExC,OAAIonB,OAAO25E,KAAM/gG,CAAN,CAAX;;AAEA,OAAImvG,OAAOP,cAAc3lE,KAAd,CAAqB7hB,IAArB,CAAX;;AAEA,OAAKA,KAAKzd,IAAL,KAActM,SAAnB,EAA+B8xG,KAAKxlG,IAAL,GAAYyd,KAAKzd,IAAjB;;AAE/BimG,cAAWrwG,IAAX,CAAiB4vG,IAAjB;AAEA;;AAED,SAAOS,UAAP;AAEA,EArbqC;;AAubtCqH,cAAa,UAAWlW,IAAX,EAAiBrG,MAAjB,EAA0B;;AAEtC,MAAIvxE,QAAQ,IAAZ;AACA,MAAI5D,SAAS,EAAb;;AAEA,WAASkyF,SAAT,CAAoBjyF,GAApB,EAA0B;;AAEzB2D,SAAMwyE,OAAN,CAAcT,SAAd,CAAyB11E,GAAzB;;AAEA,UAAOs4E,OAAOlC,IAAP,CAAap2E,GAAb,EAAkB,YAAY;;AAEpC2D,UAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AAEA,IAJM,EAIJnoB,SAJI,EAIO,YAAY;;AAEzB8rB,UAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AACA2D,UAAMwyE,OAAN,CAAcP,SAAd,CAAyB51E,GAAzB;AAEA,IATM,CAAP;AAWA;;AAED,MAAKu7E,SAAS1jG,SAAT,IAAsB0jG,KAAKpiG,MAAL,GAAc,CAAzC,EAA6C;;AAE5C,OAAIg9F,UAAU,IAAIlB,cAAJ,CAAoBC,MAApB,CAAd;;AAEA,OAAIoD,SAAS,IAAIQ,WAAJ,CAAiB3C,OAAjB,CAAb;AACAmC,UAAOc,cAAP,CAAuB,KAAKL,WAA5B;;AAEA,QAAM,IAAIv+F,IAAI,CAAR,EAAWC,IAAI8gG,KAAKpiG,MAA1B,EAAkCqB,IAAIC,CAAtC,EAAyCD,GAAzC,EAAgD;;AAE/C,QAAI2iB,QAAQo+E,KAAM/gG,CAAN,CAAZ;AACA,QAAIsvD,OAAO,4BAA4B3qB,IAA5B,CAAkChiB,MAAM6C,GAAxC,IAAgD7C,MAAM6C,GAAtD,GAA4D2D,MAAM6oF,WAAN,GAAoBrvF,MAAM6C,GAAjG;;AAEAD,WAAQ5C,MAAMhZ,IAAd,IAAuB8tG,UAAWnoD,IAAX,CAAvB;AAEA;AAED;;AAED,SAAO/pC,MAAP;AAEA,EAjeqC;;AAmetC2xF,gBAAe,UAAWnW,IAAX,EAAiBx7E,MAAjB,EAA0B;;AAExC,WAASmyF,aAAT,CAAwBj6G,KAAxB,EAA+ByB,IAA/B,EAAsC;;AAErC,OAAK,OAAOzB,KAAP,KAAiB,QAAtB,EAAiC,OAAOA,KAAP;;AAEjCqP,WAAQC,IAAR,CAAc,sEAAd,EAAsFtP,KAAtF;;AAEA,UAAOyB,KAAMzB,KAAN,CAAP;AAEA;;AAED,MAAI6mB,WAAW,EAAf;;AAEA,MAAKy8E,SAAS1jG,SAAd,EAA0B;;AAEzB,QAAM,IAAI2C,IAAI,CAAR,EAAWC,IAAI8gG,KAAKpiG,MAA1B,EAAkCqB,IAAIC,CAAtC,EAAyCD,GAAzC,EAAgD;;AAE/C,QAAIonB,OAAO25E,KAAM/gG,CAAN,CAAX;;AAEA,QAAKonB,KAAKzE,KAAL,KAAetlB,SAApB,EAAgC;;AAE/ByP,aAAQC,IAAR,CAAc,8CAAd,EAA8Dqa,KAAKzd,IAAnE;AAEA;;AAED,QAAK4b,OAAQ6B,KAAKzE,KAAb,MAAyBtlB,SAA9B,EAA0C;;AAEzCyP,aAAQC,IAAR,CAAc,qCAAd,EAAqDqa,KAAKzE,KAA1D;AAEA;;AAED,QAAI8D,UAAU,IAAI/D,OAAJ,CAAa6C,OAAQ6B,KAAKzE,KAAb,CAAb,CAAd;AACA8D,YAAQiuB,WAAR,GAAsB,IAAtB;;AAEAjuB,YAAQ9c,IAAR,GAAeyd,KAAKzd,IAApB;;AAEA,QAAKyd,KAAKhE,IAAL,KAAc/lB,SAAnB,EAA+BopB,QAAQrD,IAAR,GAAegE,KAAKhE,IAApB;;AAE/B,QAAKgE,KAAKxE,OAAL,KAAiBvlB,SAAtB,EAAkCopB,QAAQ7D,OAAR,GAAkB80F,cAAetwF,KAAKxE,OAApB,EAA6B+0F,eAA7B,CAAlB;;AAElC,QAAKvwF,KAAKzX,MAAL,KAAgBtS,SAArB,EAAiCopB,QAAQ9W,MAAR,CAAeD,SAAf,CAA0B0X,KAAKzX,MAA/B;AACjC,QAAKyX,KAAK5D,MAAL,KAAgBnmB,SAArB,EAAiCopB,QAAQjD,MAAR,CAAe9T,SAAf,CAA0B0X,KAAK5D,MAA/B;AACjC,QAAK4D,KAAKlX,MAAL,KAAgB7S,SAArB,EAAiCopB,QAAQvW,MAAR,CAAeR,SAAf,CAA0B0X,KAAKlX,MAA/B;AACjC,QAAKkX,KAAKhF,QAAL,KAAkB/kB,SAAvB,EAAmCopB,QAAQrE,QAAR,GAAmBgF,KAAKhF,QAAxB;;AAEnC,QAAKgF,KAAK9B,IAAL,KAAcjoB,SAAnB,EAA+B;;AAE9BopB,aAAQ5D,KAAR,GAAgB60F,cAAetwF,KAAK9B,IAAL,CAAW,CAAX,CAAf,EAA+BsyF,gBAA/B,CAAhB;AACAnxF,aAAQ3D,KAAR,GAAgB40F,cAAetwF,KAAK9B,IAAL,CAAW,CAAX,CAAf,EAA+BsyF,gBAA/B,CAAhB;AAEA;;AAED,QAAKxwF,KAAKnE,MAAL,KAAgB5lB,SAArB,EAAiCopB,QAAQxD,MAAR,GAAiBmE,KAAKnE,MAAtB;;AAEjC,QAAKmE,KAAKpE,SAAL,KAAmB3lB,SAAxB,EAAoCopB,QAAQzD,SAAR,GAAoB00F,cAAetwF,KAAKpE,SAApB,EAA+B60F,cAA/B,CAApB;AACpC,QAAKzwF,KAAKrE,SAAL,KAAmB1lB,SAAxB,EAAoCopB,QAAQ1D,SAAR,GAAoB20F,cAAetwF,KAAKrE,SAApB,EAA+B80F,cAA/B,CAApB;AACpC,QAAKzwF,KAAKlE,UAAL,KAAoB7lB,SAAzB,EAAqCopB,QAAQvD,UAAR,GAAqBkE,KAAKlE,UAA1B;;AAErC,QAAKkE,KAAKxD,KAAL,KAAevmB,SAApB,EAAgCopB,QAAQ7C,KAAR,GAAgBwD,KAAKxD,KAArB;;AAEhCU,aAAU8C,KAAKzd,IAAf,IAAwB8c,OAAxB;AAEA;AAED;;AAED,SAAOnC,QAAP;AAEA,EAxiBqC;;AA0iBtC8yF,cAAa,UAAWhwF,IAAX,EAAiB4gB,UAAjB,EAA6BC,SAA7B,EAAyC;;AAErD,MAAIvf,MAAJ;;AAEA,WAASovF,WAAT,CAAsB10F,IAAtB,EAA6B;;AAE5B,OAAK4kB,WAAY5kB,IAAZ,MAAuB/lB,SAA5B,EAAwC;;AAEvCyP,YAAQC,IAAR,CAAc,wCAAd,EAAwDqW,IAAxD;AAEA;;AAED,UAAO4kB,WAAY5kB,IAAZ,CAAP;AAEA;;AAED,WAAS20F,WAAT,CAAsB30F,IAAtB,EAA6B;;AAE5B,OAAKA,SAAS/lB,SAAd,EAA0B,OAAOA,SAAP;;AAE1B,OAAK86B,MAAMC,OAAN,CAAehV,IAAf,CAAL,EAA6B;;AAE5B,QAAItjB,QAAQ,EAAZ;;AAEA,SAAM,IAAIE,IAAI,CAAR,EAAWC,IAAImjB,KAAKzkB,MAA1B,EAAkCqB,IAAIC,CAAtC,EAAyCD,GAAzC,EAAgD;;AAE/C,SAAI2J,OAAOyZ,KAAMpjB,CAAN,CAAX;;AAEA,SAAKioC,UAAWt+B,IAAX,MAAsBtM,SAA3B,EAAuC;;AAEtCyP,cAAQC,IAAR,CAAc,wCAAd,EAAwDpD,IAAxD;AAEA;;AAED7J,WAAMP,IAAN,CAAY0oC,UAAWt+B,IAAX,CAAZ;AAEA;;AAED,WAAO7J,KAAP;AAEA;;AAED,OAAKmoC,UAAW7kB,IAAX,MAAsB/lB,SAA3B,EAAuC;;AAEtCyP,YAAQC,IAAR,CAAc,wCAAd,EAAwDqW,IAAxD;AAEA;;AAED,UAAO6kB,UAAW7kB,IAAX,CAAP;AAEA;;AAED,UAASgE,KAAKloB,IAAd;;AAEC,QAAK,OAAL;;AAECwpB,aAAS,IAAIm6D,KAAJ,EAAT;;AAEA,QAAKz7D,KAAKi8B,UAAL,KAAoBhmD,SAAzB,EAAqC;;AAEpC,SAAKF,OAAOK,SAAP,CAAkB4pB,KAAKi8B,UAAvB,CAAL,EAA2C;;AAE1C36B,aAAO26B,UAAP,GAAoB,IAAI/qB,KAAJ,CAAWlR,KAAKi8B,UAAhB,CAApB;AAEA;AAED;;AAED,QAAKj8B,KAAK0V,GAAL,KAAaz/B,SAAlB,EAA8B;;AAE7B,SAAK+pB,KAAK0V,GAAL,CAAS59B,IAAT,KAAkB,KAAvB,EAA+B;;AAE9BwpB,aAAOoU,GAAP,GAAa,IAAI8lD,GAAJ,CAASx7D,KAAK0V,GAAL,CAAS5D,KAAlB,EAAyB9R,KAAK0V,GAAL,CAASriB,IAAlC,EAAwC2M,KAAK0V,GAAL,CAASpiB,GAAjD,CAAb;AAEA,MAJD,MAIO,IAAK0M,KAAK0V,GAAL,CAAS59B,IAAT,KAAkB,SAAvB,EAAmC;;AAEzCwpB,aAAOoU,GAAP,GAAa,IAAI6lD,OAAJ,CAAav7D,KAAK0V,GAAL,CAAS5D,KAAtB,EAA6B9R,KAAK0V,GAAL,CAASykC,OAAtC,CAAb;AAEA;AAED;;AAED;;AAED,QAAK,mBAAL;;AAEC74C,aAAS,IAAI4oD,iBAAJ,CAAuBlqD,KAAKmqD,GAA5B,EAAiCnqD,KAAKoqD,MAAtC,EAA8CpqD,KAAK3M,IAAnD,EAAyD2M,KAAK1M,GAA9D,CAAT;;AAEA,QAAK0M,KAAKqqD,KAAL,KAAep0E,SAApB,EAAgCqrB,OAAO+oD,KAAP,GAAerqD,KAAKqqD,KAApB;AAChC,QAAKrqD,KAAKiiB,IAAL,KAAchsC,SAAnB,EAA+BqrB,OAAO2gB,IAAP,GAAcjiB,KAAKiiB,IAAnB;AAC/B,QAAKjiB,KAAKsqD,SAAL,KAAmBr0E,SAAxB,EAAoCqrB,OAAOgpD,SAAP,GAAmBtqD,KAAKsqD,SAAxB;AACpC,QAAKtqD,KAAKuqD,UAAL,KAAoBt0E,SAAzB,EAAqCqrB,OAAOipD,UAAP,GAAoBvqD,KAAKuqD,UAAzB;AACrC,QAAKvqD,KAAKkiB,IAAL,KAAcjsC,SAAnB,EAA+BqrB,OAAO4gB,IAAP,GAActrC,OAAOK,MAAP,CAAe,EAAf,EAAmB+oB,KAAKkiB,IAAxB,CAAd;;AAE/B;;AAED,QAAK,oBAAL;;AAEC5gB,aAAS,IAAI0gB,kBAAJ,CAAwBhiB,KAAK/M,IAA7B,EAAmC+M,KAAK9M,KAAxC,EAA+C8M,KAAK7M,GAApD,EAAyD6M,KAAK5M,MAA9D,EAAsE4M,KAAK3M,IAA3E,EAAiF2M,KAAK1M,GAAtF,CAAT;;AAEA,QAAK0M,KAAKiiB,IAAL,KAAchsC,SAAnB,EAA+BqrB,OAAO2gB,IAAP,GAAcjiB,KAAKiiB,IAAnB;AAC/B,QAAKjiB,KAAKkiB,IAAL,KAAcjsC,SAAnB,EAA+BqrB,OAAO4gB,IAAP,GAActrC,OAAOK,MAAP,CAAe,EAAf,EAAmB+oB,KAAKkiB,IAAxB,CAAd;;AAE/B;;AAED,QAAK,cAAL;;AAEC5gB,aAAS,IAAI8+E,YAAJ,CAAkBpgF,KAAK8R,KAAvB,EAA8B9R,KAAK8zC,SAAnC,CAAT;;AAEA;;AAED,QAAK,kBAAL;;AAECxyC,aAAS,IAAI6+E,gBAAJ,CAAsBngF,KAAK8R,KAA3B,EAAkC9R,KAAK8zC,SAAvC,CAAT;;AAEA;;AAED,QAAK,YAAL;;AAECxyC,aAAS,IAAI2+E,UAAJ,CAAgBjgF,KAAK8R,KAArB,EAA4B9R,KAAK8zC,SAAjC,EAA4C9zC,KAAKmJ,QAAjD,EAA2DnJ,KAAK4W,KAAhE,CAAT;;AAEA;;AAED,QAAK,eAAL;;AAECtV,aAAS,IAAI++E,aAAJ,CAAmBrgF,KAAK8R,KAAxB,EAA+B9R,KAAK8zC,SAApC,EAA+C9zC,KAAKxC,KAApD,EAA2DwC,KAAKvC,MAAhE,CAAT;;AAEA;;AAED,QAAK,WAAL;;AAEC6D,aAAS,IAAIy+E,SAAJ,CAAe//E,KAAK8R,KAApB,EAA2B9R,KAAK8zC,SAAhC,EAA2C9zC,KAAKmJ,QAAhD,EAA0DnJ,KAAKvY,KAA/D,EAAsEuY,KAAKo0C,QAA3E,EAAqFp0C,KAAK4W,KAA1F,CAAT;;AAEA;;AAED,QAAK,iBAAL;;AAECtV,aAAS,IAAIs+E,eAAJ,CAAqB5/E,KAAK8R,KAA1B,EAAiC9R,KAAKsX,WAAtC,EAAmDtX,KAAK8zC,SAAxD,CAAT;;AAEA;;AAED,QAAK,aAAL;;AAECpuD,YAAQC,IAAR,CAAc,oEAAd;;AAED,QAAK,MAAL;;AAEC,QAAIuc,WAAWwuF,YAAa1wF,KAAKkC,QAAlB,CAAf;AACA,QAAIof,WAAWqvE,YAAa3wF,KAAKshB,QAAlB,CAAf;;AAEA,QAAKpf,SAASquC,KAAT,IAAkBruC,SAASquC,KAAT,CAAeh5D,MAAf,GAAwB,CAA/C,EAAmD;;AAElD+pB,cAAS,IAAIy7D,WAAJ,CAAiB76D,QAAjB,EAA2Bof,QAA3B,CAAT;AAEA,KAJD,MAIO;;AAENhgB,cAAS,IAAIy3B,IAAJ,CAAU72B,QAAV,EAAoBof,QAApB,CAAT;AAEA;;AAED;;AAED,QAAK,KAAL;;AAEChgB,aAAS,IAAI26D,GAAJ,EAAT;;AAEA;;AAED,QAAK,MAAL;;AAEC36D,aAAS,IAAIy8D,IAAJ,CAAU2yB,YAAa1wF,KAAKkC,QAAlB,CAAV,EAAwCyuF,YAAa3wF,KAAKshB,QAAlB,CAAxC,EAAsEthB,KAAKg9B,IAA3E,CAAT;;AAEA;;AAED,QAAK,UAAL;;AAEC17B,aAAS,IAAIs9D,QAAJ,CAAc8xB,YAAa1wF,KAAKkC,QAAlB,CAAd,EAA4CyuF,YAAa3wF,KAAKshB,QAAlB,CAA5C,CAAT;;AAEA;;AAED,QAAK,cAAL;;AAEChgB,aAAS,IAAI08D,YAAJ,CAAkB0yB,YAAa1wF,KAAKkC,QAAlB,CAAlB,EAAgDyuF,YAAa3wF,KAAKshB,QAAlB,CAAhD,CAAT;;AAEA;;AAED,QAAK,YAAL;AACA,QAAK,QAAL;;AAEChgB,aAAS,IAAIu9D,MAAJ,CAAY6xB,YAAa1wF,KAAKkC,QAAlB,CAAZ,EAA0CyuF,YAAa3wF,KAAKshB,QAAlB,CAA1C,CAAT;;AAEA;;AAED,QAAK,QAAL;;AAEChgB,aAAS,IAAIs6D,MAAJ,CAAY+0B,YAAa3wF,KAAKshB,QAAlB,CAAZ,CAAT;;AAEA;;AAED,QAAK,OAAL;;AAEChgB,aAAS,IAAI+9D,KAAJ,EAAT;;AAEA;;AAED;;AAEC/9D,aAAS,IAAIoc,QAAJ,EAAT;;AA3JF;;AA+JApc,SAAO/e,IAAP,GAAcyd,KAAKzd,IAAnB;;AAEA,MAAKyd,KAAKhE,IAAL,KAAc/lB,SAAnB,EAA+BqrB,OAAOtF,IAAP,GAAcgE,KAAKhE,IAAnB;;AAE/B,MAAKgE,KAAKrN,MAAL,KAAgB1c,SAArB,EAAiC;;AAEhCqrB,UAAO3O,MAAP,CAAcrK,SAAd,CAAyB0X,KAAKrN,MAA9B;;AAEA,OAAKqN,KAAK3D,gBAAL,KAA0BpmB,SAA/B,EAA2CqrB,OAAOjF,gBAAP,GAA0B2D,KAAK3D,gBAA/B;AAC3C,OAAKiF,OAAOjF,gBAAZ,EAA+BiF,OAAO3O,MAAP,CAAcF,SAAd,CAAyB6O,OAAOlQ,QAAhC,EAA0CkQ,OAAOjQ,UAAjD,EAA6DiQ,OAAOlR,KAApE;AAE/B,GAPD,MAOO;;AAEN,OAAK4P,KAAK5O,QAAL,KAAkBnb,SAAvB,EAAmCqrB,OAAOlQ,QAAP,CAAgB9I,SAAhB,CAA2B0X,KAAK5O,QAAhC;AACnC,OAAK4O,KAAKhF,QAAL,KAAkB/kB,SAAvB,EAAmCqrB,OAAOtG,QAAP,CAAgB1S,SAAhB,CAA2B0X,KAAKhF,QAAhC;AACnC,OAAKgF,KAAK3O,UAAL,KAAoBpb,SAAzB,EAAqCqrB,OAAOjQ,UAAP,CAAkB/I,SAAlB,CAA6B0X,KAAK3O,UAAlC;AACrC,OAAK2O,KAAK5P,KAAL,KAAena,SAApB,EAAgCqrB,OAAOlR,KAAP,CAAa9H,SAAb,CAAwB0X,KAAK5P,KAA7B;AAEhC;;AAED,MAAK4P,KAAKqe,UAAL,KAAoBpoC,SAAzB,EAAqCqrB,OAAO+c,UAAP,GAAoBre,KAAKqe,UAAzB;AACrC,MAAKre,KAAKse,aAAL,KAAuBroC,SAA5B,EAAwCqrB,OAAOgd,aAAP,GAAuBte,KAAKse,aAA5B;;AAExC,MAAKte,KAAKmW,MAAV,EAAmB;;AAElB,OAAKnW,KAAKmW,MAAL,CAAY89B,IAAZ,KAAqBh+D,SAA1B,EAAsCqrB,OAAO6U,MAAP,CAAc89B,IAAd,GAAqBj0C,KAAKmW,MAAL,CAAY89B,IAAjC;AACtC,OAAKj0C,KAAKmW,MAAL,CAAY/b,MAAZ,KAAuBnkB,SAA5B,EAAwCqrB,OAAO6U,MAAP,CAAc/b,MAAd,GAAuB4F,KAAKmW,MAAL,CAAY/b,MAAnC;AACxC,OAAK4F,KAAKmW,MAAL,CAAY+9B,OAAZ,KAAwBj+D,SAA7B,EAAyCqrB,OAAO6U,MAAP,CAAc+9B,OAAd,CAAsB5rD,SAAtB,CAAiC0X,KAAKmW,MAAL,CAAY+9B,OAA7C;AACzC,OAAKl0C,KAAKmW,MAAL,CAAYtd,MAAZ,KAAuB5iB,SAA5B,EAAwCqrB,OAAO6U,MAAP,CAActd,MAAd,GAAuB,KAAKm3F,WAAL,CAAkBhwF,KAAKmW,MAAL,CAAYtd,MAA9B,CAAvB;AAExC;;AAED,MAAKmH,KAAKoe,OAAL,KAAiBnoC,SAAtB,EAAkCqrB,OAAO8c,OAAP,GAAiBpe,KAAKoe,OAAtB;AAClC,MAAKpe,KAAKue,aAAL,KAAuBtoC,SAA5B,EAAwCqrB,OAAOid,aAAP,GAAuBve,KAAKue,aAA5B;AACxC,MAAKve,KAAKwe,WAAL,KAAqBvoC,SAA1B,EAAsCqrB,OAAOkd,WAAP,GAAqBxe,KAAKwe,WAA1B;AACtC,MAAKxe,KAAKye,QAAL,KAAkBxoC,SAAvB,EAAmCqrB,OAAOmd,QAAP,GAAkBze,KAAKye,QAAvB;;AAEnC,MAAKze,KAAK4d,QAAL,KAAkB3nC,SAAvB,EAAmC;;AAElC,OAAI2nC,WAAW5d,KAAK4d,QAApB;;AAEA,QAAM,IAAIhlC,IAAI,CAAd,EAAiBA,IAAIglC,SAASrmC,MAA9B,EAAsCqB,GAAtC,EAA6C;;AAE5C0oB,WAAO9b,GAAP,CAAY,KAAKwqG,WAAL,CAAkBpyE,SAAUhlC,CAAV,CAAlB,EAAiCgoC,UAAjC,EAA6CC,SAA7C,CAAZ;AAEA;AAED;;AAED,MAAK7gB,KAAKloB,IAAL,KAAc,KAAnB,EAA2B;;AAE1B,OAAIokF,SAASl8D,KAAKk8D,MAAlB;;AAEA,QAAM,IAAIrjF,IAAI,CAAd,EAAiBA,IAAIqjF,OAAO3kF,MAA5B,EAAoCsB,GAApC,EAA2C;;AAE1C,QAAIoiF,QAAQiB,OAAQrjF,CAAR,CAAZ;AACA,QAAIsnC,QAAQ7e,OAAO2e,mBAAP,CAA4B,MAA5B,EAAoCg7C,MAAM35D,MAA1C,CAAZ;;AAEA,QAAK6e,UAAUlqC,SAAf,EAA2B;;AAE1BqrB,YAAO66D,QAAP,CAAiBh8C,KAAjB,EAAwB86C,MAAM9xD,QAA9B;AAEA;AAED;AAED;;AAED,SAAO7H,MAAP;AAEA;;AAn0BqC,CAAvC;;AAu0BA,IAAIivF,kBAAkB;AACrB7zG,YAAWA,SADU;AAErBC,wBAAuBA,qBAFF;AAGrBC,wBAAuBA,qBAHF;AAIrBC,mCAAkCA,gCAJb;AAKrBC,mCAAkCA,gCALb;AAMrBC,6BAA4BA,0BANP;AAOrBC,0BAAyBA,uBAPJ;AAQrBC,0BAAyBA;AARJ,CAAtB;;AAWA,IAAIuzG,mBAAmB;AACtBtzG,iBAAgBA,cADM;AAEtBC,sBAAqBA,mBAFC;AAGtBC,yBAAwBA;AAHF,CAAvB;;AAMA,IAAIqzG,iBAAiB;AACpBpzG,gBAAeA,aADK;AAEpBC,6BAA4BA,0BAFR;AAGpBC,4BAA2BA,yBAHP;AAIpBC,eAAcA,YAJM;AAKpBC,4BAA2BA,yBALP;AAMpBC,2BAA0BA;AANN,CAArB;;AASA;;;;AAKA,SAASkzG,iBAAT,CAA4Brc,OAA5B,EAAsC;;AAErC,KAAK,OAAOsc,iBAAP,KAA6B,WAAlC,EAAgD;;AAE/CnrG,UAAQC,IAAR,CAAc,6DAAd;AAEA;;AAED,KAAK,OAAOmrG,KAAP,KAAiB,WAAtB,EAAoC;;AAEnCprG,UAAQC,IAAR,CAAc,iDAAd;AAEA;;AAED,MAAK4uF,OAAL,GAAeA,YAAYt+F,SAAZ,GAAwBs+F,OAAxB,GAAkCH,qBAAjD;AACA,MAAKn1E,OAAL,GAAehpB,SAAf;AAEA;;AAED26G,kBAAkBj6G,SAAlB,GAA8B;;AAE7B0O,cAAaurG,iBAFgB;;AAI7BG,aAAY,SAASA,UAAT,CAAqB9xF,OAArB,EAA+B;;AAE1C,OAAKA,OAAL,GAAeA,OAAf;;AAEA,SAAO,IAAP;AAEA,EAV4B;;AAY7Bu1E,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAKp1E,QAAQnoB,SAAb,EAAyBmoB,MAAM,EAAN;;AAEzB,MAAK,KAAK8pC,IAAL,KAAcjyD,SAAnB,EAA+BmoB,MAAM,KAAK8pC,IAAL,GAAY9pC,GAAlB;;AAE/BA,QAAM,KAAKm2E,OAAL,CAAaN,UAAb,CAAyB71E,GAAzB,CAAN;;AAEA,MAAI2D,QAAQ,IAAZ;;AAEA,MAAI0yE,SAASvB,MAAMp8F,GAAN,CAAWsnB,GAAX,CAAb;;AAEA,MAAKq2E,WAAWx+F,SAAhB,EAA4B;;AAE3B8rB,SAAMwyE,OAAN,CAAcT,SAAd,CAAyB11E,GAAzB;;AAEAs2E,cAAY,YAAY;;AAEvB,QAAKpB,MAAL,EAAcA,OAAQmB,MAAR;;AAEd1yE,UAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AAEA,IAND,EAMG,CANH;;AAQA,UAAOq2E,MAAP;AAEA;;AAEDqc,QAAO1yF,GAAP,EAAa4wD,IAAb,CAAmB,UAAWgiC,GAAX,EAAiB;;AAEnC,UAAOA,IAAIC,IAAJ,EAAP;AAEA,GAJD,EAIIjiC,IAJJ,CAIU,UAAWiiC,IAAX,EAAkB;;AAE3B,UAAOJ,kBAAmBI,IAAnB,EAAyBlvF,MAAM9C,OAA/B,CAAP;AAEA,GARD,EAQI+vD,IARJ,CAQU,UAAWkiC,WAAX,EAAyB;;AAElChe,SAAM1tF,GAAN,CAAW4Y,GAAX,EAAgB8yF,WAAhB;;AAEA,OAAK5d,MAAL,EAAcA,OAAQ4d,WAAR;;AAEdnvF,SAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AAEA,GAhBD,EAgBI+yF,KAhBJ,CAgBW,UAAWzqG,CAAX,EAAe;;AAEzB,OAAK8sF,OAAL,EAAeA,QAAS9sF,CAAT;;AAEfqb,SAAMwyE,OAAN,CAAcR,OAAd,CAAuB31E,GAAvB;AACA2D,SAAMwyE,OAAN,CAAcP,SAAd,CAAyB51E,GAAzB;AAEA,GAvBD;AAyBA,EAjE4B;;AAmE7Bo5E,iBAAgB,YAAW,WAAc;;AAExC,SAAO,IAAP;AAEA,EAvE4B;;AAyE7BpB,UAAS,UAAW//F,KAAX,EAAmB;;AAE3B,OAAK6xD,IAAL,GAAY7xD,KAAZ;AACA,SAAO,IAAP;AAEA;;AA9E4B,CAA9B;;AAkFA;;;;;AAKA,SAAS+6G,SAAT,GAAqB;;AAEpB,MAAKt5G,IAAL,GAAY,WAAZ;;AAEA,MAAKg6B,KAAL,GAAa,IAAIZ,KAAJ,EAAb;;AAEA,MAAKmgF,QAAL,GAAgB,EAAhB;AACA,MAAKC,WAAL,GAAmB,IAAnB;AAEA;;AAED16G,OAAOK,MAAP,CAAem6G,UAAUz6G,SAAzB,EAAoC;;AAEnC4nG,SAAQ,UAAW9nG,CAAX,EAAc4M,CAAd,EAAkB;;AAEzB,OAAKiuG,WAAL,GAAmB,IAAIjT,IAAJ,EAAnB;AACA,OAAKgT,QAAL,CAAcl5G,IAAd,CAAoB,KAAKm5G,WAAzB;AACA,OAAKA,WAAL,CAAiB/S,MAAjB,CAAyB9nG,CAAzB,EAA4B4M,CAA5B;AAEA,EARkC;;AAUnCm7F,SAAQ,UAAW/nG,CAAX,EAAc4M,CAAd,EAAkB;;AAEzB,OAAKiuG,WAAL,CAAiB9S,MAAjB,CAAyB/nG,CAAzB,EAA4B4M,CAA5B;AAEA,EAdkC;;AAgBnCo7F,mBAAkB,UAAWC,IAAX,EAAiBC,IAAjB,EAAuB9E,EAAvB,EAA2BC,EAA3B,EAAgC;;AAEjD,OAAKwX,WAAL,CAAiB7S,gBAAjB,CAAmCC,IAAnC,EAAyCC,IAAzC,EAA+C9E,EAA/C,EAAmDC,EAAnD;AAEA,EApBkC;;AAsBnC8E,gBAAe,UAAWC,KAAX,EAAkBC,KAAlB,EAAyBC,KAAzB,EAAgCC,KAAhC,EAAuCnF,EAAvC,EAA2CC,EAA3C,EAAgD;;AAE9D,OAAKwX,WAAL,CAAiB1S,aAAjB,CAAgCC,KAAhC,EAAuCC,KAAvC,EAA8CC,KAA9C,EAAqDC,KAArD,EAA4DnF,EAA5D,EAAgEC,EAAhE;AAEA,EA1BkC;;AA4BnCmF,aAAY,UAAWnW,GAAX,EAAiB;;AAE5B,OAAKwoB,WAAL,CAAiBrS,UAAjB,CAA6BnW,GAA7B;AAEA,EAhCkC;;AAkCnCyoB,WAAU,UAAWC,KAAX,EAAkBC,OAAlB,EAA4B;;AAErC,WAASC,eAAT,CAA0BC,UAA1B,EAAuC;;AAEtC,OAAI7wE,SAAS,EAAb;;AAEA,QAAM,IAAIloC,IAAI,CAAR,EAAWC,IAAI84G,WAAWp6G,MAAhC,EAAwCqB,IAAIC,CAA5C,EAA+CD,GAA/C,EAAsD;;AAErD,QAAIg5G,UAAUD,WAAY/4G,CAAZ,CAAd;;AAEA,QAAIi5G,WAAW,IAAIrS,KAAJ,EAAf;AACAqS,aAASpU,MAAT,GAAkBmU,QAAQnU,MAA1B;;AAEA38D,WAAO3oC,IAAP,CAAa05G,QAAb;AAEA;;AAED,UAAO/wE,MAAP;AAEA;;AAED,WAASgxE,oBAAT,CAA+BtmB,IAA/B,EAAqCumB,SAArC,EAAiD;;AAEhD,OAAIC,UAAUD,UAAUx6G,MAAxB;;AAEA;AACA;AACA;AACA;AACA,OAAI+wF,SAAS,KAAb;AACA,QAAM,IAAI70E,IAAIu+F,UAAU,CAAlB,EAAqBtlG,IAAI,CAA/B,EAAkCA,IAAIslG,OAAtC,EAA+Cv+F,IAAI/G,GAAnD,EAA0D;;AAEzD,QAAIulG,YAAYF,UAAWt+F,CAAX,CAAhB;AACA,QAAIy+F,aAAaH,UAAWrlG,CAAX,CAAjB;;AAEA,QAAIylG,SAASD,WAAWz7G,CAAX,GAAew7G,UAAUx7G,CAAtC;AACA,QAAI27G,SAASF,WAAW7uG,CAAX,GAAe4uG,UAAU5uG,CAAtC;;AAEA,QAAKnN,KAAKqR,GAAL,CAAU6qG,MAAV,IAAqBr8G,OAAOC,OAAjC,EAA2C;;AAE1C;AACA,SAAKo8G,SAAS,CAAd,EAAkB;;AAEjBH,kBAAYF,UAAWrlG,CAAX,CAAZ,CAA4BylG,SAAS,CAAEA,MAAX;AAC5BD,mBAAaH,UAAWt+F,CAAX,CAAb,CAA6B2+F,SAAS,CAAEA,MAAX;AAE7B;AACD,SAAO5mB,KAAKnoF,CAAL,GAAS4uG,UAAU5uG,CAArB,IAA8BmoF,KAAKnoF,CAAL,GAAS6uG,WAAW7uG,CAAvD,EAA+D;;AAE/D,SAAKmoF,KAAKnoF,CAAL,KAAW4uG,UAAU5uG,CAA1B,EAA8B;;AAE7B,UAAKmoF,KAAK/0F,CAAL,KAAWw7G,UAAUx7G,CAA1B,EAA+B,OAAO,IAAP,CAFF,CAEgB;AAC7C;AAEA,MALD,MAKO;;AAEN,UAAI47G,WAAWD,UAAW5mB,KAAK/0F,CAAL,GAASw7G,UAAUx7G,CAA9B,IAAoC07G,UAAW3mB,KAAKnoF,CAAL,GAAS4uG,UAAU5uG,CAA9B,CAAnD;AACA,UAAKgvG,aAAa,CAAlB,EAAyB,OAAO,IAAP,CAHnB,CAGiC;AACvC,UAAKA,WAAW,CAAhB,EAAwB;AACxB/pB,eAAS,CAAEA,MAAX,CALM,CAKc;AAEpB;AAED,KAzBD,MAyBO;;AAEN;AACA,SAAKkD,KAAKnoF,CAAL,KAAW4uG,UAAU5uG,CAA1B,EAAgC,SAH1B,CAGsC;AAC5C;AACA,SAAS6uG,WAAWz7G,CAAX,IAAgB+0F,KAAK/0F,CAAvB,IAAgC+0F,KAAK/0F,CAAL,IAAUw7G,UAAUx7G,CAAtD,IACCw7G,UAAUx7G,CAAV,IAAe+0F,KAAK/0F,CAAtB,IAA+B+0F,KAAK/0F,CAAL,IAAUy7G,WAAWz7G,CADxD,EACiE,OAAO,IAAP,CAN3D,CAMwE;AAC9E;AAEA;AAED;;AAED,UAAO6xF,MAAP;AAEA;;AAED,MAAIO,cAAcF,WAAWE,WAA7B;;AAEA,MAAIwoB,WAAW,KAAKA,QAApB;AACA,MAAKA,SAAS95G,MAAT,KAAoB,CAAzB,EAA6B,OAAO,EAAP;;AAE7B,MAAKk6G,YAAY,IAAjB,EAAwB,OAAOC,gBAAiBL,QAAjB,CAAP;;AAGxB,MAAIiB,KAAJ;AAAA,MAAWV,OAAX;AAAA,MAAoBC,QAApB;AAAA,MAA8B/wE,SAAS,EAAvC;;AAEA,MAAKuwE,SAAS95G,MAAT,KAAoB,CAAzB,EAA6B;;AAE5Bq6G,aAAUP,SAAU,CAAV,CAAV;AACAQ,cAAW,IAAIrS,KAAJ,EAAX;AACAqS,YAASpU,MAAT,GAAkBmU,QAAQnU,MAA1B;AACA38D,UAAO3oC,IAAP,CAAa05G,QAAb;AACA,UAAO/wE,MAAP;AAEA;;AAED,MAAIyxE,aAAa,CAAE1pB,YAAawoB,SAAU,CAAV,EAAclZ,SAAd,EAAb,CAAnB;AACAoa,eAAaf,QAAQ,CAAEe,UAAV,GAAuBA,UAApC;;AAEA;;AAEA,MAAIC,mBAAmB,EAAvB;AACA,MAAIC,YAAY,EAAhB;AACA,MAAIC,gBAAgB,EAApB;AACA,MAAIC,UAAU,CAAd;AACA,MAAIC,SAAJ;;AAEAH,YAAWE,OAAX,IAAuB18G,SAAvB;AACAy8G,gBAAeC,OAAf,IAA2B,EAA3B;;AAEA,OAAM,IAAI/5G,IAAI,CAAR,EAAWC,IAAIw4G,SAAS95G,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDg5G,aAAUP,SAAUz4G,CAAV,CAAV;AACAg6G,eAAYhB,QAAQzZ,SAAR,EAAZ;AACAma,WAAQzpB,YAAa+pB,SAAb,CAAR;AACAN,WAAQd,QAAQ,CAAEc,KAAV,GAAkBA,KAA1B;;AAEA,OAAKA,KAAL,EAAa;;AAEZ,QAAO,CAAEC,UAAJ,IAAsBE,UAAWE,OAAX,CAA3B,EAAoDA;;AAEpDF,cAAWE,OAAX,IAAuB,EAAE7sG,GAAG,IAAI05F,KAAJ,EAAL,EAAkB/rF,GAAGm/F,SAArB,EAAvB;AACAH,cAAWE,OAAX,EAAqB7sG,CAArB,CAAuB23F,MAAvB,GAAgCmU,QAAQnU,MAAxC;;AAEA,QAAK8U,UAAL,EAAkBI;AAClBD,kBAAeC,OAAf,IAA2B,EAA3B;;AAEA;AAEA,IAZD,MAYO;;AAEND,kBAAeC,OAAf,EAAyBx6G,IAAzB,CAA+B,EAAEqb,GAAGo+F,OAAL,EAAcn+F,GAAGm/F,UAAW,CAAX,CAAjB,EAA/B;;AAEA;AAEA;AAED;;AAED;AACA,MAAK,CAAEH,UAAW,CAAX,CAAP,EAAwB,OAAOf,gBAAiBL,QAAjB,CAAP;;AAGxB,MAAKoB,UAAUl7G,MAAV,GAAmB,CAAxB,EAA4B;;AAE3B,OAAIs7G,YAAY,KAAhB;AACA,OAAIC,WAAW,EAAf;;AAEA,QAAM,IAAIC,OAAO,CAAX,EAAcC,OAAOP,UAAUl7G,MAArC,EAA6Cw7G,OAAOC,IAApD,EAA0DD,MAA1D,EAAoE;;AAEnEP,qBAAkBO,IAAlB,IAA2B,EAA3B;AAEA;;AAED,QAAM,IAAIA,OAAO,CAAX,EAAcC,OAAOP,UAAUl7G,MAArC,EAA6Cw7G,OAAOC,IAApD,EAA0DD,MAA1D,EAAoE;;AAEnE,QAAIE,MAAMP,cAAeK,IAAf,CAAV;;AAEA,SAAM,IAAIG,OAAO,CAAjB,EAAoBA,OAAOD,IAAI17G,MAA/B,EAAuC27G,MAAvC,EAAiD;;AAEhD,SAAIC,KAAKF,IAAKC,IAAL,CAAT;AACA,SAAIE,kBAAkB,IAAtB;;AAEA,UAAM,IAAIC,QAAQ,CAAlB,EAAqBA,QAAQZ,UAAUl7G,MAAvC,EAA+C87G,OAA/C,EAA0D;;AAEzD,UAAKvB,qBAAsBqB,GAAG1/F,CAAzB,EAA4Bg/F,UAAWY,KAAX,EAAmB5/F,CAA/C,CAAL,EAA0D;;AAEzD,WAAKs/F,SAASM,KAAd,EAAsBP,SAAS36G,IAAT,CAAe,EAAEm7G,OAAOP,IAAT,EAAeQ,KAAKF,KAApB,EAA2BlsB,MAAM+rB,IAAjC,EAAf;AACtB,WAAKE,eAAL,EAAuB;;AAEtBA,0BAAkB,KAAlB;AACAZ,yBAAkBa,KAAlB,EAA0Bl7G,IAA1B,CAAgCg7G,EAAhC;AAEA,QALD,MAKO;;AAENN,oBAAY,IAAZ;AAEA;AAED;AAED;AACD,SAAKO,eAAL,EAAuB;;AAEtBZ,uBAAkBO,IAAlB,EAAyB56G,IAAzB,CAA+Bg7G,EAA/B;AAEA;AAED;AAED;AACD;AACA,OAAKL,SAASv7G,MAAT,GAAkB,CAAvB,EAA2B;;AAE1B;AACA,QAAK,CAAEs7G,SAAP,EAAmBH,gBAAgBF,gBAAhB;AAEnB;AAED;;AAED,MAAIgB,QAAJ;;AAEA,OAAM,IAAI56G,IAAI,CAAR,EAAWooB,KAAKyxF,UAAUl7G,MAAhC,EAAwCqB,IAAIooB,EAA5C,EAAgDpoB,GAAhD,EAAuD;;AAEtDi5G,cAAWY,UAAW75G,CAAX,EAAekN,CAA1B;AACAg7B,UAAO3oC,IAAP,CAAa05G,QAAb;AACA2B,cAAWd,cAAe95G,CAAf,CAAX;;AAEA,QAAM,IAAIirB,IAAI,CAAR,EAAW2gB,KAAKgvE,SAASj8G,MAA/B,EAAuCssB,IAAI2gB,EAA3C,EAA+C3gB,GAA/C,EAAsD;;AAErDguF,aAAS7oB,KAAT,CAAe7wF,IAAf,CAAqBq7G,SAAU3vF,CAAV,EAAcrQ,CAAnC;AAEA;AAED;;AAED;;AAEA,SAAOstB,MAAP;AAEA;;AAnQkC,CAApC;;AAuQA;;;;;AAMA,SAAS2yE,IAAT,CAAezzF,IAAf,EAAsB;;AAErB,MAAKloB,IAAL,GAAY,MAAZ;;AAEA,MAAKkoB,IAAL,GAAYA,IAAZ;AAEA;;AAEDppB,OAAOK,MAAP,CAAew8G,KAAK98G,SAApB,EAA+B;;AAE9By4F,SAAQ,IAFsB;;AAI9BC,iBAAgB,UAAWJ,IAAX,EAAiB9tE,IAAjB,EAAuBi3E,SAAvB,EAAmC;;AAElD,MAAKj3E,SAASlrB,SAAd,EAA0BkrB,OAAO,GAAP;AAC1B,MAAKi3E,cAAcniG,SAAnB,EAA+BmiG,YAAY,CAAZ;;AAE/B,MAAIt3D,SAAS,EAAb;AACA,MAAI4yE,QAAQC,YAAa1kB,IAAb,EAAmB9tE,IAAnB,EAAyBi3E,SAAzB,EAAoC,KAAKp4E,IAAzC,CAAZ;;AAEA,OAAM,IAAIvM,IAAI,CAAR,EAAWw+C,KAAKyhD,MAAMn8G,MAA5B,EAAoCkc,IAAIw+C,EAAxC,EAA4Cx+C,GAA5C,EAAmD;;AAElDsd,SAAMp6B,SAAN,CAAgBwB,IAAhB,CAAqBkqE,KAArB,CAA4BvhC,MAA5B,EAAoC4yE,MAAOjgG,CAAP,EAAW89F,QAAX,EAApC;AAEA;;AAED,SAAOzwE,MAAP;AAEA;;AApB6B,CAA/B;;AAwBA,SAAS6yE,WAAT,CAAsB1kB,IAAtB,EAA4B9tE,IAA5B,EAAkCi3E,SAAlC,EAA6Cp4E,IAA7C,EAAoD;;AAEnD,KAAI4zF,QAAQ7iF,MAAM2zE,IAAN,GAAa3zE,MAAM2zE,IAAN,CAAYzV,IAAZ,CAAb,GAAkC31C,OAAQ21C,IAAR,EAAe/lC,KAAf,CAAsB,EAAtB,CAA9C,CAFmD,CAEuB;AAC1E,KAAI94C,QAAQ+Q,OAAOnB,KAAKo+E,UAAxB;AACA,KAAIyV,cAAc,CAAE7zF,KAAK8jB,WAAL,CAAiBgwE,IAAjB,GAAwB9zF,KAAK8jB,WAAL,CAAiBiwE,IAAzC,GAAgD/zF,KAAKg0F,kBAAvD,IAA8E5jG,KAAhG;;AAEA,KAAIsjG,QAAQ,EAAZ;;AAEA,KAAIjxE,UAAU,CAAd;AAAA,KAAiBC,UAAU,CAA3B;;AAEA,MAAM,IAAI9pC,IAAI,CAAd,EAAiBA,IAAIg7G,MAAMr8G,MAA3B,EAAmCqB,GAAnC,EAA0C;;AAEzC,MAAIq7G,OAAOL,MAAOh7G,CAAP,CAAX;;AAEA,MAAKq7G,SAAS,IAAd,EAAqB;;AAEpBxxE,aAAU,CAAV;AACAC,cAAWmxE,WAAX;AAEA,GALD,MAKO;;AAEN,OAAIK,MAAMC,WAAYF,IAAZ,EAAkB7b,SAAlB,EAA6BhoF,KAA7B,EAAoCqyB,OAApC,EAA6CC,OAA7C,EAAsD1iB,IAAtD,CAAV;AACAyiB,cAAWyxE,IAAIzxE,OAAf;AACAixE,SAAMv7G,IAAN,CAAY+7G,IAAIhsD,IAAhB;AAEA;AAED;;AAED,QAAOwrD,KAAP;AAEA;;AAED,SAASS,UAAT,CAAqBF,IAArB,EAA2B7b,SAA3B,EAAsChoF,KAAtC,EAA6CqyB,OAA7C,EAAsDC,OAAtD,EAA+D1iB,IAA/D,EAAsE;;AAErE,KAAIo0F,QAAQp0F,KAAKq0F,MAAL,CAAaJ,IAAb,KAAuBj0F,KAAKq0F,MAAL,CAAa,GAAb,CAAnC;;AAEA,KAAK,CAAED,KAAP,EAAe;;AAEf,KAAIlsD,OAAO,IAAIkpD,SAAJ,EAAX;;AAEA,KAAI36G,CAAJ,EAAO4M,CAAP,EAAUixG,GAAV,EAAeC,GAAf,EAAoBC,IAApB,EAA0BC,IAA1B,EAAgCC,IAAhC,EAAsCC,IAAtC;;AAEA,KAAKP,MAAMt0B,CAAX,EAAe;;AAEd,MAAI80B,UAAUR,MAAMS,cAAN,KAA0BT,MAAMS,cAAN,GAAuBT,MAAMt0B,CAAN,CAAQ52B,KAAR,CAAe,GAAf,CAAjD,CAAd;;AAEA,OAAM,IAAItwD,IAAI,CAAR,EAAWC,IAAI+7G,QAAQr9G,MAA7B,EAAqCqB,IAAIC,CAAzC,GAA8C;;AAE7C,OAAIi8G,SAASF,QAASh8G,GAAT,CAAb;;AAEA,WAASk8G,MAAT;;AAEC,SAAK,GAAL;AAAU;;AAETr+G,SAAIm+G,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BqyB,OAA9B;AACAp/B,SAAIuxG,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BsyB,OAA9B;;AAEAwlB,UAAKq2C,MAAL,CAAa9nG,CAAb,EAAgB4M,CAAhB;;AAEA;;AAED,SAAK,GAAL;AAAU;;AAET5M,SAAIm+G,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BqyB,OAA9B;AACAp/B,SAAIuxG,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BsyB,OAA9B;;AAEAwlB,UAAKs2C,MAAL,CAAa/nG,CAAb,EAAgB4M,CAAhB;;AAEA;;AAED,SAAK,GAAL;AAAU;;AAETixG,WAAMM,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BqyB,OAAhC;AACA8xE,WAAMK,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BsyB,OAAhC;AACA8xE,YAAOI,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BqyB,OAAjC;AACAgyE,YAAOG,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BsyB,OAAjC;;AAEAwlB,UAAKu2C,gBAAL,CAAuB+V,IAAvB,EAA6BC,IAA7B,EAAmCH,GAAnC,EAAwCC,GAAxC;;AAEA;;AAED,SAAK,GAAL;AAAU;;AAETD,WAAMM,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BqyB,OAAhC;AACA8xE,WAAMK,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BsyB,OAAhC;AACA8xE,YAAOI,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BqyB,OAAjC;AACAgyE,YAAOG,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BsyB,OAAjC;AACAgyE,YAAOE,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BqyB,OAAjC;AACAkyE,YAAOC,QAASh8G,GAAT,IAAkBwX,KAAlB,GAA0BsyB,OAAjC;;AAEAwlB,UAAK02C,aAAL,CAAoB4V,IAApB,EAA0BC,IAA1B,EAAgCC,IAAhC,EAAsCC,IAAtC,EAA4CL,GAA5C,EAAiDC,GAAjD;;AAEA;;AA1CF;AA8CA;AAED;;AAED,QAAO,EAAE9xE,SAAS2xE,MAAMW,EAAN,GAAW3kG,KAAtB,EAA6B83C,MAAMA,IAAnC,EAAP;AAEA;;AAED;;;;AAIA,SAAS8sD,UAAT,CAAqBzgB,OAArB,EAA+B;;AAE9B,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;AAEA;;AAEDx9F,OAAOK,MAAP,CAAe+9G,WAAWr+G,SAA1B,EAAqC;;AAEpC69F,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAIzxE,QAAQ,IAAZ;;AAEA,MAAI20E,SAAS,IAAIpC,UAAJ,CAAgB,KAAKC,OAArB,CAAb;AACAmC,SAAON,OAAP,CAAgB,KAAKluC,IAArB;AACAwuC,SAAOlC,IAAP,CAAap2E,GAAb,EAAkB,UAAW6wE,IAAX,EAAkB;;AAEnC,OAAI0K,IAAJ;;AAEA,OAAI;;AAEHA,WAAO54D,KAAKc,KAAL,CAAYotD,IAAZ,CAAP;AAEA,IAJD,CAIE,OAAQvoF,CAAR,EAAY;;AAEbhB,YAAQC,IAAR,CAAc,uFAAd;AACAg0F,WAAO54D,KAAKc,KAAL,CAAYotD,KAAKygB,SAAL,CAAgB,EAAhB,EAAoBzgB,KAAK13F,MAAL,GAAc,CAAlC,CAAZ,CAAP;AAEA;;AAED,OAAI43F,OAAOptE,MAAM8f,KAAN,CAAa83D,IAAb,CAAX;;AAEA,OAAKrG,MAAL,EAAcA,OAAQnE,IAAR;AAEd,GAnBD,EAmBGoE,UAnBH,EAmBeC,OAnBf;AAqBA,EA7BmC;;AA+BpC3xD,QAAO,UAAW83D,IAAX,EAAkB;;AAExB,SAAO,IAAI8Z,IAAJ,CAAU9Z,IAAV,CAAP;AAEA,EAnCmC;;AAqCpCvD,UAAS,UAAW//F,KAAX,EAAmB;;AAE3B,OAAK6xD,IAAL,GAAY7xD,KAAZ;AACA,SAAO,IAAP;AAEA;;AA1CmC,CAArC;;AA8CA;;;;AAIA,IAAIqnB,OAAJ;;AAEA,IAAIu3F,eAAe;;AAElBt3F,aAAY,YAAY;;AAEvB,MAAKD,YAAYznB,SAAjB,EAA6B;;AAE5BynB,aAAU,KAAMkuD,OAAOqpC,YAAP,IAAuBrpC,OAAOspC,kBAApC,GAAV;AAEA;;AAED,SAAOx3F,OAAP;AAEA,EAZiB;;AAclBoc,aAAY,UAAWzjC,KAAX,EAAmB;;AAE9BqnB,YAAUrnB,KAAV;AAEA;;AAlBiB,CAAnB;;AAsBA;;;;AAIA,SAAS8+G,WAAT,CAAsB5gB,OAAtB,EAAgC;;AAE/B,MAAKA,OAAL,GAAiBA,YAAYt+F,SAAd,GAA4Bs+F,OAA5B,GAAsCH,qBAArD;AAEA;;AAEDx9F,OAAOK,MAAP,CAAek+G,YAAYx+G,SAA3B,EAAsC;;AAErC69F,OAAM,UAAWp2E,GAAX,EAAgBk1E,MAAhB,EAAwBC,UAAxB,EAAoCC,OAApC,EAA8C;;AAEnD,MAAIkD,SAAS,IAAIpC,UAAJ,CAAgB,KAAKC,OAArB,CAAb;AACAmC,SAAOL,eAAP,CAAwB,aAAxB;AACAK,SAAOlC,IAAP,CAAap2E,GAAb,EAAkB,UAAWqc,MAAX,EAAoB;;AAErC,OAAI/c,UAAUu3F,aAAat3F,UAAb,EAAd;;AAEAD,WAAQ03F,eAAR,CAAyB36E,MAAzB,EAAiC,UAAW46E,WAAX,EAAyB;;AAEzD/hB,WAAQ+hB,WAAR;AAEA,IAJD;AAMA,GAVD,EAUG9hB,UAVH,EAUeC,OAVf;AAYA;;AAlBoC,CAAtC;;AAsBA;;;;AAIA,SAAS8hB,YAAT,GAAwB;;AAEvB,MAAKx9G,IAAL,GAAY,cAAZ;;AAEA,MAAKsyE,MAAL,GAAc,CAAd;;AAEA,MAAKmrC,MAAL,GAAc,KAAd;;AAEA,MAAKtpC,OAAL,GAAe,IAAI/B,iBAAJ,EAAf;AACA,MAAK+B,OAAL,CAAazuC,MAAb,CAAoBJ,MAApB,CAA4B,CAA5B;AACA,MAAK6uC,OAAL,CAAa5vD,gBAAb,GAAgC,KAAhC;;AAEA,MAAK8vD,OAAL,GAAe,IAAIjC,iBAAJ,EAAf;AACA,MAAKiC,OAAL,CAAa3uC,MAAb,CAAoBJ,MAApB,CAA4B,CAA5B;AACA,MAAK+uC,OAAL,CAAa9vD,gBAAb,GAAgC,KAAhC;AAEA;;AAEDzlB,OAAOK,MAAP,CAAeq+G,aAAa3+G,SAA5B,EAAuC;;AAEtCye,SAAU,YAAY;;AAErB,MAAIogG,QAAJ,EAAcnrC,KAAd,EAAqBF,GAArB,EAA0BC,MAA1B,EAAkC/2D,IAAlC,EAAwCC,GAAxC,EAA6C2uB,IAA7C,EAAmDszE,MAAnD;;AAEA,MAAIE,WAAW,IAAIvsG,OAAJ,EAAf;AACA,MAAIwsG,UAAU,IAAIxsG,OAAJ,EAAd;;AAEA,SAAO,SAASkM,MAAT,CAAiByD,MAAjB,EAA0B;;AAEhC,OAAIy0B,cAAckoE,aAAa,IAAb,IAAqBnrC,UAAUxxD,OAAOwxD,KAAtC,IAA+CF,QAAQtxD,OAAOsxD,GAA9D,IACTC,WAAWvxD,OAAOuxD,MAAP,GAAgB,KAAKA,MADvB,IACiC/2D,SAASwF,OAAOxF,IADjD,IAETC,QAAQuF,OAAOvF,GAFN,IAEa2uB,SAASppB,OAAOopB,IAF7B,IAEqCszE,WAAW,KAAKA,MAFvE;;AAIA,OAAKjoE,WAAL,EAAmB;;AAElBkoE,eAAW,IAAX;AACAnrC,YAAQxxD,OAAOwxD,KAAf;AACAF,UAAMtxD,OAAOsxD,GAAb;AACAC,aAASvxD,OAAOuxD,MAAP,GAAgB,KAAKA,MAA9B;AACA/2D,WAAOwF,OAAOxF,IAAd;AACAC,UAAMuF,OAAOvF,GAAb;AACA2uB,WAAOppB,OAAOopB,IAAd;;AAEA;AACA;;AAEA,QAAInpB,mBAAmBD,OAAOC,gBAAP,CAAwB1T,KAAxB,EAAvB;AACAmwG,aAAS,KAAKA,MAAL,GAAc,CAAvB;AACA,QAAII,qBAAqBJ,SAASliG,IAAT,GAAgBg3D,KAAzC;AACA,QAAIurC,OAASviG,OAAOnd,KAAK60E,GAAL,CAAUnpE,MAAMC,OAAN,GAAgBsoE,GAAhB,GAAsB,GAAhC,CAAT,GAAmDloC,IAA9D;AACA,QAAI4zE,IAAJ,EAAUC,IAAV;;AAEA;;AAEAJ,YAAQ/uG,QAAR,CAAkB,EAAlB,IAAyB,CAAE4uG,MAA3B;AACAE,aAAS9uG,QAAT,CAAmB,EAAnB,IAA0B4uG,MAA1B;;AAEA;;AAEAM,WAAO,CAAED,IAAF,GAASxrC,MAAT,GAAkBurC,kBAAzB;AACAG,WAAOF,OAAOxrC,MAAP,GAAgBurC,kBAAvB;;AAEA78F,qBAAiBnS,QAAjB,CAA2B,CAA3B,IAAiC,IAAI0M,IAAJ,IAAayiG,OAAOD,IAApB,CAAjC;AACA/8F,qBAAiBnS,QAAjB,CAA2B,CAA3B,IAAiC,CAAEmvG,OAAOD,IAAT,KAAoBC,OAAOD,IAA3B,CAAjC;;AAEA,SAAK5pC,OAAL,CAAanzD,gBAAb,CAA8BxT,IAA9B,CAAoCwT,gBAApC;;AAEA;;AAEA+8F,WAAO,CAAED,IAAF,GAASxrC,MAAT,GAAkBurC,kBAAzB;AACAG,WAAOF,OAAOxrC,MAAP,GAAgBurC,kBAAvB;;AAEA78F,qBAAiBnS,QAAjB,CAA2B,CAA3B,IAAiC,IAAI0M,IAAJ,IAAayiG,OAAOD,IAApB,CAAjC;AACA/8F,qBAAiBnS,QAAjB,CAA2B,CAA3B,IAAiC,CAAEmvG,OAAOD,IAAT,KAAoBC,OAAOD,IAA3B,CAAjC;;AAEA,SAAK1pC,OAAL,CAAarzD,gBAAb,CAA8BxT,IAA9B,CAAoCwT,gBAApC;AAEA;;AAED,QAAKmzD,OAAL,CAAalzD,WAAb,CAAyBzT,IAAzB,CAA+BuT,OAAOE,WAAtC,EAAoD1S,QAApD,CAA8DqvG,OAA9D;AACA,QAAKvpC,OAAL,CAAapzD,WAAb,CAAyBzT,IAAzB,CAA+BuT,OAAOE,WAAtC,EAAoD1S,QAApD,CAA8DovG,QAA9D;AAEA,GAvDD;AAyDA,EAhEO;;AAF8B,CAAvC;;AAsEA;;;;;;;AAOA,SAASM,UAAT,CAAqB1iG,IAArB,EAA2BC,GAA3B,EAAgC0iG,cAAhC,EAAiD;;AAEhDt4E,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,YAAZ;;AAEA,KAAIqyE,MAAM,EAAV;AAAA,KAAcC,SAAS,CAAvB;;AAEA,KAAI6rC,WAAW,IAAI/rC,iBAAJ,CAAuBC,GAAvB,EAA4BC,MAA5B,EAAoC/2D,IAApC,EAA0CC,GAA1C,CAAf;AACA2iG,UAASnpG,EAAT,CAAYnI,GAAZ,CAAiB,CAAjB,EAAoB,CAAE,CAAtB,EAAyB,CAAzB;AACAsxG,UAASrpG,MAAT,CAAiB,IAAI3B,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAjB;AACA,MAAKzF,GAAL,CAAUywG,QAAV;;AAEA,KAAIC,WAAW,IAAIhsC,iBAAJ,CAAuBC,GAAvB,EAA4BC,MAA5B,EAAoC/2D,IAApC,EAA0CC,GAA1C,CAAf;AACA4iG,UAASppG,EAAT,CAAYnI,GAAZ,CAAiB,CAAjB,EAAoB,CAAE,CAAtB,EAAyB,CAAzB;AACAuxG,UAAStpG,MAAT,CAAiB,IAAI3B,OAAJ,CAAa,CAAE,CAAf,EAAkB,CAAlB,EAAqB,CAArB,CAAjB;AACA,MAAKzF,GAAL,CAAU0wG,QAAV;;AAEA,KAAIC,WAAW,IAAIjsC,iBAAJ,CAAuBC,GAAvB,EAA4BC,MAA5B,EAAoC/2D,IAApC,EAA0CC,GAA1C,CAAf;AACA6iG,UAASrpG,EAAT,CAAYnI,GAAZ,CAAiB,CAAjB,EAAoB,CAApB,EAAuB,CAAvB;AACAwxG,UAASvpG,MAAT,CAAiB,IAAI3B,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAjB;AACA,MAAKzF,GAAL,CAAU2wG,QAAV;;AAEA,KAAIC,WAAW,IAAIlsC,iBAAJ,CAAuBC,GAAvB,EAA4BC,MAA5B,EAAoC/2D,IAApC,EAA0CC,GAA1C,CAAf;AACA8iG,UAAStpG,EAAT,CAAYnI,GAAZ,CAAiB,CAAjB,EAAoB,CAApB,EAAuB,CAAE,CAAzB;AACAyxG,UAASxpG,MAAT,CAAiB,IAAI3B,OAAJ,CAAa,CAAb,EAAgB,CAAE,CAAlB,EAAqB,CAArB,CAAjB;AACA,MAAKzF,GAAL,CAAU4wG,QAAV;;AAEA,KAAIC,WAAW,IAAInsC,iBAAJ,CAAuBC,GAAvB,EAA4BC,MAA5B,EAAoC/2D,IAApC,EAA0CC,GAA1C,CAAf;AACA+iG,UAASvpG,EAAT,CAAYnI,GAAZ,CAAiB,CAAjB,EAAoB,CAAE,CAAtB,EAAyB,CAAzB;AACA0xG,UAASzpG,MAAT,CAAiB,IAAI3B,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,CAAjB;AACA,MAAKzF,GAAL,CAAU6wG,QAAV;;AAEA,KAAIC,WAAW,IAAIpsC,iBAAJ,CAAuBC,GAAvB,EAA4BC,MAA5B,EAAoC/2D,IAApC,EAA0CC,GAA1C,CAAf;AACAgjG,UAASxpG,EAAT,CAAYnI,GAAZ,CAAiB,CAAjB,EAAoB,CAAE,CAAtB,EAAyB,CAAzB;AACA2xG,UAAS1pG,MAAT,CAAiB,IAAI3B,OAAJ,CAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAE,CAArB,CAAjB;AACA,MAAKzF,GAAL,CAAU8wG,QAAV;;AAEA,KAAIr3F,UAAU,EAAEpD,QAAQrd,SAAV,EAAqBmd,WAAWne,YAAhC,EAA8Coe,WAAWpe,YAAzD,EAAd;;AAEA,MAAKomE,YAAL,GAAoB,IAAIjkD,qBAAJ,CAA2Bq2F,cAA3B,EAA2CA,cAA3C,EAA2D/2F,OAA3D,CAApB;AACA,MAAK2kD,YAAL,CAAkBvkD,OAAlB,CAA0BrD,IAA1B,GAAiC,YAAjC;;AAEA,MAAK5G,MAAL,GAAc,UAAWimC,QAAX,EAAqBU,KAArB,EAA6B;;AAE1C,MAAK,KAAKpe,MAAL,KAAgB,IAArB,EAA4B,KAAKpb,iBAAL;;AAE5B,MAAIqhD,eAAe,KAAKA,YAAxB;AACA,MAAItnD,kBAAkBsnD,aAAavkD,OAAb,CAAqB/C,eAA3C;;AAEAsnD,eAAavkD,OAAb,CAAqB/C,eAArB,GAAuC,KAAvC;;AAEAsnD,eAAahkD,cAAb,GAA8B,CAA9B;AACAy7B,WAASQ,MAAT,CAAiBE,KAAjB,EAAwBk6D,QAAxB,EAAkCryC,YAAlC;;AAEAA,eAAahkD,cAAb,GAA8B,CAA9B;AACAy7B,WAASQ,MAAT,CAAiBE,KAAjB,EAAwBm6D,QAAxB,EAAkCtyC,YAAlC;;AAEAA,eAAahkD,cAAb,GAA8B,CAA9B;AACAy7B,WAASQ,MAAT,CAAiBE,KAAjB,EAAwBo6D,QAAxB,EAAkCvyC,YAAlC;;AAEAA,eAAahkD,cAAb,GAA8B,CAA9B;AACAy7B,WAASQ,MAAT,CAAiBE,KAAjB,EAAwBq6D,QAAxB,EAAkCxyC,YAAlC;;AAEAA,eAAahkD,cAAb,GAA8B,CAA9B;AACAy7B,WAASQ,MAAT,CAAiBE,KAAjB,EAAwBs6D,QAAxB,EAAkCzyC,YAAlC;;AAEAA,eAAavkD,OAAb,CAAqB/C,eAArB,GAAuCA,eAAvC;;AAEAsnD,eAAahkD,cAAb,GAA8B,CAA9B;AACAy7B,WAASQ,MAAT,CAAiBE,KAAjB,EAAwBu6D,QAAxB,EAAkC1yC,YAAlC;;AAEAvoB,WAASoc,eAAT,CAA0B,IAA1B;AAEA,EA/BD;;AAiCA,MAAKrb,KAAL,GAAa,UAAWf,QAAX,EAAqBvpB,KAArB,EAA4B0G,KAA5B,EAAmC0kC,OAAnC,EAA6C;;AAEzD,MAAI0G,eAAe,KAAKA,YAAxB;;AAEA,OAAM,IAAIhrE,IAAI,CAAd,EAAiBA,IAAI,CAArB,EAAwBA,GAAxB,EAA+B;;AAE9BgrE,gBAAahkD,cAAb,GAA8BhnB,CAA9B;AACAyiD,YAASoc,eAAT,CAA0BmM,YAA1B;;AAEAvoB,YAASe,KAAT,CAAgBtqB,KAAhB,EAAuB0G,KAAvB,EAA8B0kC,OAA9B;AAEA;;AAED7hB,WAASoc,eAAT,CAA0B,IAA1B;AAEA,EAfD;AAiBA;;AAEDs+C,WAAWp/G,SAAX,GAAuBC,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAvB;AACAo/G,WAAWp/G,SAAX,CAAqB0O,WAArB,GAAmC0wG,UAAnC;;AAEA;;;;AAIA,SAASQ,aAAT,GAAyB;;AAExB74E,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,eAAZ;;AAEA,MAAK4lB,OAAL,GAAeu3F,aAAat3F,UAAb,EAAf;;AAEA,MAAK64F,IAAL,GAAY,KAAK94F,OAAL,CAAa+4F,UAAb,EAAZ;AACA,MAAKD,IAAL,CAAUE,OAAV,CAAmB,KAAKh5F,OAAL,CAAai5F,WAAhC;;AAEA,MAAKnsD,MAAL,GAAc,IAAd;AAEA;;AAED+rD,cAAc5/G,SAAd,GAA0BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAE7E0O,cAAakxG,aAFgE;;AAI7EK,WAAU,YAAY;;AAErB,SAAO,KAAKJ,IAAZ;AAEA,EAR4E;;AAU7EK,eAAc,YAAa;;AAE1B,MAAK,KAAKrsD,MAAL,KAAgB,IAArB,EAA4B;;AAE3B,QAAKgsD,IAAL,CAAUM,UAAV,CAAsB,KAAKtsD,MAA3B;AACA,QAAKA,MAAL,CAAYssD,UAAZ,CAAwB,KAAKp5F,OAAL,CAAai5F,WAArC;AACA,QAAKH,IAAL,CAAUE,OAAV,CAAmB,KAAKh5F,OAAL,CAAai5F,WAAhC;AACA,QAAKnsD,MAAL,GAAc,IAAd;AAEA;AAED,EArB4E;;AAuB7EusD,YAAW,YAAY;;AAEtB,SAAO,KAAKvsD,MAAZ;AAEA,EA3B4E;;AA6B7EwsD,YAAW,UAAW3gH,KAAX,EAAmB;;AAE7B,MAAK,KAAKm0D,MAAL,KAAgB,IAArB,EAA4B;;AAE3B,QAAKgsD,IAAL,CAAUM,UAAV,CAAsB,KAAKtsD,MAA3B;AACA,QAAKA,MAAL,CAAYssD,UAAZ,CAAwB,KAAKp5F,OAAL,CAAai5F,WAArC;AAEA,GALD,MAKO;;AAEN,QAAKH,IAAL,CAAUM,UAAV,CAAsB,KAAKp5F,OAAL,CAAai5F,WAAnC;AAEA;;AAED,OAAKnsD,MAAL,GAAcn0D,KAAd;AACA,OAAKmgH,IAAL,CAAUE,OAAV,CAAmB,KAAKlsD,MAAxB;AACA,OAAKA,MAAL,CAAYksD,OAAZ,CAAqB,KAAKh5F,OAAL,CAAai5F,WAAlC;AAEA,EA9C4E;;AAgD7EM,kBAAiB,YAAY;;AAE5B,SAAO,KAAKT,IAAL,CAAUA,IAAV,CAAengH,KAAtB;AAEA,EApD4E;;AAsD7E6gH,kBAAiB,UAAW7gH,KAAX,EAAmB;;AAEnC,OAAKmgH,IAAL,CAAUA,IAAV,CAAeW,eAAf,CAAgC9gH,KAAhC,EAAuC,KAAKqnB,OAAL,CAAa05F,WAApD,EAAiE,IAAjE;AAEA,EA1D4E;;AA4D7E70F,oBAAqB,YAAY;;AAEhC,MAAInR,WAAW,IAAInG,OAAJ,EAAf;AACA,MAAIoG,aAAa,IAAIqC,UAAJ,EAAjB;AACA,MAAItD,QAAQ,IAAInF,OAAJ,EAAZ;;AAEA,MAAI0iE,cAAc,IAAI1iE,OAAJ,EAAlB;;AAEA,SAAO,SAASsX,iBAAT,CAA4Boe,KAA5B,EAAoC;;AAE1CjD,YAAS/mC,SAAT,CAAmB4rB,iBAAnB,CAAqC5qB,IAArC,CAA2C,IAA3C,EAAiDgpC,KAAjD;;AAEA,OAAI5oC,WAAW,KAAK2lB,OAAL,CAAa3lB,QAA5B;AACA,OAAI+U,KAAK,KAAKA,EAAd;;AAEA,QAAKiM,WAAL,CAAiBtG,SAAjB,CAA4BrB,QAA5B,EAAsCC,UAAtC,EAAkDjB,KAAlD;;AAEAu9D,eAAYhpE,GAAZ,CAAiB,CAAjB,EAAoB,CAApB,EAAuB,CAAE,CAAzB,EAA6BuT,eAA7B,CAA8C7G,UAA9C;;AAEA,OAAKtZ,SAASs/G,SAAd,EAA0B;;AAEzBt/G,aAASs/G,SAAT,CAAmBC,cAAnB,CAAmClmG,SAAS3a,CAA5C,EAA+C,KAAKinB,OAAL,CAAa05F,WAA5D;AACAr/G,aAASw/G,SAAT,CAAmBD,cAAnB,CAAmClmG,SAAS/N,CAA5C,EAA+C,KAAKqa,OAAL,CAAa05F,WAA5D;AACAr/G,aAASy/G,SAAT,CAAmBF,cAAnB,CAAmClmG,SAASrG,CAA5C,EAA+C,KAAK2S,OAAL,CAAa05F,WAA5D;AACAr/G,aAAS0/G,QAAT,CAAkBH,cAAlB,CAAkC3pC,YAAYl3E,CAA9C,EAAiD,KAAKinB,OAAL,CAAa05F,WAA9D;AACAr/G,aAAS2/G,QAAT,CAAkBJ,cAAlB,CAAkC3pC,YAAYtqE,CAA9C,EAAiD,KAAKqa,OAAL,CAAa05F,WAA9D;AACAr/G,aAAS4/G,QAAT,CAAkBL,cAAlB,CAAkC3pC,YAAY5iE,CAA9C,EAAiD,KAAK2S,OAAL,CAAa05F,WAA9D;AACAr/G,aAAS6/G,GAAT,CAAaN,cAAb,CAA6BxqG,GAAGrW,CAAhC,EAAmC,KAAKinB,OAAL,CAAa05F,WAAhD;AACAr/G,aAAS8/G,GAAT,CAAaP,cAAb,CAA6BxqG,GAAGzJ,CAAhC,EAAmC,KAAKqa,OAAL,CAAa05F,WAAhD;AACAr/G,aAAS+/G,GAAT,CAAaR,cAAb,CAA6BxqG,GAAG/B,CAAhC,EAAmC,KAAK2S,OAAL,CAAa05F,WAAhD;AAEA,IAZD,MAYO;;AAENr/G,aAAS2X,WAAT,CAAsB0B,SAAS3a,CAA/B,EAAkC2a,SAAS/N,CAA3C,EAA8C+N,SAASrG,CAAvD;AACAhT,aAASggH,cAAT,CAAyBpqC,YAAYl3E,CAArC,EAAwCk3E,YAAYtqE,CAApD,EAAuDsqE,YAAY5iE,CAAnE,EAAsE+B,GAAGrW,CAAzE,EAA4EqW,GAAGzJ,CAA/E,EAAkFyJ,GAAG/B,CAArF;AAEA;AAED,GA9BD;AAgCA,EAxCkB;;AA5D0D,CAApD,CAA1B;;AAwGA;;;;;AAKA,SAASitG,KAAT,CAAgBjgH,QAAhB,EAA2B;;AAE1B2lC,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKG,IAAL,GAAY,OAAZ;;AAEA,MAAK4lB,OAAL,GAAe3lB,SAAS2lB,OAAxB;;AAEA,MAAK84F,IAAL,GAAY,KAAK94F,OAAL,CAAa+4F,UAAb,EAAZ;AACA,MAAKD,IAAL,CAAUE,OAAV,CAAmB3+G,SAAS6+G,QAAT,EAAnB;;AAEA,MAAKqB,QAAL,GAAgB,KAAhB;;AAEA,MAAKx9E,MAAL,GAAc,IAAd;AACA,MAAKy9E,IAAL,GAAY,KAAZ;AACA,MAAKxR,SAAL,GAAiB,CAAjB;AACA,MAAKn+F,MAAL,GAAc,CAAd;AACA,MAAK4vG,YAAL,GAAoB,CAApB;AACA,MAAKC,SAAL,GAAiB,KAAjB;AACA,MAAKC,kBAAL,GAA0B,IAA1B;AACA,MAAKC,UAAL,GAAkB,OAAlB;;AAEA,MAAKC,OAAL,GAAe,EAAf;AAEA;;AAEDP,MAAMrhH,SAAN,GAAkBC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAf,EAAoD;;AAErE0O,cAAa2yG,KAFwD;;AAIrEQ,YAAW,YAAY;;AAEtB,SAAO,KAAKhC,IAAZ;AAEA,EARoE;;AAUrEiC,gBAAe,UAAWC,SAAX,EAAuB;;AAErC,OAAKL,kBAAL,GAA0B,KAA1B;AACA,OAAKC,UAAL,GAAkB,WAAlB;AACA,OAAK9gH,MAAL,GAAckhH,SAAd;AACA,OAAKhC,OAAL;;AAEA,SAAO,IAAP;AAEA,EAnBoE;;AAqBrEiC,wBAAuB,UAAWC,YAAX,EAA0B;;AAEhD,OAAKP,kBAAL,GAA0B,KAA1B;AACA,OAAKC,UAAL,GAAkB,WAAlB;AACA,OAAK9gH,MAAL,GAAc,KAAKkmB,OAAL,CAAam7F,wBAAb,CAAuCD,YAAvC,CAAd;AACA,OAAKlC,OAAL;;AAEA,SAAO,IAAP;AAEA,EA9BoE;;AAgCrEoC,YAAW,UAAWzD,WAAX,EAAyB;;AAEnC,OAAK56E,MAAL,GAAc46E,WAAd;AACA,OAAKiD,UAAL,GAAkB,QAAlB;;AAEA,MAAK,KAAKL,QAAV,EAAqB,KAAKc,IAAL;;AAErB,SAAO,IAAP;AAEA,EAzCoE;;AA2CrEA,OAAM,YAAY;;AAEjB,MAAK,KAAKX,SAAL,KAAmB,IAAxB,EAA+B;;AAE9B1yG,WAAQC,IAAR,CAAc,wCAAd;AACA;AAEA;;AAED,MAAK,KAAK0yG,kBAAL,KAA4B,KAAjC,EAAyC;;AAExC3yG,WAAQC,IAAR,CAAc,kDAAd;AACA;AAEA;;AAED,MAAInO,SAAS,KAAKkmB,OAAL,CAAas7F,kBAAb,EAAb;;AAEAxhH,SAAOijC,MAAP,GAAgB,KAAKA,MAArB;AACAjjC,SAAO0gH,IAAP,GAAc,KAAKA,IAAnB;AACA1gH,SAAOyhH,OAAP,GAAiB,KAAKC,OAAL,CAAa97B,IAAb,CAAmB,IAAnB,CAAjB;AACA5lF,SAAO2gH,YAAP,CAAoBb,cAApB,CAAoC,KAAKa,YAAzC,EAAuD,KAAKzR,SAA5D;AACA,OAAKA,SAAL,GAAiB,KAAKhpF,OAAL,CAAa05F,WAA9B;AACA5/G,SAAOovB,KAAP,CAAc,KAAK8/E,SAAnB,EAA8B,KAAKn+F,MAAnC;;AAEA,OAAK6vG,SAAL,GAAiB,IAAjB;;AAEA,OAAK5gH,MAAL,GAAcA,MAAd;;AAEA,SAAO,KAAKk/G,OAAL,EAAP;AAEA,EA1EoE;;AA4ErEyC,QAAO,YAAY;;AAElB,MAAK,KAAKd,kBAAL,KAA4B,KAAjC,EAAyC;;AAExC3yG,WAAQC,IAAR,CAAc,kDAAd;AACA;AAEA;;AAED,MAAK,KAAKyyG,SAAL,KAAmB,IAAxB,EAA+B;;AAE9B,QAAK5gH,MAAL,CAAYoiC,IAAZ;AACA,QAAKrxB,MAAL,IAAe,CAAE,KAAKmV,OAAL,CAAa05F,WAAb,GAA2B,KAAK1Q,SAAlC,IAAgD,KAAKyR,YAApE;AACA,QAAKC,SAAL,GAAiB,KAAjB;AAEA;;AAED,SAAO,IAAP;AAEA,EA/FoE;;AAiGrEx+E,OAAM,YAAY;;AAEjB,MAAK,KAAKy+E,kBAAL,KAA4B,KAAjC,EAAyC;;AAExC3yG,WAAQC,IAAR,CAAc,kDAAd;AACA;AAEA;;AAED,OAAKnO,MAAL,CAAYoiC,IAAZ;AACA,OAAKrxB,MAAL,GAAc,CAAd;AACA,OAAK6vG,SAAL,GAAiB,KAAjB;;AAEA,SAAO,IAAP;AAEA,EAhHoE;;AAkHrE1B,UAAS,YAAY;;AAEpB,MAAK,KAAK6B,OAAL,CAAahhH,MAAb,GAAsB,CAA3B,EAA+B;;AAE9B,QAAKC,MAAL,CAAYk/G,OAAZ,CAAqB,KAAK6B,OAAL,CAAc,CAAd,CAArB;;AAEA,QAAM,IAAI3/G,IAAI,CAAR,EAAWC,IAAI,KAAK0/G,OAAL,CAAahhH,MAAlC,EAA0CqB,IAAIC,CAA9C,EAAiDD,GAAjD,EAAwD;;AAEvD,SAAK2/G,OAAL,CAAc3/G,IAAI,CAAlB,EAAsB89G,OAAtB,CAA+B,KAAK6B,OAAL,CAAc3/G,CAAd,CAA/B;AAEA;;AAED,QAAK2/G,OAAL,CAAc,KAAKA,OAAL,CAAahhH,MAAb,GAAsB,CAApC,EAAwCm/G,OAAxC,CAAiD,KAAK8B,SAAL,EAAjD;AAEA,GAZD,MAYO;;AAEN,QAAKhhH,MAAL,CAAYk/G,OAAZ,CAAqB,KAAK8B,SAAL,EAArB;AAEA;;AAED,SAAO,IAAP;AAEA,EAxIoE;;AA0IrE1B,aAAY,YAAY;;AAEvB,MAAK,KAAKyB,OAAL,CAAahhH,MAAb,GAAsB,CAA3B,EAA+B;;AAE9B,QAAKC,MAAL,CAAYs/G,UAAZ,CAAwB,KAAKyB,OAAL,CAAc,CAAd,CAAxB;;AAEA,QAAM,IAAI3/G,IAAI,CAAR,EAAWC,IAAI,KAAK0/G,OAAL,CAAahhH,MAAlC,EAA0CqB,IAAIC,CAA9C,EAAiDD,GAAjD,EAAwD;;AAEvD,SAAK2/G,OAAL,CAAc3/G,IAAI,CAAlB,EAAsBk+G,UAAtB,CAAkC,KAAKyB,OAAL,CAAc3/G,CAAd,CAAlC;AAEA;;AAED,QAAK2/G,OAAL,CAAc,KAAKA,OAAL,CAAahhH,MAAb,GAAsB,CAApC,EAAwCu/G,UAAxC,CAAoD,KAAK0B,SAAL,EAApD;AAEA,GAZD,MAYO;;AAEN,QAAKhhH,MAAL,CAAYs/G,UAAZ,CAAwB,KAAK0B,SAAL,EAAxB;AAEA;;AAED,SAAO,IAAP;AAEA,EAhKoE;;AAkKrEY,aAAY,YAAY;;AAEvB,SAAO,KAAKb,OAAZ;AAEA,EAtKoE;;AAwKrEc,aAAY,UAAWhjH,KAAX,EAAmB;;AAE9B,MAAK,CAAEA,KAAP,EAAeA,QAAQ,EAAR;;AAEf,MAAK,KAAK+hH,SAAL,KAAmB,IAAxB,EAA+B;;AAE9B,QAAKtB,UAAL;AACA,QAAKyB,OAAL,GAAeliH,KAAf;AACA,QAAKqgH,OAAL;AAEA,GAND,MAMO;;AAEN,QAAK6B,OAAL,GAAeliH,KAAf;AAEA;;AAED,SAAO,IAAP;AAEA,EA1LoE;;AA4LrE0gH,YAAW,YAAY;;AAEtB,SAAO,KAAKqC,UAAL,GAAmB,CAAnB,CAAP;AAEA,EAhMoE;;AAkMrEpC,YAAW,UAAWxsD,MAAX,EAAoB;;AAE9B,SAAO,KAAK6uD,UAAL,CAAiB7uD,SAAS,CAAEA,MAAF,CAAT,GAAsB,EAAvC,CAAP;AAEA,EAtMoE;;AAwMrE8uD,kBAAiB,UAAWjjH,KAAX,EAAmB;;AAEnC,MAAK,KAAKgiH,kBAAL,KAA4B,KAAjC,EAAyC;;AAExC3yG,WAAQC,IAAR,CAAc,kDAAd;AACA;AAEA;;AAED,OAAKwyG,YAAL,GAAoB9hH,KAApB;;AAEA,MAAK,KAAK+hH,SAAL,KAAmB,IAAxB,EAA+B;;AAE9B,QAAK5gH,MAAL,CAAY2gH,YAAZ,CAAyBb,cAAzB,CAAyC,KAAKa,YAA9C,EAA4D,KAAKz6F,OAAL,CAAa05F,WAAzE;AAEA;;AAED,SAAO,IAAP;AAEA,EA3NoE;;AA6NrEmC,kBAAiB,YAAY;;AAE5B,SAAO,KAAKpB,YAAZ;AAEA,EAjOoE;;AAmOrEe,UAAS,YAAY;;AAEpB,OAAKd,SAAL,GAAiB,KAAjB;AAEA,EAvOoE;;AAyOrEoB,UAAS,YAAY;;AAEpB,MAAK,KAAKnB,kBAAL,KAA4B,KAAjC,EAAyC;;AAExC3yG,WAAQC,IAAR,CAAc,kDAAd;AACA,UAAO,KAAP;AAEA;;AAED,SAAO,KAAKuyG,IAAZ;AAEA,EApPoE;;AAsPrEuB,UAAS,UAAWpjH,KAAX,EAAmB;;AAE3B,MAAK,KAAKgiH,kBAAL,KAA4B,KAAjC,EAAyC;;AAExC3yG,WAAQC,IAAR,CAAc,kDAAd;AACA;AAEA;;AAED,OAAKuyG,IAAL,GAAY7hH,KAAZ;;AAEA,MAAK,KAAK+hH,SAAL,KAAmB,IAAxB,EAA+B;;AAE9B,QAAK5gH,MAAL,CAAY0gH,IAAZ,GAAmB,KAAKA,IAAxB;AAEA;;AAED,SAAO,IAAP;AAEA,EAzQoE;;AA2QrEwB,YAAW,YAAY;;AAEtB,SAAO,KAAKlD,IAAL,CAAUA,IAAV,CAAengH,KAAtB;AAEA,EA/QoE;;AAiRrEsjH,YAAW,UAAWtjH,KAAX,EAAmB;;AAE7B,OAAKmgH,IAAL,CAAUA,IAAV,CAAeW,eAAf,CAAgC9gH,KAAhC,EAAuC,KAAKqnB,OAAL,CAAa05F,WAApD,EAAiE,IAAjE;;AAEA,SAAO,IAAP;AAEA;;AAvRoE,CAApD,CAAlB;;AA2RA;;;;AAIA,SAASwC,eAAT,CAA0B7hH,QAA1B,EAAqC;;AAEpCigH,OAAMrgH,IAAN,CAAY,IAAZ,EAAkBI,QAAlB;;AAEA,MAAK8hH,MAAL,GAAc,KAAKn8F,OAAL,CAAao8F,YAAb,EAAd;AACA,MAAKD,MAAL,CAAYnD,OAAZ,CAAqB,KAAKF,IAA1B;AAEA;;AAEDoD,gBAAgBjjH,SAAhB,GAA4BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAeo7F,MAAMrhH,SAArB,CAAf,EAAiD;;AAE5E0O,cAAau0G,eAF+D;;AAI5EpB,YAAW,YAAY;;AAEtB,SAAO,KAAKqB,MAAZ;AAEA,EAR2E;;AAU5EE,iBAAgB,YAAY;;AAE3B,SAAO,KAAKF,MAAL,CAAYG,WAAnB;AAEA,EAd2E;;AAgB5EC,iBAAgB,UAAW5jH,KAAX,EAAmB;;AAElC,OAAKwjH,MAAL,CAAYG,WAAZ,GAA0B3jH,KAA1B;AAEA,EApB2E;;AAsB5E6jH,mBAAkB,YAAY;;AAE7B,SAAO,KAAKL,MAAL,CAAYM,aAAnB;AAEA,EA1B2E;;AA4B5EC,mBAAkB,UAAW/jH,KAAX,EAAmB;;AAEpC,OAAKwjH,MAAL,CAAYM,aAAZ,GAA4B9jH,KAA5B;AAEA,EAhC2E;;AAkC5EgkH,mBAAkB,YAAY;;AAE7B,SAAO,KAAKR,MAAL,CAAYS,aAAnB;AAEA,EAtC2E;;AAwC5EC,mBAAkB,UAAWlkH,KAAX,EAAmB;;AAEpC,OAAKwjH,MAAL,CAAYS,aAAZ,GAA4BjkH,KAA5B;AAEA,EA5C2E;;AA8C5EmkH,iBAAgB,YAAY;;AAE3B,SAAO,KAAKX,MAAL,CAAYY,WAAnB;AAEA,EAlD2E;;AAoD5EC,iBAAgB,UAAWrkH,KAAX,EAAmB;;AAElC,OAAKwjH,MAAL,CAAYY,WAAZ,GAA0BpkH,KAA1B;AAEA,EAxD2E;;AA0D5EksB,oBAAqB,YAAY;;AAEhC,MAAInR,WAAW,IAAInG,OAAJ,EAAf;;AAEA,SAAO,SAASsX,iBAAT,CAA4Boe,KAA5B,EAAoC;;AAE1CjD,YAAS/mC,SAAT,CAAmB4rB,iBAAnB,CAAqC5qB,IAArC,CAA2C,IAA3C,EAAiDgpC,KAAjD;;AAEAvvB,YAASkJ,qBAAT,CAAgC,KAAKvB,WAArC;;AAEA,QAAK8gG,MAAL,CAAYnqG,WAAZ,CAAyB0B,SAAS3a,CAAlC,EAAqC2a,SAAS/N,CAA9C,EAAiD+N,SAASrG,CAA1D;AAEA,GARD;AAUA,EAdkB;;AA1DyD,CAAjD,CAA5B;;AA6EA;;;;AAIA,SAAS4vG,aAAT,CAAwBC,KAAxB,EAA+BC,OAA/B,EAAyC;;AAExC,MAAKC,QAAL,GAAgBF,MAAMl9F,OAAN,CAAcq9F,cAAd,EAAhB;AACA,MAAKD,QAAL,CAAcD,OAAd,GAAwBA,YAAY5kH,SAAZ,GAAwB4kH,OAAxB,GAAkC,IAA1D;;AAEA,MAAK76F,IAAL,GAAY,IAAI0b,UAAJ,CAAgB,KAAKo/E,QAAL,CAAcE,iBAA9B,CAAZ;;AAEAJ,OAAMpC,SAAN,GAAkB9B,OAAlB,CAA2B,KAAKoE,QAAhC;AAEA;;AAEDlkH,OAAOK,MAAP,CAAe0jH,cAAchkH,SAA7B,EAAwC;;AAEvCskH,mBAAkB,YAAY;;AAE7B,OAAKH,QAAL,CAAcI,oBAAd,CAAoC,KAAKl7F,IAAzC;;AAEA,SAAO,KAAKA,IAAZ;AAEA,EARsC;;AAUvCm7F,sBAAqB,YAAY;;AAEhC,MAAI9kH,QAAQ,CAAZ;AAAA,MAAe2pB,OAAO,KAAKi7F,gBAAL,EAAtB;;AAEA,OAAM,IAAIriH,IAAI,CAAd,EAAiBA,IAAIonB,KAAKzoB,MAA1B,EAAkCqB,GAAlC,EAAyC;;AAExCvC,YAAS2pB,KAAMpnB,CAAN,CAAT;AAEA;;AAED,SAAOvC,QAAQ2pB,KAAKzoB,MAApB;AAEA;;AAtBsC,CAAxC;;AA0BA;;;;;;;;;;AAUA,SAAS6jH,aAAT,CAAwBC,OAAxB,EAAiCnV,QAAjC,EAA2C5E,SAA3C,EAAuD;;AAEtD,MAAK+Z,OAAL,GAAeA,OAAf;AACA,MAAK/Z,SAAL,GAAiBA,SAAjB;;AAEA,KAAIlnE,aAAaW,YAAjB;AAAA,KACCugF,WADD;;AAGA,SAASpV,QAAT;;AAEC,OAAK,YAAL;AACCoV,iBAAc,KAAKC,MAAnB;AACA;;AAED,OAAK,QAAL;AACA,OAAK,MAAL;AACCnhF,gBAAarJ,KAAb;AACAuqF,iBAAc,KAAKE,OAAnB;AACA;;AAED;AACCF,iBAAc,KAAKG,KAAnB;;AAbF;;AAiBA,MAAKhhF,MAAL,GAAc,IAAIL,UAAJ,CAAgBknE,YAAY,CAA5B,CAAd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAKoa,gBAAL,GAAwBJ,WAAxB;;AAEA,MAAKK,gBAAL,GAAwB,CAAxB;;AAEA,MAAKC,QAAL,GAAgB,CAAhB;AACA,MAAKC,cAAL,GAAsB,CAAtB;AAEA;;AAEDjlH,OAAOK,MAAP,CAAemkH,cAAczkH,SAA7B,EAAwC;;AAEvC;AACAmlH,aAAY,UAAWC,SAAX,EAAsBngB,MAAtB,EAA+B;;AAE1C;AACA;;AAEA,MAAInhE,SAAS,KAAKA,MAAlB;AAAA,MACC87C,SAAS,KAAK+qB,SADf;AAAA,MAEC/4F,SAASwzG,YAAYxlC,MAAZ,GAAqBA,MAF/B;AAAA,MAICylC,gBAAgB,KAAKL,gBAJtB;;AAMA,MAAKK,kBAAkB,CAAvB,EAA2B;;AAE1B;;AAEA,QAAM,IAAIpjH,IAAI,CAAd,EAAiBA,MAAM29E,MAAvB,EAA+B,EAAG39E,CAAlC,EAAsC;;AAErC6hC,WAAQlyB,SAAS3P,CAAjB,IAAuB6hC,OAAQ7hC,CAAR,CAAvB;AAEA;;AAEDojH,mBAAgBpgB,MAAhB;AAEA,GAZD,MAYO;;AAEN;;AAEAogB,oBAAiBpgB,MAAjB;AACA,OAAIqgB,MAAMrgB,SAASogB,aAAnB;AACA,QAAKN,gBAAL,CAAuBjhF,MAAvB,EAA+BlyB,MAA/B,EAAuC,CAAvC,EAA0C0zG,GAA1C,EAA+C1lC,MAA/C;AAEA;;AAED,OAAKolC,gBAAL,GAAwBK,aAAxB;AAEA,EAtCsC;;AAwCvC;AACA35C,QAAO,UAAW05C,SAAX,EAAuB;;AAE7B,MAAIxlC,SAAS,KAAK+qB,SAAlB;AAAA,MACC7mE,SAAS,KAAKA,MADf;AAAA,MAEClyB,SAASwzG,YAAYxlC,MAAZ,GAAqBA,MAF/B;AAAA,MAICqlB,SAAS,KAAK+f,gBAJf;AAAA,MAMCN,UAAU,KAAKA,OANhB;;AAQA,OAAKM,gBAAL,GAAwB,CAAxB;;AAEA,MAAK/f,SAAS,CAAd,EAAkB;;AAEjB;;AAEA,OAAIsgB,sBAAsB3lC,SAAS,CAAnC;;AAEA,QAAKmlC,gBAAL,CACCjhF,MADD,EACSlyB,MADT,EACiB2zG,mBADjB,EACsC,IAAItgB,MAD1C,EACkDrlB,MADlD;AAGA;;AAED,OAAM,IAAI39E,IAAI29E,MAAR,EAAgB7vE,IAAI6vE,SAASA,MAAnC,EAA2C39E,MAAM8N,CAAjD,EAAoD,EAAG9N,CAAvD,EAA2D;;AAE1D,OAAK6hC,OAAQ7hC,CAAR,MAAgB6hC,OAAQ7hC,IAAI29E,MAAZ,CAArB,EAA4C;;AAE3C;;AAEA8kC,YAAQ/3D,QAAR,CAAkB7oB,MAAlB,EAA0BlyB,MAA1B;AACA;AAEA;AAED;AAED,EA7EsC;;AA+EvC;AACA4zG,oBAAmB,YAAY;;AAE9B,MAAId,UAAU,KAAKA,OAAnB;;AAEA,MAAI5gF,SAAS,KAAKA,MAAlB;AAAA,MACC87C,SAAS,KAAK+qB,SADf;AAAA,MAGC4a,sBAAsB3lC,SAAS,CAHhC;;AAKA8kC,UAAQe,QAAR,CAAkB3hF,MAAlB,EAA0ByhF,mBAA1B;;AAEA;AACA,OAAM,IAAItjH,IAAI29E,MAAR,EAAgB7vE,IAAIw1G,mBAA1B,EAA+CtjH,MAAM8N,CAArD,EAAwD,EAAG9N,CAA3D,EAA+D;;AAE9D6hC,UAAQ7hC,CAAR,IAAc6hC,OAAQyhF,sBAAwBtjH,IAAI29E,MAApC,CAAd;AAEA;;AAED,OAAKolC,gBAAL,GAAwB,CAAxB;AAEA,EApGsC;;AAsGvC;AACAU,uBAAsB,YAAY;;AAEjC,MAAIH,sBAAsB,KAAK5a,SAAL,GAAiB,CAA3C;AACA,OAAK+Z,OAAL,CAAa/3D,QAAb,CAAuB,KAAK7oB,MAA5B,EAAoCyhF,mBAApC;AAEA,EA5GsC;;AA+GvC;;AAEAV,UAAS,UAAW/gF,MAAX,EAAmBxmB,SAAnB,EAA8BqxF,SAA9B,EAAyChiG,CAAzC,EAA4CizE,MAA5C,EAAqD;;AAE7D,MAAKjzE,KAAK,GAAV,EAAgB;;AAEf,QAAM,IAAI1K,IAAI,CAAd,EAAiBA,MAAM29E,MAAvB,EAA+B,EAAG39E,CAAlC,EAAsC;;AAErC6hC,WAAQxmB,YAAYrb,CAApB,IAA0B6hC,OAAQ6qE,YAAY1sG,CAApB,CAA1B;AAEA;AAED;AAED,EA7HsC;;AA+HvC2iH,SAAQ,UAAW9gF,MAAX,EAAmBxmB,SAAnB,EAA8BqxF,SAA9B,EAAyChiG,CAAzC,EAA6C;;AAEpDoQ,aAAWK,SAAX,CAAsB0mB,MAAtB,EAA8BxmB,SAA9B,EAAyCwmB,MAAzC,EAAiDxmB,SAAjD,EAA4DwmB,MAA5D,EAAoE6qE,SAApE,EAA+EhiG,CAA/E;AAEA,EAnIsC;;AAqIvCm4G,QAAO,UAAWhhF,MAAX,EAAmBxmB,SAAnB,EAA8BqxF,SAA9B,EAAyChiG,CAAzC,EAA4CizE,MAA5C,EAAqD;;AAE3D,MAAIzwE,IAAI,IAAIxC,CAAZ;;AAEA,OAAM,IAAI1K,IAAI,CAAd,EAAiBA,MAAM29E,MAAvB,EAA+B,EAAG39E,CAAlC,EAAsC;;AAErC,OAAIirB,IAAI5P,YAAYrb,CAApB;;AAEA6hC,UAAQ5W,CAAR,IAAc4W,OAAQ5W,CAAR,IAAc/d,CAAd,GAAkB20B,OAAQ6qE,YAAY1sG,CAApB,IAA0B0K,CAA1D;AAEA;AAED;;AAjJsC,CAAxC;;AAqJA;;;;;;;;;;AAUA;AACA,IAAIg5G,oBAAoB,eAAxB;;AAEA,SAASC,SAAT,CAAoBC,WAApB,EAAiCt0D,IAAjC,EAAuCu0D,kBAAvC,EAA4D;;AAE3D,KAAIC,aAAaD,sBAAsBE,gBAAgBC,cAAhB,CAAgC10D,IAAhC,CAAvC;;AAEA,MAAK20D,YAAL,GAAoBL,WAApB;AACA,MAAKM,SAAL,GAAiBN,YAAYO,UAAZ,CAAwB70D,IAAxB,EAA8Bw0D,UAA9B,CAAjB;AAEA;;AAED9lH,OAAOK,MAAP,CAAeslH,UAAU5lH,SAAzB,EAAoC;;AAEnCylH,WAAU,UAAW1jH,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEpC,OAAK60E,IAAL,GAFoC,CAEvB;;AAEb,MAAI4/B,kBAAkB,KAAKH,YAAL,CAAkBI,eAAxC;AAAA,MACC5B,UAAU,KAAKyB,SAAL,CAAgBE,eAAhB,CADX;;AAGA;AACA,MAAK3B,YAAYplH,SAAjB,EAA6BolH,QAAQe,QAAR,CAAkB1jH,KAAlB,EAAyB6P,MAAzB;AAE7B,EAZkC;;AAcnC+6C,WAAU,UAAW5qD,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEpC,MAAI20G,WAAW,KAAKJ,SAApB;;AAEA,OAAM,IAAIlkH,IAAI,KAAKikH,YAAL,CAAkBI,eAA1B,EACFp6G,IAAIq6G,SAAS3lH,MADjB,EACyBqB,MAAMiK,CAD/B,EACkC,EAAGjK,CADrC,EACyC;;AAExCskH,YAAUtkH,CAAV,EAAc0qD,QAAd,CAAwB5qD,KAAxB,EAA+B6P,MAA/B;AAEA;AAED,EAzBkC;;AA2BnC60E,OAAM,YAAY;;AAEjB,MAAI8/B,WAAW,KAAKJ,SAApB;;AAEA,OAAM,IAAIlkH,IAAI,KAAKikH,YAAL,CAAkBI,eAA1B,EACFp6G,IAAIq6G,SAAS3lH,MADjB,EACyBqB,MAAMiK,CAD/B,EACkC,EAAGjK,CADrC,EACyC;;AAExCskH,YAAUtkH,CAAV,EAAcwkF,IAAd;AAEA;AAED,EAtCkC;;AAwCnC+/B,SAAQ,YAAY;;AAEnB,MAAID,WAAW,KAAKJ,SAApB;;AAEA,OAAM,IAAIlkH,IAAI,KAAKikH,YAAL,CAAkBI,eAA1B,EACFp6G,IAAIq6G,SAAS3lH,MADjB,EACyBqB,MAAMiK,CAD/B,EACkC,EAAGjK,CADrC,EACyC;;AAExCskH,YAAUtkH,CAAV,EAAcukH,MAAd;AAEA;AAED;;AAnDkC,CAApC;;AAwDA,SAASR,eAAT,CAA0BS,QAA1B,EAAoCl1D,IAApC,EAA0Cw0D,UAA1C,EAAuD;;AAEtD,MAAKx0D,IAAL,GAAYA,IAAZ;AACA,MAAKw0D,UAAL,GAAkBA,cAAcC,gBAAgBC,cAAhB,CAAgC10D,IAAhC,CAAhC;;AAEA,MAAKjmC,IAAL,GAAY06F,gBAAgBU,QAAhB,CAA0BD,QAA1B,EAAoC,KAAKV,UAAL,CAAgBY,QAApD,KAAkEF,QAA9E;;AAEA,MAAKA,QAAL,GAAgBA,QAAhB;AAEA;;AAEDxmH,OAAOK,MAAP,CAAe0lH,eAAf,EAAgC;;AAE/BJ,YAAWA,SAFoB;;AAI/B3/F,SAAQ,UAAW2gG,IAAX,EAAiBr1D,IAAjB,EAAuBw0D,UAAvB,EAAoC;;AAE3C,MAAK,EAAIa,QAAQA,KAAKC,sBAAjB,CAAL,EAAiD;;AAEhD,UAAO,IAAIb,eAAJ,CAAqBY,IAArB,EAA2Br1D,IAA3B,EAAiCw0D,UAAjC,CAAP;AAEA,GAJD,MAIO;;AAEN,UAAO,IAAIC,gBAAgBJ,SAApB,CAA+BgB,IAA/B,EAAqCr1D,IAArC,EAA2Cw0D,UAA3C,CAAP;AAEA;AAED,EAhB8B;;AAkB/B;;;;;;;AAOAe,mBAAoB,YAAY;;AAE/B,MAAIC,aAAa,IAAIC,MAAJ,CAAY,MAAMrB,iBAAN,GAA0B,GAAtC,EAA2C,GAA3C,CAAjB;;AAEA,SAAO,SAASmB,gBAAT,CAA2BzhG,IAA3B,EAAkC;;AAExC,UAAOA,KAAKgvC,OAAL,CAAc,KAAd,EAAqB,GAArB,EAA2BA,OAA3B,CAAoC0yD,UAApC,EAAgD,EAAhD,CAAP;AAEA,GAJD;AAMA,EAVmB,EAzBW;;AAqC/Bd,iBAAgB,YAAY;;AAE3B;AACA;AACA;AACA,MAAIgB,WAAW,OAAOtB,iBAAP,GAA2B,GAA1C;AACA,MAAIuB,gBAAgB,OAAOvB,kBAAkBtxD,OAAlB,CAA2B,KAA3B,EAAkC,EAAlC,CAAP,GAAgD,GAApE;;AAEA;AACA;AACA,MAAI8yD,cAAc,kBAAkBtmH,MAAlB,CAAyBwzD,OAAzB,CAAkC,IAAlC,EAAwC4yD,QAAxC,CAAlB;;AAEA;AACA,MAAIG,SAAS,WAAWvmH,MAAX,CAAkBwzD,OAAlB,CAA2B,MAA3B,EAAmC6yD,aAAnC,CAAb;;AAEA;AACA;AACA,MAAIG,WAAW,4BAA4BxmH,MAA5B,CAAmCwzD,OAAnC,CAA4C,IAA5C,EAAkD4yD,QAAlD,CAAf;;AAEA;AACA;AACA,MAAIK,aAAa,uBAAuBzmH,MAAvB,CAA8BwzD,OAA9B,CAAuC,IAAvC,EAA6C4yD,QAA7C,CAAjB;;AAEA,MAAIM,UAAU,IAAIP,MAAJ,CAAY,KACvB,GADuB,GAEvBG,WAFuB,GAGvBC,MAHuB,GAIvBC,QAJuB,GAKvBC,UALuB,GAMvB,GANW,CAAd;;AASA,MAAIE,uBAAuB,CAAE,UAAF,EAAc,WAAd,EAA2B,OAA3B,CAA3B;;AAEA,SAAO,SAASvB,cAAT,CAAyB5T,SAAzB,EAAqC;;AAE3C,OAAIoV,UAAUF,QAAQrsF,IAAR,CAAcm3E,SAAd,CAAd;;AAEA,OAAK,CAAEoV,OAAP,EAAiB;;AAEhB,UAAM,IAAIl5G,KAAJ,CAAW,8CAA8C8jG,SAAzD,CAAN;AAEA;;AAED,OAAIqV,UAAU;AACb;AACAf,cAAUc,QAAS,CAAT,CAFG;AAGbE,gBAAYF,QAAS,CAAT,CAHC;AAIbG,iBAAaH,QAAS,CAAT,CAJA;AAKblV,kBAAckV,QAAS,CAAT,CALD,EAKe;AAC5BI,mBAAeJ,QAAS,CAAT;AANF,IAAd;;AASA,OAAIK,UAAUJ,QAAQf,QAAR,IAAoBe,QAAQf,QAAR,CAAiBrP,WAAjB,CAA8B,GAA9B,CAAlC;;AAEA,OAAKwQ,YAAYxoH,SAAZ,IAAyBwoH,YAAY,CAAE,CAA5C,EAAgD;;AAE/C,QAAIH,aAAaD,QAAQf,QAAR,CAAiB5N,SAAjB,CAA4B+O,UAAU,CAAtC,CAAjB;;AAEA;AACA;AACA;AACA;AACA,QAAKN,qBAAqBjmH,OAArB,CAA8BomH,UAA9B,MAA+C,CAAE,CAAtD,EAA0D;;AAEzDD,aAAQf,QAAR,GAAmBe,QAAQf,QAAR,CAAiB5N,SAAjB,CAA4B,CAA5B,EAA+B+O,OAA/B,CAAnB;AACAJ,aAAQC,UAAR,GAAqBA,UAArB;AAEA;AAED;;AAED,OAAKD,QAAQnV,YAAR,KAAyB,IAAzB,IAAiCmV,QAAQnV,YAAR,CAAqB3xG,MAArB,KAAgC,CAAtE,EAA0E;;AAEzE,UAAM,IAAI2N,KAAJ,CAAW,iEAAiE8jG,SAA5E,CAAN;AAEA;;AAED,UAAOqV,OAAP;AAEA,GA9CD;AAgDA,EAlFe,EArCe;;AAyH/BhB,WAAU,UAAWE,IAAX,EAAiBD,QAAjB,EAA4B;;AAErC,MAAK,CAAEA,QAAF,IAAcA,aAAa,EAA3B,IAAiCA,aAAa,MAA9C,IAAwDA,aAAa,GAArE,IAA4EA,aAAa,CAAE,CAA3F,IAAgGA,aAAaC,KAAKvhG,IAAlH,IAA0HshG,aAAaC,KAAKh7G,IAAjJ,EAAwJ;;AAEvJ,UAAOg7G,IAAP;AAEA;;AAED;AACA,MAAKA,KAAKjtD,QAAV,EAAqB;;AAEpB,OAAImsB,OAAO8gC,KAAKjtD,QAAL,CAAcusB,aAAd,CAA6BygC,QAA7B,CAAX;;AAEA,OAAK7gC,SAASxmF,SAAd,EAA0B;;AAEzB,WAAOwmF,IAAP;AAEA;AAED;;AAED;AACA,MAAK8gC,KAAK3/E,QAAV,EAAqB;;AAEpB,OAAI8gF,oBAAoB,UAAW9gF,QAAX,EAAsB;;AAE7C,SAAM,IAAIhlC,IAAI,CAAd,EAAiBA,IAAIglC,SAASrmC,MAA9B,EAAsCqB,GAAtC,EAA6C;;AAE5C,SAAI+lH,YAAY/gF,SAAUhlC,CAAV,CAAhB;;AAEA,SAAK+lH,UAAU3iG,IAAV,KAAmBshG,QAAnB,IAA+BqB,UAAUp8G,IAAV,KAAmB+6G,QAAvD,EAAkE;;AAEjE,aAAOqB,SAAP;AAEA;;AAED,SAAI7mD,SAAS4mD,kBAAmBC,UAAU/gF,QAA7B,CAAb;;AAEA,SAAKk6B,MAAL,EAAc,OAAOA,MAAP;AAEd;;AAED,WAAO,IAAP;AAEA,IApBD;;AAsBA,OAAI8mD,cAAcF,kBAAmBnB,KAAK3/E,QAAxB,CAAlB;;AAEA,OAAKghF,WAAL,EAAmB;;AAElB,WAAOA,WAAP;AAEA;AAED;;AAED,SAAO,IAAP;AAEA;;AAnL8B,CAAhC;;AAuLAhoH,OAAOK,MAAP,CAAe0lH,gBAAgBhmH,SAA/B,EAA0C,EAAE;;AAE3C;AACAkoH,wBAAuB,YAAY,CAAE,CAHI;AAIzCC,wBAAuB,YAAY,CAAE,CAJI;;AAMzCC,cAAa;AACZC,UAAQ,CADI;AAEZC,eAAa,CAFD;AAGZC,gBAAc,CAHF;AAIZC,kBAAgB;AAJJ,EAN4B;;AAazCC,aAAY;AACXC,QAAM,CADK;AAEXC,eAAa,CAFF;AAGXC,0BAAwB;AAHb,EAb6B;;AAmBzCC,sBAAqB,CAEpB,SAASC,eAAT,CAA0BhlF,MAA1B,EAAkClyB,MAAlC,EAA2C;;AAE1CkyB,SAAQlyB,MAAR,IAAmB,KAAK0Z,IAAL,CAAW,KAAKinF,YAAhB,CAAnB;AAEA,EANmB,EAQpB,SAASwW,cAAT,CAAyBjlF,MAAzB,EAAiClyB,MAAjC,EAA0C;;AAEzC,MAAI/Q,SAAS,KAAKmoH,gBAAlB;;AAEA,OAAM,IAAI/mH,IAAI,CAAR,EAAWiK,IAAIrL,OAAOD,MAA5B,EAAoCqB,MAAMiK,CAA1C,EAA6C,EAAGjK,CAAhD,EAAoD;;AAEnD6hC,UAAQlyB,QAAR,IAAsB/Q,OAAQoB,CAAR,CAAtB;AAEA;AAED,EAlBmB,EAoBpB,SAASgnH,qBAAT,CAAgCnlF,MAAhC,EAAwClyB,MAAxC,EAAiD;;AAEhDkyB,SAAQlyB,MAAR,IAAmB,KAAKo3G,gBAAL,CAAuB,KAAKnB,aAA5B,CAAnB;AAEA,EAxBmB,EA0BpB,SAASqB,gBAAT,CAA2BplF,MAA3B,EAAmClyB,MAAnC,EAA4C;;AAE3C,OAAKo3G,gBAAL,CAAsBn3G,OAAtB,CAA+BiyB,MAA/B,EAAuClyB,MAAvC;AAEA,EA9BmB,CAnBoB;;AAqDzCu3G,mCAAkC,CAEjC;AACC;;AAEA,UAASC,eAAT,CAA0BtlF,MAA1B,EAAkClyB,MAAlC,EAA2C;;AAE1C,OAAKy3G,YAAL,CAAmB,KAAK9W,YAAxB,IAAyCzuE,OAAQlyB,MAAR,CAAzC;AAEA,EAPF,EASC,SAAS03G,8BAAT,CAAyCxlF,MAAzC,EAAiDlyB,MAAjD,EAA0D;;AAEzD,OAAKy3G,YAAL,CAAmB,KAAK9W,YAAxB,IAAyCzuE,OAAQlyB,MAAR,CAAzC;AACA,OAAKy3G,YAAL,CAAkB1yE,WAAlB,GAAgC,IAAhC;AAEA,EAdF,EAgBC,SAAS4yE,yCAAT,CAAoDzlF,MAApD,EAA4DlyB,MAA5D,EAAqE;;AAEpE,OAAKy3G,YAAL,CAAmB,KAAK9W,YAAxB,IAAyCzuE,OAAQlyB,MAAR,CAAzC;AACA,OAAKy3G,YAAL,CAAkB7hF,sBAAlB,GAA2C,IAA3C;AAEA,EArBF,CAFiC,EAyB9B;;AAEF;;AAEA,UAASgiF,cAAT,CAAyB1lF,MAAzB,EAAiClyB,MAAjC,EAA0C;;AAEzC,MAAI63G,OAAO,KAAKT,gBAAhB;;AAEA,OAAM,IAAI/mH,IAAI,CAAR,EAAWiK,IAAIu9G,KAAK7oH,MAA1B,EAAkCqB,MAAMiK,CAAxC,EAA2C,EAAGjK,CAA9C,EAAkD;;AAEjDwnH,QAAMxnH,CAAN,IAAY6hC,OAAQlyB,QAAR,CAAZ;AAEA;AAED,EAdC,EAgBF,SAAS83G,6BAAT,CAAwC5lF,MAAxC,EAAgDlyB,MAAhD,EAAyD;;AAExD,MAAI63G,OAAO,KAAKT,gBAAhB;;AAEA,OAAM,IAAI/mH,IAAI,CAAR,EAAWiK,IAAIu9G,KAAK7oH,MAA1B,EAAkCqB,MAAMiK,CAAxC,EAA2C,EAAGjK,CAA9C,EAAkD;;AAEjDwnH,QAAMxnH,CAAN,IAAY6hC,OAAQlyB,QAAR,CAAZ;AAEA;;AAED,OAAKy3G,YAAL,CAAkB1yE,WAAlB,GAAgC,IAAhC;AAEA,EA5BC,EA8BF,SAASgzE,wCAAT,CAAmD7lF,MAAnD,EAA2DlyB,MAA3D,EAAoE;;AAEnE,MAAI63G,OAAO,KAAKT,gBAAhB;;AAEA,OAAM,IAAI/mH,IAAI,CAAR,EAAWiK,IAAIu9G,KAAK7oH,MAA1B,EAAkCqB,MAAMiK,CAAxC,EAA2C,EAAGjK,CAA9C,EAAkD;;AAEjDwnH,QAAMxnH,CAAN,IAAY6hC,OAAQlyB,QAAR,CAAZ;AAEA;;AAED,OAAKy3G,YAAL,CAAkB7hF,sBAAlB,GAA2C,IAA3C;AAEA,EA1CC,CAzB8B,EAqE9B;;AAEF;;AAEA,UAASoiF,qBAAT,CAAgC9lF,MAAhC,EAAwClyB,MAAxC,EAAiD;;AAEhD,OAAKo3G,gBAAL,CAAuB,KAAKnB,aAA5B,IAA8C/jF,OAAQlyB,MAAR,CAA9C;AAEA,EARC,EAUF,SAASi4G,oCAAT,CAA+C/lF,MAA/C,EAAuDlyB,MAAvD,EAAgE;;AAE/D,OAAKo3G,gBAAL,CAAuB,KAAKnB,aAA5B,IAA8C/jF,OAAQlyB,MAAR,CAA9C;AACA,OAAKy3G,YAAL,CAAkB1yE,WAAlB,GAAgC,IAAhC;AAEA,EAfC,EAiBF,SAASmzE,+CAAT,CAA0DhmF,MAA1D,EAAkElyB,MAAlE,EAA2E;;AAE1E,OAAKo3G,gBAAL,CAAuB,KAAKnB,aAA5B,IAA8C/jF,OAAQlyB,MAAR,CAA9C;AACA,OAAKy3G,YAAL,CAAkB7hF,sBAAlB,GAA2C,IAA3C;AAEA,EAtBC,CArE8B,EA6F9B;;AAEF;;AAEA,UAASuiF,kBAAT,CAA6BjmF,MAA7B,EAAqClyB,MAArC,EAA8C;;AAE7C,OAAKo3G,gBAAL,CAAsBr3G,SAAtB,CAAiCmyB,MAAjC,EAAyClyB,MAAzC;AAEA,EARC,EAUF,SAASo4G,iCAAT,CAA4ClmF,MAA5C,EAAoDlyB,MAApD,EAA6D;;AAE5D,OAAKo3G,gBAAL,CAAsBr3G,SAAtB,CAAiCmyB,MAAjC,EAAyClyB,MAAzC;AACA,OAAKy3G,YAAL,CAAkB1yE,WAAlB,GAAgC,IAAhC;AAEA,EAfC,EAiBF,SAASszE,4CAAT,CAAuDnmF,MAAvD,EAA+DlyB,MAA/D,EAAwE;;AAEvE,OAAKo3G,gBAAL,CAAsBr3G,SAAtB,CAAiCmyB,MAAjC,EAAyClyB,MAAzC;AACA,OAAKy3G,YAAL,CAAkB7hF,sBAAlB,GAA2C,IAA3C;AAEA,EAtBC,CA7F8B,CArDO;;AA8KzCi+E,WAAU,SAASyE,gBAAT,CAA2BC,WAA3B,EAAwCv4G,MAAxC,EAAiD;;AAE1D,OAAK60E,IAAL;AACA,OAAKg/B,QAAL,CAAe0E,WAAf,EAA4Bv4G,MAA5B;;AAEA;AACA;AACA;AACA;AACA;AAEA,EAzLwC;;AA2LzC+6C,WAAU,SAASu9D,gBAAT,CAA2BE,WAA3B,EAAwCx4G,MAAxC,EAAiD;;AAE1D,OAAK60E,IAAL;AACA,OAAK95B,QAAL,CAAey9D,WAAf,EAA4Bx4G,MAA5B;AAEA,EAhMwC;;AAkMzC;AACA60E,OAAM,YAAY;;AAEjB,MAAI4iC,eAAe,KAAK/9F,IAAxB;AAAA,MACCy6F,aAAa,KAAKA,UADnB;AAAA,MAGC4B,aAAa5B,WAAW4B,UAHzB;AAAA,MAICpV,eAAewT,WAAWxT,YAJ3B;AAAA,MAKCsV,gBAAgB9B,WAAW8B,aAL5B;;AAOA,MAAK,CAAEwB,YAAP,EAAsB;;AAErBA,kBAAerD,gBAAgBU,QAAhB,CAA0B,KAAKD,QAA/B,EAAyCV,WAAWY,QAApD,KAAkE,KAAKF,QAAtF;;AAEA,QAAKn7F,IAAL,GAAY+9F,YAAZ;AAEA;;AAED;AACA,OAAK5D,QAAL,GAAgB,KAAKyC,qBAArB;AACA,OAAKv7D,QAAL,GAAgB,KAAKw7D,qBAArB;;AAEA;AACA,MAAK,CAAEkB,YAAP,EAAsB;;AAErBt6G,WAAQyD,KAAR,CAAe,6DAA6D,KAAK++C,IAAlE,GAAyE,wBAAxF;AACA;AAEA;;AAED,MAAKo2D,UAAL,EAAkB;;AAEjB,OAAIC,cAAc7B,WAAW6B,WAA7B;;AAEA;AACA,WAASD,UAAT;;AAEC,SAAK,WAAL;;AAEC,SAAK,CAAE0B,aAAa1+E,QAApB,EAA+B;;AAE9B57B,cAAQyD,KAAR,CAAe,mFAAf,EAAoG,IAApG;AACA;AAEA;;AAED,SAAK,CAAE62G,aAAa1+E,QAAb,CAAsBT,SAA7B,EAAyC;;AAExCn7B,cAAQyD,KAAR,CAAe,6GAAf,EAA8H,IAA9H;AACA;AAEA;;AAED62G,oBAAeA,aAAa1+E,QAAb,CAAsBT,SAArC;;AAEA;;AAED,SAAK,OAAL;;AAEC,SAAK,CAAEm/E,aAAa1vD,QAApB,EAA+B;;AAE9B5qD,cAAQyD,KAAR,CAAe,gFAAf,EAAiG,IAAjG;AACA;AAEA;;AAED;AACA;;AAEA62G,oBAAeA,aAAa1vD,QAAb,CAAsBC,KAArC;;AAEA;AACA,UAAM,IAAI33D,IAAI,CAAd,EAAiBA,IAAIonH,aAAazoH,MAAlC,EAA0CqB,GAA1C,EAAiD;;AAEhD,UAAKonH,aAAcpnH,CAAd,EAAkBojB,IAAlB,KAA2BuiG,WAAhC,EAA8C;;AAE7CA,qBAAc3lH,CAAd;AACA;AAEA;AAED;;AAED;;AAED;;AAEC,SAAKonH,aAAc1B,UAAd,MAA+BroH,SAApC,EAAgD;;AAE/CyP,cAAQyD,KAAR,CAAe,sEAAf,EAAuF,IAAvF;AACA;AAEA;;AAED62G,oBAAeA,aAAc1B,UAAd,CAAf;;AA3DF;;AAgEA,OAAKC,gBAAgBtoH,SAArB,EAAiC;;AAEhC,QAAK+pH,aAAczB,WAAd,MAAgCtoH,SAArC,EAAiD;;AAEhDyP,aAAQyD,KAAR,CAAe,uFAAf,EAAwG,IAAxG,EAA8G62G,YAA9G;AACA;AAEA;;AAEDA,mBAAeA,aAAczB,WAAd,CAAf;AAEA;AAED;;AAED;AACA,MAAIyC,eAAehB,aAAc9W,YAAd,CAAnB;;AAEA,MAAK8X,iBAAiB/qH,SAAtB,EAAkC;;AAEjC,OAAIqnH,WAAWZ,WAAWY,QAA1B;;AAEA53G,WAAQyD,KAAR,CAAe,iEAAiEm0G,QAAjE,GACd,GADc,GACRpU,YADQ,GACO,wBADtB,EACgD8W,YADhD;AAEA;AAEA;;AAED;AACA,MAAIiB,aAAa,KAAK7B,UAAL,CAAgBC,IAAjC;;AAEA,MAAKW,aAAa1yE,WAAb,KAA6Br3C,SAAlC,EAA8C;AAAE;;AAE/CgrH,gBAAa,KAAK7B,UAAL,CAAgBE,WAA7B;AACA,QAAKU,YAAL,GAAoBA,YAApB;AAEA,GALD,MAKO,IAAKA,aAAa7hF,sBAAb,KAAwCloC,SAA7C,EAAyD;AAAE;;AAEjEgrH,gBAAa,KAAK7B,UAAL,CAAgBG,sBAA7B;AACA,QAAKS,YAAL,GAAoBA,YAApB;AAEA;;AAED;AACA,MAAIkB,cAAc,KAAKnC,WAAL,CAAiBC,MAAnC;;AAEA,MAAKR,kBAAkBvoH,SAAvB,EAAmC;;AAElC;;AAEA,OAAKizG,iBAAiB,uBAAtB,EAAgD;;AAE/C;;AAEA;AACA,QAAK,CAAE8W,aAAa99F,QAApB,EAA+B;;AAE9Bxc,aAAQyD,KAAR,CAAe,qGAAf,EAAsH,IAAtH;AACA;AAEA;;AAED,QAAK62G,aAAa99F,QAAb,CAAsBG,gBAA3B,EAA8C;;AAE7C,SAAK,CAAE29F,aAAa99F,QAAb,CAAsB0qB,eAA7B,EAA+C;;AAE9ClnC,cAAQyD,KAAR,CAAe,qHAAf,EAAsI,IAAtI;AACA;AAEA;;AAED,UAAM,IAAIvQ,IAAI,CAAd,EAAiBA,IAAI,KAAKqpB,IAAL,CAAUC,QAAV,CAAmB0qB,eAAnB,CAAmCx7B,QAAnC,CAA4C7Z,MAAjE,EAAyEqB,GAAzE,EAAgF;;AAE/E,UAAKonH,aAAa99F,QAAb,CAAsB0qB,eAAtB,CAAsCx7B,QAAtC,CAAgDxY,CAAhD,EAAoDojB,IAApD,KAA6DwiG,aAAlE,EAAkF;;AAEjFA,uBAAgB5lH,CAAhB;AACA;AAEA;AAED;AAGD,KArBD,MAqBO;;AAEN,SAAK,CAAEonH,aAAa99F,QAAb,CAAsBuhB,YAA7B,EAA4C;;AAE3C/9B,cAAQyD,KAAR,CAAe,kHAAf,EAAmI,IAAnI;AACA;AAEA;;AAED,UAAM,IAAIvQ,IAAI,CAAd,EAAiBA,IAAI,KAAKqpB,IAAL,CAAUC,QAAV,CAAmBuhB,YAAnB,CAAgClsC,MAArD,EAA6DqB,GAA7D,EAAoE;;AAEnE,UAAKonH,aAAa99F,QAAb,CAAsBuhB,YAAtB,CAAoC7qC,CAApC,EAAwCojB,IAAxC,KAAiDwiG,aAAtD,EAAsE;;AAErEA,uBAAgB5lH,CAAhB;AACA;AAEA;AAED;AAED;AAED;;AAEDsoH,iBAAc,KAAKnC,WAAL,CAAiBG,YAA/B;;AAEA,QAAKS,gBAAL,GAAwBqB,YAAxB;AACA,QAAKxC,aAAL,GAAqBA,aAArB;AAEA,GAlED,MAkEO,IAAKwC,aAAa14G,SAAb,KAA2BrS,SAA3B,IAAwC+qH,aAAax4G,OAAb,KAAyBvS,SAAtE,EAAkF;;AAExF;;AAEAirH,iBAAc,KAAKnC,WAAL,CAAiBI,cAA/B;;AAEA,QAAKQ,gBAAL,GAAwBqB,YAAxB;AAEA,GARM,MAQA,IAAKjwF,MAAMC,OAAN,CAAegwF,YAAf,CAAL,EAAqC;;AAE3CE,iBAAc,KAAKnC,WAAL,CAAiBE,WAA/B;;AAEA,QAAKU,gBAAL,GAAwBqB,YAAxB;AAEA,GANM,MAMA;;AAEN,QAAK9X,YAAL,GAAoBA,YAApB;AAEA;;AAED;AACA,OAAKkT,QAAL,GAAgB,KAAKoD,mBAAL,CAA0B0B,WAA1B,CAAhB;AACA,OAAK59D,QAAL,GAAgB,KAAKw8D,gCAAL,CAAuCoB,WAAvC,EAAsDD,UAAtD,CAAhB;AAEA,EA7awC;;AA+azC9D,SAAQ,YAAY;;AAEnB,OAAKl7F,IAAL,GAAY,IAAZ;;AAEA;AACA;AACA,OAAKm6F,QAAL,GAAgB,KAAK+E,iBAArB;AACA,OAAK79D,QAAL,GAAgB,KAAK89D,iBAArB;AAEA;;AAxbwC,CAA1C;;AA4bA;AACAxqH,OAAOK,MAAP,CAAe0lH,gBAAgBhmH,SAA/B,EAA0C;;AAEzC;AACAwqH,oBAAmBxE,gBAAgBhmH,SAAhB,CAA0BylH,QAHJ;AAIzCgF,oBAAmBzE,gBAAgBhmH,SAAhB,CAA0B2sD;;AAJJ,CAA1C;;AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,SAAS+9D,oBAAT,GAAgC;;AAE/B,MAAK9+G,IAAL,GAAYX,MAAMI,YAAN,EAAZ;;AAEA;AACA,MAAKwzD,QAAL,GAAgBzkC,MAAMp6B,SAAN,CAAgBgC,KAAhB,CAAsBhB,IAAtB,CAA4BL,SAA5B,CAAhB;;AAEA,MAAK2lH,eAAL,GAAuB,CAAvB,CAP+B,CAOH;AAC5B;;AAEA,KAAIr4E,UAAU,EAAd;AACA,MAAK08E,cAAL,GAAsB18E,OAAtB,CAX+B,CAWC;;AAEhC,MAAM,IAAIhsC,IAAI,CAAR,EAAWiK,IAAIvL,UAAUC,MAA/B,EAAuCqB,MAAMiK,CAA7C,EAAgD,EAAGjK,CAAnD,EAAuD;;AAEtDgsC,UAASttC,UAAWsB,CAAX,EAAe2J,IAAxB,IAAiC3J,CAAjC;AAEA;;AAED,MAAK2oH,MAAL,GAAc,EAAd,CAnB+B,CAmBT;AACtB,MAAKC,YAAL,GAAoB,EAApB,CApB+B,CAoBJ;AAC3B,MAAK1E,SAAL,GAAiB,EAAjB,CArB+B,CAqBN;AACzB,MAAK2E,sBAAL,GAA8B,EAA9B,CAtB+B,CAsBI;;AAEnC,KAAI1/F,QAAQ,IAAZ;;AAEA,MAAK2/F,KAAL,GAAa;;AAEZnmE,WAAS;AACR,OAAIomE,KAAJ,GAAY;;AAEX,WAAO5/F,MAAMyzC,QAAN,CAAej+D,MAAtB;AAEA,IALO;AAMR,OAAIqqH,KAAJ,GAAY;;AAEX,WAAO,KAAKD,KAAL,GAAa5/F,MAAMk7F,eAA1B;AAEA;AAVO,GAFG;AAcZ,MAAI4E,iBAAJ,GAAwB;;AAEvB,UAAO9/F,MAAM+6F,SAAN,CAAgBvlH,MAAvB;AAEA;;AAlBW,EAAb;AAsBA;;AAEDX,OAAOK,MAAP,CAAeoqH,qBAAqB1qH,SAApC,EAA+C;;AAE9C6mH,yBAAwB,IAFsB;;AAI9Ch4G,MAAK,YAAY;;AAEhB,MAAI+1C,UAAU,KAAKia,QAAnB;AAAA,MACCssD,WAAWvmE,QAAQhkD,MADpB;AAAA,MAECwqH,iBAAiB,KAAK9E,eAFvB;AAAA,MAGC+E,gBAAgB,KAAKV,cAHtB;AAAA,MAIC5N,QAAQ,KAAK6N,MAJd;AAAA,MAKCU,cAAc,KAAKT,YALpB;AAAA,MAMCtE,WAAW,KAAKJ,SANjB;AAAA,MAOCoF,YAAYhF,SAAS3lH,MAPtB;AAAA,MAQC4qH,cAAclsH,SARf;;AAUA,OAAM,IAAI2C,IAAI,CAAR,EAAWiK,IAAIvL,UAAUC,MAA/B,EAAuCqB,MAAMiK,CAA7C,EAAgD,EAAGjK,CAAnD,EAAuD;;AAEtD,OAAI0oB,SAAShqB,UAAWsB,CAAX,CAAb;AAAA,OACC2J,OAAO+e,OAAO/e,IADf;AAAA,OAEClL,QAAQ2qH,cAAez/G,IAAf,CAFT;;AAIA,OAAKlL,UAAUpB,SAAf,EAA2B;;AAE1B;;AAEAoB,YAAQyqH,UAAR;AACAE,kBAAez/G,IAAf,IAAwBlL,KAAxB;AACAkkD,YAAQpjD,IAAR,CAAcmpB,MAAd;;AAEA;;AAEA,SAAM,IAAIuC,IAAI,CAAR,EAAW/gB,IAAIo/G,SAArB,EAAgCr+F,MAAM/gB,CAAtC,EAAyC,EAAG+gB,CAA5C,EAAgD;;AAE/Cq5F,cAAUr5F,CAAV,EAAc1rB,IAAd,CAAoB,IAAIwkH,eAAJ,CAAqBr7F,MAArB,EAA6BoyF,MAAO7vF,CAAP,CAA7B,EAAyCo+F,YAAap+F,CAAb,CAAzC,CAApB;AAEA;AAED,IAhBD,MAgBO,IAAKxsB,QAAQ0qH,cAAb,EAA8B;;AAEpCI,kBAAc5mE,QAASlkD,KAAT,CAAd;;AAEA;;AAEA,QAAI+qH,mBAAmB,EAAGL,cAA1B;AAAA,QACCM,mBAAmB9mE,QAAS6mE,gBAAT,CADpB;;AAGAJ,kBAAeK,iBAAiB9/G,IAAhC,IAAyClL,KAAzC;AACAkkD,YAASlkD,KAAT,IAAmBgrH,gBAAnB;;AAEAL,kBAAez/G,IAAf,IAAwB6/G,gBAAxB;AACA7mE,YAAS6mE,gBAAT,IAA8B9gG,MAA9B;;AAEA;;AAEA,SAAM,IAAIuC,IAAI,CAAR,EAAW/gB,IAAIo/G,SAArB,EAAgCr+F,MAAM/gB,CAAtC,EAAyC,EAAG+gB,CAA5C,EAAgD;;AAE/C,SAAIy+F,kBAAkBpF,SAAUr5F,CAAV,CAAtB;AAAA,SACC0+F,aAAaD,gBAAiBF,gBAAjB,CADd;AAAA,SAEC/G,UAAUiH,gBAAiBjrH,KAAjB,CAFX;;AAIAirH,qBAAiBjrH,KAAjB,IAA2BkrH,UAA3B;;AAEA,SAAKlH,YAAYplH,SAAjB,EAA6B;;AAE5B;AACA;AACA;;AAEAolH,gBAAU,IAAIsB,eAAJ,CAAqBr7F,MAArB,EAA6BoyF,MAAO7vF,CAAP,CAA7B,EAAyCo+F,YAAap+F,CAAb,CAAzC,CAAV;AAEA;;AAEDy+F,qBAAiBF,gBAAjB,IAAsC/G,OAAtC;AAEA;AAED,IAvCM,MAuCA,IAAK9/D,QAASlkD,KAAT,MAAqB8qH,WAA1B,EAAwC;;AAE9Cz8G,YAAQyD,KAAR,CAAe,sEACb,mFADF;AAGA,IAlEqD,CAkEpD;AAEF,GAhFe,CAgFd;;AAEF,OAAK8zG,eAAL,GAAuB8E,cAAvB;AAEA,EAxF6C;;AA0F9C5lF,SAAQ,YAAY;;AAEnB,MAAIof,UAAU,KAAKia,QAAnB;AAAA,MACCusD,iBAAiB,KAAK9E,eADvB;AAAA,MAEC+E,gBAAgB,KAAKV,cAFtB;AAAA,MAGCpE,WAAW,KAAKJ,SAHjB;AAAA,MAICoF,YAAYhF,SAAS3lH,MAJtB;;AAMA,OAAM,IAAIqB,IAAI,CAAR,EAAWiK,IAAIvL,UAAUC,MAA/B,EAAuCqB,MAAMiK,CAA7C,EAAgD,EAAGjK,CAAnD,EAAuD;;AAEtD,OAAI0oB,SAAShqB,UAAWsB,CAAX,CAAb;AAAA,OACC2J,OAAO+e,OAAO/e,IADf;AAAA,OAEClL,QAAQ2qH,cAAez/G,IAAf,CAFT;;AAIA,OAAKlL,UAAUpB,SAAV,IAAuBoB,SAAS0qH,cAArC,EAAsD;;AAErD;;AAEA,QAAIS,kBAAkBT,gBAAtB;AAAA,QACCU,oBAAoBlnE,QAASinE,eAAT,CADrB;;AAGAR,kBAAeS,kBAAkBlgH,IAAjC,IAA0ClL,KAA1C;AACAkkD,YAASlkD,KAAT,IAAmBorH,iBAAnB;;AAEAT,kBAAez/G,IAAf,IAAwBigH,eAAxB;AACAjnE,YAASinE,eAAT,IAA6BlhG,MAA7B;;AAEA;;AAEA,SAAM,IAAIuC,IAAI,CAAR,EAAW/gB,IAAIo/G,SAArB,EAAgCr+F,MAAM/gB,CAAtC,EAAyC,EAAG+gB,CAA5C,EAAgD;;AAE/C,SAAIy+F,kBAAkBpF,SAAUr5F,CAAV,CAAtB;AAAA,SACC6+F,cAAcJ,gBAAiBE,eAAjB,CADf;AAAA,SAECnH,UAAUiH,gBAAiBjrH,KAAjB,CAFX;;AAIAirH,qBAAiBjrH,KAAjB,IAA2BqrH,WAA3B;AACAJ,qBAAiBE,eAAjB,IAAqCnH,OAArC;AAEA;AAED;AAED,GA1CkB,CA0CjB;;AAEF,OAAK4B,eAAL,GAAuB8E,cAAvB;AAEA,EAxI6C;;AA0I9C;AACAY,UAAS,YAAY;;AAEpB,MAAIpnE,UAAU,KAAKia,QAAnB;AAAA,MACCssD,WAAWvmE,QAAQhkD,MADpB;AAAA,MAECwqH,iBAAiB,KAAK9E,eAFvB;AAAA,MAGC+E,gBAAgB,KAAKV,cAHtB;AAAA,MAICpE,WAAW,KAAKJ,SAJjB;AAAA,MAKCoF,YAAYhF,SAAS3lH,MALtB;;AAOA,OAAM,IAAIqB,IAAI,CAAR,EAAWiK,IAAIvL,UAAUC,MAA/B,EAAuCqB,MAAMiK,CAA7C,EAAgD,EAAGjK,CAAnD,EAAuD;;AAEtD,OAAI0oB,SAAShqB,UAAWsB,CAAX,CAAb;AAAA,OACC2J,OAAO+e,OAAO/e,IADf;AAAA,OAEClL,QAAQ2qH,cAAez/G,IAAf,CAFT;;AAIA,OAAKlL,UAAUpB,SAAf,EAA2B;;AAE1B,WAAO+rH,cAAez/G,IAAf,CAAP;;AAEA,QAAKlL,QAAQ0qH,cAAb,EAA8B;;AAE7B;;AAEA,SAAIK,mBAAmB,EAAGL,cAA1B;AAAA,SACCM,mBAAmB9mE,QAAS6mE,gBAAT,CADpB;AAAA,SAECh6D,YAAY,EAAG05D,QAFhB;AAAA,SAGCc,aAAarnE,QAAS6M,SAAT,CAHd;;AAKA;AACA45D,mBAAeK,iBAAiB9/G,IAAhC,IAAyClL,KAAzC;AACAkkD,aAASlkD,KAAT,IAAmBgrH,gBAAnB;;AAEA;AACAL,mBAAeY,WAAWrgH,IAA1B,IAAmC6/G,gBAAnC;AACA7mE,aAAS6mE,gBAAT,IAA8BQ,UAA9B;AACArnE,aAAQ6W,GAAR;;AAEA;;AAEA,UAAM,IAAIvuC,IAAI,CAAR,EAAW/gB,IAAIo/G,SAArB,EAAgCr+F,MAAM/gB,CAAtC,EAAyC,EAAG+gB,CAA5C,EAAgD;;AAE/C,UAAIy+F,kBAAkBpF,SAAUr5F,CAAV,CAAtB;AAAA,UACC0+F,aAAaD,gBAAiBF,gBAAjB,CADd;AAAA,UAECh9B,OAAOk9B,gBAAiBl6D,SAAjB,CAFR;;AAIAk6D,sBAAiBjrH,KAAjB,IAA2BkrH,UAA3B;AACAD,sBAAiBF,gBAAjB,IAAsCh9B,IAAtC;AACAk9B,sBAAgBlwD,GAAhB;AAEA;AAED,KAhCD,MAgCO;;AAEN;;AAEA,SAAIhK,YAAY,EAAG05D,QAAnB;AAAA,SACCc,aAAarnE,QAAS6M,SAAT,CADd;;AAGA45D,mBAAeY,WAAWrgH,IAA1B,IAAmClL,KAAnC;AACAkkD,aAASlkD,KAAT,IAAmBurH,UAAnB;AACArnE,aAAQ6W,GAAR;;AAEA;;AAEA,UAAM,IAAIvuC,IAAI,CAAR,EAAW/gB,IAAIo/G,SAArB,EAAgCr+F,MAAM/gB,CAAtC,EAAyC,EAAG+gB,CAA5C,EAAgD;;AAE/C,UAAIy+F,kBAAkBpF,SAAUr5F,CAAV,CAAtB;;AAEAy+F,sBAAiBjrH,KAAjB,IAA2BirH,gBAAiBl6D,SAAjB,CAA3B;AACAk6D,sBAAgBlwD,GAAhB;AAEA;AAED,KA1DyB,CA0DxB;AAEF,IAlEqD,CAkEpD;AAEF,GA7EmB,CA6ElB;;AAEF,OAAK6qD,eAAL,GAAuB8E,cAAvB;AAEA,EA5N6C;;AA8N9C;;AAEAhF,aAAY,UAAW70D,IAAX,EAAiBw0D,UAAjB,EAA8B;;AAEzC;AACA;;AAEA,MAAImG,gBAAgB,KAAKpB,sBAAzB;AAAA,MACCpqH,QAAQwrH,cAAe36D,IAAf,CADT;AAAA,MAECg1D,WAAW,KAAKJ,SAFjB;;AAIA,MAAKzlH,UAAUpB,SAAf,EAA2B,OAAOinH,SAAU7lH,KAAV,CAAP;;AAE3B,MAAIq8G,QAAQ,KAAK6N,MAAjB;AAAA,MACCU,cAAc,KAAKT,YADpB;AAAA,MAECjmE,UAAU,KAAKia,QAFhB;AAAA,MAGCssD,WAAWvmE,QAAQhkD,MAHpB;AAAA,MAICwqH,iBAAiB,KAAK9E,eAJvB;AAAA,MAKCqF,kBAAkB,IAAIvxF,KAAJ,CAAW+wF,QAAX,CALnB;;AAOAzqH,UAAQ6lH,SAAS3lH,MAAjB;;AAEAsrH,gBAAe36D,IAAf,IAAwB7wD,KAAxB;;AAEAq8G,QAAMv7G,IAAN,CAAY+vD,IAAZ;AACA+5D,cAAY9pH,IAAZ,CAAkBukH,UAAlB;AACAQ,WAAS/kH,IAAT,CAAemqH,eAAf;;AAEA,OAAM,IAAI1pH,IAAImpH,cAAR,EAAwBl/G,IAAI04C,QAAQhkD,MAA1C,EAAkDqB,MAAMiK,CAAxD,EAA2D,EAAGjK,CAA9D,EAAkE;;AAEjE,OAAI0oB,SAASi6B,QAAS3iD,CAAT,CAAb;AACA0pH,mBAAiB1pH,CAAjB,IAAuB,IAAI+jH,eAAJ,CAAqBr7F,MAArB,EAA6B4mC,IAA7B,EAAmCw0D,UAAnC,CAAvB;AAEA;;AAED,SAAO4F,eAAP;AAEA,EAnQ6C;;AAqQ9CQ,eAAc,UAAW56D,IAAX,EAAkB;;AAE/B;AACA;;AAEA,MAAI26D,gBAAgB,KAAKpB,sBAAzB;AAAA,MACCpqH,QAAQwrH,cAAe36D,IAAf,CADT;;AAGA,MAAK7wD,UAAUpB,SAAf,EAA2B;;AAE1B,OAAIy9G,QAAQ,KAAK6N,MAAjB;AAAA,OACCU,cAAc,KAAKT,YADpB;AAAA,OAECtE,WAAW,KAAKJ,SAFjB;AAAA,OAGCiG,oBAAoB7F,SAAS3lH,MAAT,GAAkB,CAHvC;AAAA,OAICyrH,eAAe9F,SAAU6F,iBAAV,CAJhB;AAAA,OAKCE,mBAAmB/6D,KAAM66D,iBAAN,CALpB;;AAOAF,iBAAeI,gBAAf,IAAoC5rH,KAApC;;AAEA6lH,YAAU7lH,KAAV,IAAoB2rH,YAApB;AACA9F,YAAS9qD,GAAT;;AAEA6vD,eAAa5qH,KAAb,IAAuB4qH,YAAac,iBAAb,CAAvB;AACAd,eAAY7vD,GAAZ;;AAEAshD,SAAOr8G,KAAP,IAAiBq8G,MAAOqP,iBAAP,CAAjB;AACArP,SAAMthD,GAAN;AAEA;AAED;;AAnS6C,CAA/C;;AAuSA;;;;;;;;;;;AAWA,SAAS8wD,eAAT,CAA0BC,KAA1B,EAAiCpb,IAAjC,EAAuCqb,SAAvC,EAAmD;;AAElD,MAAKC,MAAL,GAAcF,KAAd;AACA,MAAKG,KAAL,GAAavb,IAAb;AACA,MAAKwb,UAAL,GAAkBH,aAAa,IAA/B;;AAEA,KAAI1b,SAASK,KAAKL,MAAlB;AAAA,KACC8b,UAAU9b,OAAOnwG,MADlB;AAAA,KAECksH,eAAe,IAAI1yF,KAAJ,CAAWyyF,OAAX,CAFhB;;AAIA,KAAIE,sBAAsB;AACzBxgB,eAAatiG,mBADY;AAEzBuiG,aAAWviG;AAFc,EAA1B;;AAKA,MAAM,IAAIhI,IAAI,CAAd,EAAiBA,MAAM4qH,OAAvB,EAAgC,EAAG5qH,CAAnC,EAAuC;;AAEtC,MAAI+qH,cAAcjc,OAAQ9uG,CAAR,EAAY0tG,iBAAZ,CAA+B,IAA/B,CAAlB;AACAmd,eAAc7qH,CAAd,IAAoB+qH,WAApB;AACAA,cAAYvhB,QAAZ,GAAuBshB,mBAAvB;AAEA;;AAED,MAAKE,oBAAL,GAA4BF,mBAA5B;;AAEA,MAAKG,aAAL,GAAqBJ,YAArB,CAzBkD,CAyBf;;AAEnC;AACA,MAAKK,iBAAL,GAAyB,IAAI/yF,KAAJ,CAAWyyF,OAAX,CAAzB;;AAEA,MAAKO,WAAL,GAAmB,IAAnB,CA9BkD,CA8BvB;AAC3B,MAAKC,iBAAL,GAAyB,IAAzB,CA/BkD,CA+BlB;;AAEhC,MAAKC,qBAAL,GAA6B,IAA7B;AACA,MAAKC,kBAAL,GAA0B,IAA1B;;AAEA,MAAKhM,IAAL,GAAY33G,UAAZ;AACA,MAAK4jH,UAAL,GAAkB,CAAE,CAApB;;AAEA;AACA;AACA,MAAKC,UAAL,GAAkB,IAAlB;;AAEA;AACA;AACA,MAAK3qF,IAAL,GAAY,CAAZ;;AAEA,MAAKgtE,SAAL,GAAiB,CAAjB;AACA,MAAK4d,mBAAL,GAA2B,CAA3B;;AAEA,MAAKzoB,MAAL,GAAc,CAAd;AACA,MAAK0oB,gBAAL,GAAwB,CAAxB;;AAEA,MAAKC,WAAL,GAAmBpkG,QAAnB,CArDkD,CAqDnB;;AAE/B,MAAKqkG,MAAL,GAAc,KAAd,CAvDkD,CAuD1B;AACxB,MAAKhiF,OAAL,GAAe,IAAf,CAxDkD,CAwD1B;;AAExB,MAAKiiF,iBAAL,GAA0B,KAA1B,CA1DkD,CA0DjB;;AAEjC,MAAKC,gBAAL,GAAyB,IAAzB,CA5DkD,CA4DlB;AAChC,MAAKC,cAAL,GAAuB,IAAvB,CA7DkD,CA6DpB;AAE9B;;AAED/tH,OAAOK,MAAP,CAAeisH,gBAAgBvsH,SAA/B,EAA0C;;AAEzC;;AAEAoiH,OAAM,YAAY;;AAEjB,OAAKsK,MAAL,CAAYuB,eAAZ,CAA6B,IAA7B;;AAEA,SAAO,IAAP;AAEA,EAVwC;;AAYzChrF,OAAM,YAAY;;AAEjB,OAAKypF,MAAL,CAAYwB,iBAAZ,CAA+B,IAA/B;;AAEA,SAAO,KAAKjiE,KAAL,EAAP;AAEA,EAlBwC;;AAoBzCA,QAAO,YAAY;;AAElB,OAAK4hE,MAAL,GAAc,KAAd;AACA,OAAKhiF,OAAL,GAAe,IAAf;;AAEA,OAAK/I,IAAL,GAAY,CAAZ,CALkB,CAKD;AACjB,OAAK0qF,UAAL,GAAkB,CAAE,CAApB,CANkB,CAMK;AACvB,OAAKC,UAAL,GAAkB,IAAlB,CAPkB,CAOM;;AAExB,SAAO,KAAKU,UAAL,GAAkBC,WAAlB,EAAP;AAEA,EA/BwC;;AAiCzCC,YAAW,YAAY;;AAEtB,SAAO,KAAKxiF,OAAL,IAAgB,CAAE,KAAKgiF,MAAvB,IAAiC,KAAK/d,SAAL,KAAmB,CAApD,IACL,KAAK2d,UAAL,KAAoB,IADf,IACuB,KAAKf,MAAL,CAAY4B,eAAZ,CAA6B,IAA7B,CAD9B;AAGA,EAtCwC;;AAwCzC;AACAC,cAAa,YAAY;;AAExB,SAAO,KAAK7B,MAAL,CAAY4B,eAAZ,CAA6B,IAA7B,CAAP;AAEA,EA7CwC;;AA+CzCE,UAAS,UAAW1rF,IAAX,EAAkB;;AAE1B,OAAK2qF,UAAL,GAAkB3qF,IAAlB;;AAEA,SAAO,IAAP;AAEA,EArDwC;;AAuDzCggF,UAAS,UAAWz8D,IAAX,EAAiBunE,WAAjB,EAA+B;;AAEvC,OAAKrM,IAAL,GAAYl7D,IAAZ;AACA,OAAKunE,WAAL,GAAmBA,WAAnB;;AAEA,SAAO,IAAP;AAEA,EA9DwC;;AAgEzC;;AAEA;AACA;AACA;AACAa,qBAAoB,UAAWxpB,MAAX,EAAoB;;AAEvC,OAAKA,MAAL,GAAcA,MAAd;;AAEA;AACA,OAAK0oB,gBAAL,GAAwB,KAAK9hF,OAAL,GAAeo5D,MAAf,GAAwB,CAAhD;;AAEA,SAAO,KAAKkpB,UAAL,EAAP;AAEA,EA9EwC;;AAgFzC;AACAO,qBAAoB,YAAY;;AAE/B,SAAO,KAAKf,gBAAZ;AAEA,EArFwC;;AAuFzCgB,SAAQ,UAAW7d,QAAX,EAAsB;;AAE7B,SAAO,KAAK8d,eAAL,CAAsB9d,QAAtB,EAAgC,CAAhC,EAAmC,CAAnC,CAAP;AAEA,EA3FwC;;AA6FzC+d,UAAS,UAAW/d,QAAX,EAAsB;;AAE9B,SAAO,KAAK8d,eAAL,CAAsB9d,QAAtB,EAAgC,CAAhC,EAAmC,CAAnC,CAAP;AAEA,EAjGwC;;AAmGzCge,gBAAe,UAAWC,aAAX,EAA0Bje,QAA1B,EAAoCke,IAApC,EAA2C;;AAEzDD,gBAAcF,OAAd,CAAuB/d,QAAvB;AACA,OAAK6d,MAAL,CAAa7d,QAAb;;AAEA,MAAKke,IAAL,EAAY;;AAEX,OAAIC,iBAAiB,KAAKtC,KAAL,CAAW7b,QAAhC;AAAA,OACCoe,kBAAkBH,cAAcpC,KAAd,CAAoB7b,QADvC;AAAA,OAGCqe,gBAAgBD,kBAAkBD,cAHnC;AAAA,OAICG,gBAAgBH,iBAAiBC,eAJlC;;AAMAH,iBAAcC,IAAd,CAAoB,GAApB,EAAyBG,aAAzB,EAAwCre,QAAxC;AACA,QAAKke,IAAL,CAAWI,aAAX,EAA0B,GAA1B,EAA+Bte,QAA/B;AAEA;;AAED,SAAO,IAAP;AAEA,EAvHwC;;AAyHzCue,cAAa,UAAWC,YAAX,EAAyBxe,QAAzB,EAAmCke,IAAnC,EAA0C;;AAEtD,SAAOM,aAAaR,aAAb,CAA4B,IAA5B,EAAkChe,QAAlC,EAA4Cke,IAA5C,CAAP;AAEA,EA7HwC;;AA+HzCb,aAAY,YAAY;;AAEvB,MAAIoB,oBAAoB,KAAKhC,kBAA7B;;AAEA,MAAKgC,sBAAsB,IAA3B,EAAkC;;AAEjC,QAAKhC,kBAAL,GAA0B,IAA1B;AACA,QAAKb,MAAL,CAAY8C,2BAAZ,CAAyCD,iBAAzC;AAEA;;AAED,SAAO,IAAP;AAEA,EA5IwC;;AA8IzC;;AAEA;AACA;AACA;AACAE,wBAAuB,UAAW3f,SAAX,EAAuB;;AAE7C,OAAKA,SAAL,GAAiBA,SAAjB;AACA,OAAK4d,mBAAL,GAA2B,KAAKG,MAAL,GAAc,CAAd,GAAkB/d,SAA7C;;AAEA,SAAO,KAAKse,WAAL,EAAP;AAEA,EA1JwC;;AA4JzC;AACAsB,wBAAuB,YAAY;;AAElC,SAAO,KAAKhC,mBAAZ;AAEA,EAjKwC;;AAmKzCiC,cAAa,UAAW7e,QAAX,EAAsB;;AAElC,OAAKhB,SAAL,GAAiB,KAAK6c,KAAL,CAAW7b,QAAX,GAAsBA,QAAvC;;AAEA,SAAO,KAAKsd,WAAL,EAAP;AAEA,EAzKwC;;AA2KzCwB,WAAU,UAAWzR,MAAX,EAAoB;;AAE7B,OAAKr7E,IAAL,GAAYq7E,OAAOr7E,IAAnB;AACA,OAAKgtE,SAAL,GAAiBqO,OAAOrO,SAAxB;;AAEA,SAAO,KAAKse,WAAL,EAAP;AAEA,EAlLwC;;AAoLzCyB,OAAM,UAAW/e,QAAX,EAAsB;;AAE3B,SAAO,KAAKke,IAAL,CAAW,KAAKtB,mBAAhB,EAAqC,CAArC,EAAwC5c,QAAxC,CAAP;AAEA,EAxLwC;;AA0LzCke,OAAM,UAAWc,cAAX,EAA2BC,YAA3B,EAAyCjf,QAAzC,EAAoD;;AAEzD,MAAI0b,QAAQ,KAAKE,MAAjB;AAAA,MAAyBsD,MAAMxD,MAAM1pF,IAArC;AAAA,MACCkqF,cAAc,KAAKM,qBADpB;AAAA,MAGCxd,YAAY,KAAKA,SAHlB;;AAKA,MAAKkd,gBAAgB,IAArB,EAA4B;;AAE3BA,iBAAcR,MAAMyD,uBAAN,EAAd;AACA,QAAK3C,qBAAL,GAA6BN,WAA7B;AAEA;;AAED,MAAIpjB,QAAQojB,YAAY1iB,kBAAxB;AAAA,MACCv/D,SAASiiF,YAAYziB,YADtB;;AAGAX,QAAO,CAAP,IAAaomB,GAAb;AACApmB,QAAO,CAAP,IAAaomB,MAAMlf,QAAnB;;AAEA/lE,SAAQ,CAAR,IAAc+kF,iBAAiBhgB,SAA/B;AACA/kE,SAAQ,CAAR,IAAcglF,eAAejgB,SAA7B;;AAEA,SAAO,IAAP;AAEA,EAnNwC;;AAqNzCse,cAAa,YAAY;;AAExB,MAAI8B,uBAAuB,KAAK5C,qBAAhC;;AAEA,MAAK4C,yBAAyB,IAA9B,EAAqC;;AAEpC,QAAK5C,qBAAL,GAA6B,IAA7B;AACA,QAAKZ,MAAL,CAAY8C,2BAAZ,CAAyCU,oBAAzC;AAEA;;AAED,SAAO,IAAP;AAEA,EAlOwC;;AAoOzC;;AAEAC,WAAU,YAAY;;AAErB,SAAO,KAAKzD,MAAZ;AAEA,EA1OwC;;AA4OzC0D,UAAS,YAAY;;AAEpB,SAAO,KAAKzD,KAAZ;AAEA,EAhPwC;;AAkPzC0D,UAAS,YAAY;;AAEpB,SAAO,KAAKzD,UAAL,IAAmB,KAAKF,MAAL,CAAY4D,KAAtC;AAEA,EAtPwC;;AAwPzC;;AAEAC,UAAS,UAAWztF,IAAX,EAAiB0tF,SAAjB,EAA4BC,aAA5B,EAA2CrL,SAA3C,EAAuD;;AAE/D;;AAEA,MAAK,CAAE,KAAKv5E,OAAZ,EAAsB;;AAErB;;AAEA,QAAK6kF,aAAL,CAAoB5tF,IAApB;AACA;AAEA;;AAED,MAAIitE,YAAY,KAAK0d,UAArB;;AAEA,MAAK1d,cAAc,IAAnB,EAA0B;;AAEzB;;AAEA,OAAI4gB,cAAc,CAAE7tF,OAAOitE,SAAT,IAAuB0gB,aAAzC;AACA,OAAKE,cAAc,CAAd,IAAmBF,kBAAkB,CAA1C,EAA8C;;AAE7C,WAF6C,CAErC;AAER;;AAED;;AAEA,QAAKhD,UAAL,GAAkB,IAAlB,CAbyB,CAaD;AACxB+C,eAAYC,gBAAgBE,WAA5B;AAEA;;AAED;;AAEAH,eAAa,KAAKI,gBAAL,CAAuB9tF,IAAvB,CAAb;AACA,MAAI+tF,WAAW,KAAKC,WAAL,CAAkBN,SAAlB,CAAf;;AAEA;AACA;;AAEA,MAAIvrB,SAAS,KAAKyrB,aAAL,CAAoB5tF,IAApB,CAAb;;AAEA,MAAKmiE,SAAS,CAAd,EAAkB;;AAEjB,OAAI6nB,eAAe,KAAKI,aAAxB;AACA,OAAI6D,iBAAiB,KAAK5D,iBAA1B;;AAEA,QAAM,IAAIjgG,IAAI,CAAR,EAAW/gB,IAAI2gH,aAAalsH,MAAlC,EAA0CssB,MAAM/gB,CAAhD,EAAmD,EAAG+gB,CAAtD,EAA0D;;AAEzD4/F,iBAAc5/F,CAAd,EAAkB09E,QAAlB,CAA4BimB,QAA5B;AACAE,mBAAgB7jG,CAAhB,EAAoBi4F,UAApB,CAAgCC,SAAhC,EAA2CngB,MAA3C;AAEA;AAED;AAED,EAnTwC;;AAqTzCyrB,gBAAe,UAAW5tF,IAAX,EAAkB;;AAEhC,MAAImiE,SAAS,CAAb;;AAEA,MAAK,KAAKp5D,OAAV,EAAoB;;AAEnBo5D,YAAS,KAAKA,MAAd;AACA,OAAI+nB,cAAc,KAAKO,kBAAvB;;AAEA,OAAKP,gBAAgB,IAArB,EAA4B;;AAE3B,QAAIgE,mBAAmBhE,YAAYpiB,QAAZ,CAAsB9nE,IAAtB,EAA8B,CAA9B,CAAvB;;AAEAmiE,cAAU+rB,gBAAV;;AAEA,QAAKluF,OAAOkqF,YAAY1iB,kBAAZ,CAAgC,CAAhC,CAAZ,EAAkD;;AAEjD,UAAK6jB,UAAL;;AAEA,SAAK6C,qBAAqB,CAA1B,EAA8B;;AAE7B;AACA,WAAKnlF,OAAL,GAAe,KAAf;AAEA;AAED;AAED;AAED;;AAED,OAAK8hF,gBAAL,GAAwB1oB,MAAxB;AACA,SAAOA,MAAP;AAEA,EAxVwC;;AA0VzC2rB,mBAAkB,UAAW9tF,IAAX,EAAkB;;AAEnC,MAAIgtE,YAAY,CAAhB;;AAEA,MAAK,CAAE,KAAK+d,MAAZ,EAAqB;;AAEpB/d,eAAY,KAAKA,SAAjB;;AAEA,OAAIkd,cAAc,KAAKM,qBAAvB;;AAEA,OAAKN,gBAAgB,IAArB,EAA4B;;AAE3B,QAAIgE,mBAAmBhE,YAAYpiB,QAAZ,CAAsB9nE,IAAtB,EAA8B,CAA9B,CAAvB;;AAEAgtE,iBAAakhB,gBAAb;;AAEA,QAAKluF,OAAOkqF,YAAY1iB,kBAAZ,CAAgC,CAAhC,CAAZ,EAAkD;;AAEjD,UAAK8jB,WAAL;;AAEA,SAAKte,cAAc,CAAnB,EAAuB;;AAEtB;AACA,WAAK+d,MAAL,GAAc,IAAd;AAEA,MALD,MAKO;;AAEN;AACA,WAAK/d,SAAL,GAAiBA,SAAjB;AAEA;AAED;AAED;AAED;;AAED,OAAK4d,mBAAL,GAA2B5d,SAA3B;AACA,SAAOA,SAAP;AAEA,EAnYwC;;AAqYzCghB,cAAa,UAAWN,SAAX,EAAuB;;AAEnC,MAAI1tF,OAAO,KAAKA,IAAL,GAAY0tF,SAAvB;;AAEA,MAAKA,cAAc,CAAnB,EAAuB,OAAO1tF,IAAP;;AAEvB,MAAIguE,WAAW,KAAK6b,KAAL,CAAW7b,QAA1B;AAAA,MAECyQ,OAAO,KAAKA,IAFb;AAAA,MAGC0P,YAAY,KAAKzD,UAHlB;;AAKA,MAAKjM,SAAS53G,QAAd,EAAyB;;AAExB,OAAKsnH,cAAc,CAAE,CAArB,EAAyB;;AAExB;;AAEA,SAAKzD,UAAL,GAAkB,CAAlB;AACA,SAAK0D,WAAL,CAAkB,IAAlB,EAAwB,IAAxB,EAA8B,KAA9B;AAEA;;AAEDC,gBAAa;;AAEZ,QAAKruF,QAAQguE,QAAb,EAAwB;;AAEvBhuE,YAAOguE,QAAP;AAEA,KAJD,MAIO,IAAKhuE,OAAO,CAAZ,EAAgB;;AAEtBA,YAAO,CAAP;AAEA,KAJM,MAIA,MAAMquF,WAAN;;AAEP,QAAK,KAAKrD,iBAAV,EAA8B,KAAKD,MAAL,GAAc,IAAd,CAA9B,KACK,KAAKhiF,OAAL,GAAe,KAAf;;AAEL,SAAK6gF,MAAL,CAAY7qH,aAAZ,CAA2B;AAC1BV,WAAM,UADoB,EACRg9G,QAAQ,IADA;AAE1BruF,gBAAW0gG,YAAY,CAAZ,GAAgB,CAAE,CAAlB,GAAsB;AAFP,KAA3B;AAKA;AAED,GAjCD,MAiCO;AAAE;;AAER,OAAIY,WAAa7P,SAAS13G,YAA1B;;AAEA,OAAKonH,cAAc,CAAE,CAArB,EAAyB;;AAExB;;AAEA,QAAKT,aAAa,CAAlB,EAAsB;;AAErBS,iBAAY,CAAZ;;AAEA,UAAKC,WAAL,CAAkB,IAAlB,EAAwB,KAAKtD,WAAL,KAAqB,CAA7C,EAAgDwD,QAAhD;AAEA,KAND,MAMO;;AAEN;AACA;AACA;;AAEA,UAAKF,WAAL,CAAkB,KAAKtD,WAAL,KAAqB,CAAvC,EAA0C,IAA1C,EAAgDwD,QAAhD;AAEA;AAED;;AAED,OAAKtuF,QAAQguE,QAAR,IAAoBhuE,OAAO,CAAhC,EAAoC;;AAEnC;;AAEA,QAAIuuF,YAAY9xH,KAAKK,KAAL,CAAYkjC,OAAOguE,QAAnB,CAAhB,CAJmC,CAIY;AAC/ChuE,YAAQguE,WAAWugB,SAAnB;;AAEAJ,iBAAa1xH,KAAKqR,GAAL,CAAUygH,SAAV,CAAb;;AAEA,QAAIC,UAAU,KAAK1D,WAAL,GAAmBqD,SAAjC;;AAEA,QAAKK,WAAW,CAAhB,EAAoB;;AAEnB;;AAEA,SAAK,KAAKxD,iBAAV,EAA8B,KAAKD,MAAL,GAAc,IAAd,CAA9B,KACK,KAAKhiF,OAAL,GAAe,KAAf;;AAEL/I,YAAO0tF,YAAY,CAAZ,GAAgB1f,QAAhB,GAA2B,CAAlC;;AAEA,UAAK4b,MAAL,CAAY7qH,aAAZ,CAA2B;AAC1BV,YAAM,UADoB,EACRg9G,QAAQ,IADA;AAE1BruF,iBAAW0gG,YAAY,CAAZ,GAAgB,CAAhB,GAAoB,CAAE;AAFP,MAA3B;AAKA,KAdD,MAcO;;AAEN;;AAEA,SAAKc,YAAY,CAAjB,EAAqB;;AAEpB;;AAEA,UAAIC,UAAUf,YAAY,CAA1B;AACA,WAAKU,WAAL,CAAkBK,OAAlB,EAA2B,CAAEA,OAA7B,EAAsCH,QAAtC;AAEA,MAPD,MAOO;;AAEN,WAAKF,WAAL,CAAkB,KAAlB,EAAyB,KAAzB,EAAgCE,QAAhC;AAEA;;AAED,UAAK5D,UAAL,GAAkByD,SAAlB;;AAEA,UAAKvE,MAAL,CAAY7qH,aAAZ,CAA2B;AAC1BV,YAAM,MADoB,EACZg9G,QAAQ,IADI,EACEkT,WAAWA;AADb,MAA3B;AAIA;AAED;;AAED,OAAKD,YAAY,CAAEH,YAAY,CAAd,MAAsB,CAAvC,EAA2C;;AAE1C;;AAEA,SAAKnuF,IAAL,GAAYA,IAAZ;AACA,WAAOguE,WAAWhuE,IAAlB;AAEA;AAED;;AAED,OAAKA,IAAL,GAAYA,IAAZ;AACA,SAAOA,IAAP;AAEA,EA7gBwC;;AA+gBzCouF,cAAa,UAAWK,OAAX,EAAoBC,KAApB,EAA2BJ,QAA3B,EAAsC;;AAElD,MAAI3lB,WAAW,KAAKwhB,oBAApB;;AAEA,MAAKmE,QAAL,EAAgB;;AAEf3lB,YAASc,WAAT,GAAwBriG,eAAxB;AACAuhG,YAASe,SAAT,GAAsBtiG,eAAtB;AAEA,GALD,MAKO;;AAEN;;AAEA,OAAKqnH,OAAL,EAAe;;AAEd9lB,aAASc,WAAT,GAAuB,KAAKwhB,gBAAL,GAAwB7jH,eAAxB,GAA0CD,mBAAjE;AAEA,IAJD,MAIO;;AAENwhG,aAASc,WAAT,GAAuBpiG,gBAAvB;AAEA;;AAED,OAAKqnH,KAAL,EAAa;;AAEZ/lB,aAASe,SAAT,GAAqB,KAAKwhB,cAAL,GAAsB9jH,eAAtB,GAAwCD,mBAA7D;AAEA,IAJD,MAIO;;AAENwhG,aAASe,SAAT,GAAuBriG,gBAAvB;AAEA;AAED;AAED,EAljBwC;;AAojBzCykH,kBAAiB,UAAW9d,QAAX,EAAqB2gB,SAArB,EAAgCC,UAAhC,EAA6C;;AAE7D,MAAIlF,QAAQ,KAAKE,MAAjB;AAAA,MAAyBsD,MAAMxD,MAAM1pF,IAArC;AAAA,MACCkqF,cAAc,KAAKO,kBADpB;;AAGA,MAAKP,gBAAgB,IAArB,EAA4B;;AAE3BA,iBAAcR,MAAMyD,uBAAN,EAAd;AACA,QAAK1C,kBAAL,GAA0BP,WAA1B;AAEA;;AAED,MAAIpjB,QAAQojB,YAAY1iB,kBAAxB;AAAA,MACCv/D,SAASiiF,YAAYziB,YADtB;;AAGAX,QAAO,CAAP,IAAaomB,GAAb,CAAsBjlF,OAAQ,CAAR,IAAc0mF,SAAd;AACtB7nB,QAAO,CAAP,IAAaomB,MAAMlf,QAAnB,CAA6B/lE,OAAQ,CAAR,IAAc2mF,UAAd;;AAE7B,SAAO,IAAP;AAEA;;AAxkBwC,CAA1C;;AA4kBA;;;;;;;;;;AAUA,SAASC,cAAT,CAAyB/K,IAAzB,EAAgC;;AAE/B,MAAK0J,KAAL,GAAa1J,IAAb;AACA,MAAKgL,kBAAL;AACA,MAAKC,UAAL,GAAkB,CAAlB;;AAEA,MAAK/uF,IAAL,GAAY,CAAZ;;AAEA,MAAKgtE,SAAL,GAAiB,GAAjB;AAEA;;AAED6hB,eAAe3xH,SAAf,GAA2BC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAehlB,gBAAgBjB,SAA/B,CAAf,EAA2D;;AAErF0O,cAAaijH,cAFwE;;AAIrFG,cAAa,UAAW3T,MAAX,EAAmB4T,eAAnB,EAAqC;;AAEjD,MAAInL,OAAOzI,OAAOyO,UAAP,IAAqB,KAAK0D,KAArC;AAAA,MACCvf,SAASoN,OAAOwO,KAAP,CAAa5b,MADvB;AAAA,MAEC8b,UAAU9b,OAAOnwG,MAFlB;AAAA,MAGC2lH,WAAWpI,OAAOgP,iBAHnB;AAAA,MAICL,eAAe3O,OAAO+O,aAJvB;AAAA,MAKC8E,WAAWpL,KAAKh7G,IALjB;AAAA,MAMCqmH,iBAAiB,KAAKC,sBANvB;AAAA,MAOCC,iBAAiBF,eAAgBD,QAAhB,CAPlB;;AASA,MAAKG,mBAAmB7yH,SAAxB,EAAoC;;AAEnC6yH,oBAAiB,EAAjB;AACAF,kBAAgBD,QAAhB,IAA6BG,cAA7B;AAEA;;AAED,OAAM,IAAIlwH,IAAI,CAAd,EAAiBA,MAAM4qH,OAAvB,EAAgC,EAAG5qH,CAAnC,EAAuC;;AAEtC,OAAIotG,QAAQ0B,OAAQ9uG,CAAR,CAAZ;AAAA,OACCowG,YAAYhD,MAAMhqF,IADnB;AAAA,OAECq/F,UAAUyN,eAAgB9f,SAAhB,CAFX;;AAIA,OAAKqS,YAAYplH,SAAjB,EAA6B;;AAE5BinH,aAAUtkH,CAAV,IAAgByiH,OAAhB;AAEA,IAJD,MAIO;;AAENA,cAAU6B,SAAUtkH,CAAV,CAAV;;AAEA,QAAKyiH,YAAYplH,SAAjB,EAA6B;;AAE5B;;AAEA,SAAKolH,QAAQ0I,WAAR,KAAwB,IAA7B,EAAoC;;AAEnC,QAAG1I,QAAQQ,cAAX;AACA,WAAKkN,mBAAL,CAA0B1N,OAA1B,EAAmCsN,QAAnC,EAA6C3f,SAA7C;AAEA;;AAED;AAEA;;AAED,QAAI9gD,OAAOwgE,mBAAmBA,gBAC7B5E,iBAD6B,CACVlrH,CADU,EACNyiH,OADM,CACEqB,UADhC;;AAGArB,cAAU,IAAID,aAAJ,CACTuB,gBAAgB//F,MAAhB,CAAwB2gG,IAAxB,EAA8BvU,SAA9B,EAAyC9gD,IAAzC,CADS,EAET89C,MAAMtF,aAFG,EAEYsF,MAAMtD,YAAN,EAFZ,CAAV;;AAIA,MAAG2Y,QAAQQ,cAAX;AACA,SAAKkN,mBAAL,CAA0B1N,OAA1B,EAAmCsN,QAAnC,EAA6C3f,SAA7C;;AAEAkU,aAAUtkH,CAAV,IAAgByiH,OAAhB;AAEA;;AAEDoI,gBAAc7qH,CAAd,EAAkBwoG,YAAlB,GAAiCia,QAAQ5gF,MAAzC;AAEA;AAED,EArEoF;;AAuErFmqF,kBAAiB,UAAW9P,MAAX,EAAoB;;AAEpC,MAAK,CAAE,KAAKmQ,eAAL,CAAsBnQ,MAAtB,CAAP,EAAwC;;AAEvC,OAAKA,OAAOiP,WAAP,KAAuB,IAA5B,EAAmC;;AAElC;AACA;;AAEA,QAAI4E,WAAW,CAAE7T,OAAOyO,UAAP,IAAqB,KAAK0D,KAA5B,EAAoC1kH,IAAnD;AAAA,QACCymH,WAAWlU,OAAOwO,KAAP,CAAa/gH,IADzB;AAAA,QAEC0mH,iBAAiB,KAAKC,cAAL,CAAqBF,QAArB,CAFlB;;AAIA,SAAKP,WAAL,CAAkB3T,MAAlB,EACCmU,kBAAkBA,eAAeE,YAAf,CAA6B,CAA7B,CADnB;;AAGA,SAAKC,kBAAL,CAAyBtU,MAAzB,EAAiCkU,QAAjC,EAA2CL,QAA3C;AAEA;;AAED,OAAIzL,WAAWpI,OAAOgP,iBAAtB;;AAEA;AACA,QAAM,IAAIlrH,IAAI,CAAR,EAAWiK,IAAIq6G,SAAS3lH,MAA9B,EAAsCqB,MAAMiK,CAA5C,EAA+C,EAAGjK,CAAlD,EAAsD;;AAErD,QAAIyiH,UAAU6B,SAAUtkH,CAAV,CAAd;;AAEA,QAAKyiH,QAAQO,QAAR,OAAwB,CAA7B,EAAiC;;AAEhC,UAAKyN,YAAL,CAAmBhO,OAAnB;AACAA,aAAQc,iBAAR;AAEA;AAED;;AAED,QAAKmN,WAAL,CAAkBxU,MAAlB;AAEA;AAED,EA/GoF;;AAiHrF+P,oBAAmB,UAAW/P,MAAX,EAAoB;;AAEtC,MAAK,KAAKmQ,eAAL,CAAsBnQ,MAAtB,CAAL,EAAsC;;AAErC,OAAIoI,WAAWpI,OAAOgP,iBAAtB;;AAEA;AACA,QAAM,IAAIlrH,IAAI,CAAR,EAAWiK,IAAIq6G,SAAS3lH,MAA9B,EAAsCqB,MAAMiK,CAA5C,EAA+C,EAAGjK,CAAlD,EAAsD;;AAErD,QAAIyiH,UAAU6B,SAAUtkH,CAAV,CAAd;;AAEA,QAAK,EAAGyiH,QAAQO,QAAX,KAAwB,CAA7B,EAAiC;;AAEhCP,aAAQgB,oBAAR;AACA,UAAKkN,gBAAL,CAAuBlO,OAAvB;AAEA;AAED;;AAED,QAAKmO,eAAL,CAAsB1U,MAAtB;AAEA;AAED,EAzIoF;;AA2IrF;;AAEAyT,qBAAoB,YAAY;;AAE/B,OAAKkB,QAAL,GAAgB,EAAhB,CAF+B,CAEX;AACpB,OAAKC,eAAL,GAAuB,CAAvB;;AAEA,OAAKR,cAAL,GAAsB,EAAtB;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAKpM,SAAL,GAAiB,EAAjB,CAb+B,CAaV;AACrB,OAAK6M,gBAAL,GAAwB,CAAxB;;AAEA,OAAKd,sBAAL,GAA8B,EAA9B,CAhB+B,CAgBG;;;AAGlC,OAAKe,oBAAL,GAA4B,EAA5B,CAnB+B,CAmBC;AAChC,OAAKC,2BAAL,GAAmC,CAAnC;;AAEA,MAAI9nG,QAAQ,IAAZ;;AAEA,OAAK2/F,KAAL,GAAa;;AAEZoI,YAAS;AACR,QAAInI,KAAJ,GAAY;;AAEX,YAAO5/F,MAAM0nG,QAAN,CAAelyH,MAAtB;AAEA,KALO;AAMR,QAAIqqH,KAAJ,GAAY;;AAEX,YAAO7/F,MAAM2nG,eAAb;AAEA;AAVO,IAFG;AAcZxM,aAAU;AACT,QAAIyE,KAAJ,GAAY;;AAEX,YAAO5/F,MAAM+6F,SAAN,CAAgBvlH,MAAvB;AAEA,KALQ;AAMT,QAAIqqH,KAAJ,GAAY;;AAEX,YAAO7/F,MAAM4nG,gBAAb;AAEA;AAVQ,IAdE;AA0BZI,wBAAqB;AACpB,QAAIpI,KAAJ,GAAY;;AAEX,YAAO5/F,MAAM6nG,oBAAN,CAA2BryH,MAAlC;AAEA,KALmB;AAMpB,QAAIqqH,KAAJ,GAAY;;AAEX,YAAO7/F,MAAM8nG,2BAAb;AAEA;AAVmB;;AA1BT,GAAb;AAyCA,EA9MoF;;AAgNrF;;AAEA5E,kBAAiB,UAAWnQ,MAAX,EAAoB;;AAEpC,MAAIz9G,QAAQy9G,OAAOiP,WAAnB;AACA,SAAO1sH,UAAU,IAAV,IAAkBA,QAAQ,KAAKqyH,eAAtC;AAEA,EAvNoF;;AAyNrFN,qBAAoB,UAAWtU,MAAX,EAAmBkU,QAAnB,EAA6BL,QAA7B,EAAwC;;AAE3D,MAAImB,UAAU,KAAKL,QAAnB;AAAA,MACCO,gBAAgB,KAAKd,cADtB;AAAA,MAECD,iBAAiBe,cAAehB,QAAf,CAFlB;;AAIA,MAAKC,mBAAmBhzH,SAAxB,EAAoC;;AAEnCgzH,oBAAiB;;AAEhBE,kBAAc,CAAErU,MAAF,CAFE;AAGhBmV,kBAAc;;AAHE,IAAjB;;AAOAnV,UAAOkP,iBAAP,GAA2B,CAA3B;;AAEAgG,iBAAehB,QAAf,IAA4BC,cAA5B;AAEA,GAbD,MAaO;;AAEN,OAAIE,eAAeF,eAAeE,YAAlC;;AAEArU,UAAOkP,iBAAP,GAA2BmF,aAAa5xH,MAAxC;AACA4xH,gBAAahxH,IAAb,CAAmB28G,MAAnB;AAEA;;AAEDA,SAAOiP,WAAP,GAAqB+F,QAAQvyH,MAA7B;AACAuyH,UAAQ3xH,IAAR,CAAc28G,MAAd;;AAEAmU,iBAAegB,YAAf,CAA6BtB,QAA7B,IAA0C7T,MAA1C;AAEA,EA1PoF;;AA4PrFoV,wBAAuB,UAAWpV,MAAX,EAAoB;;AAE1C,MAAIgV,UAAU,KAAKL,QAAnB;AAAA,MACCU,qBAAqBL,QAASA,QAAQvyH,MAAR,GAAiB,CAA1B,CADtB;AAAA,MAEC6yH,aAAatV,OAAOiP,WAFrB;;AAIAoG,qBAAmBpG,WAAnB,GAAiCqG,UAAjC;AACAN,UAASM,UAAT,IAAwBD,kBAAxB;AACAL,UAAQ13D,GAAR;;AAEA0iD,SAAOiP,WAAP,GAAqB,IAArB;;AAGA,MAAIiF,WAAWlU,OAAOwO,KAAP,CAAa/gH,IAA5B;AAAA,MACCynH,gBAAgB,KAAKd,cADtB;AAAA,MAECD,iBAAiBe,cAAehB,QAAf,CAFlB;AAAA,MAGCqB,sBAAsBpB,eAAeE,YAHtC;AAAA,MAKCmB,kBACCD,oBAAqBA,oBAAoB9yH,MAApB,GAA6B,CAAlD,CANF;AAAA,MAQCgzH,mBAAmBzV,OAAOkP,iBAR3B;;AAUAsG,kBAAgBtG,iBAAhB,GAAoCuG,gBAApC;AACAF,sBAAqBE,gBAArB,IAA0CD,eAA1C;AACAD,sBAAoBj4D,GAApB;;AAEA0iD,SAAOkP,iBAAP,GAA2B,IAA3B;;AAGA,MAAIiG,eAAehB,eAAegB,YAAlC;AAAA,MACCtB,WAAW,CAAE7T,OAAOyO,UAAP,IAAqB,KAAK0D,KAA5B,EAAoC1kH,IADhD;;AAGA,SAAO0nH,aAActB,QAAd,CAAP;;AAEA,MAAK0B,oBAAoB9yH,MAApB,KAA+B,CAApC,EAAwC;;AAEvC,UAAOyyH,cAAehB,QAAf,CAAP;AAEA;;AAED,OAAKwB,gCAAL,CAAuC1V,MAAvC;AAEA,EAvSoF;;AAySrF0V,mCAAkC,UAAW1V,MAAX,EAAoB;;AAErD,MAAIoI,WAAWpI,OAAOgP,iBAAtB;AACA,OAAM,IAAIlrH,IAAI,CAAR,EAAWiK,IAAIq6G,SAAS3lH,MAA9B,EAAsCqB,MAAMiK,CAA5C,EAA+C,EAAGjK,CAAlD,EAAsD;;AAErD,OAAIyiH,UAAU6B,SAAUtkH,CAAV,CAAd;;AAEA,OAAK,EAAGyiH,QAAQQ,cAAX,KAA8B,CAAnC,EAAuC;;AAEtC,SAAK4O,sBAAL,CAA6BpP,OAA7B;AAEA;AAED;AAED,EAxToF;;AA0TrFiO,cAAa,UAAWxU,MAAX,EAAoB;;AAEhC;AACA;AACA;AACA;AACA;;AAEA,MAAIgV,UAAU,KAAKL,QAAnB;AAAA,MACCiB,YAAY5V,OAAOiP,WADpB;AAAA,MAGC4G,kBAAkB,KAAKjB,eAAL,EAHnB;AAAA,MAKCkB,sBAAsBd,QAASa,eAAT,CALvB;;AAOA7V,SAAOiP,WAAP,GAAqB4G,eAArB;AACAb,UAASa,eAAT,IAA6B7V,MAA7B;;AAEA8V,sBAAoB7G,WAApB,GAAkC2G,SAAlC;AACAZ,UAASY,SAAT,IAAuBE,mBAAvB;AAEA,EA/UoF;;AAiVrFpB,kBAAiB,UAAW1U,MAAX,EAAoB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA,MAAIgV,UAAU,KAAKL,QAAnB;AAAA,MACCiB,YAAY5V,OAAOiP,WADpB;AAAA,MAGC8G,qBAAqB,EAAG,KAAKnB,eAH9B;AAAA,MAKCoB,mBAAmBhB,QAASe,kBAAT,CALpB;;AAOA/V,SAAOiP,WAAP,GAAqB8G,kBAArB;AACAf,UAASe,kBAAT,IAAgC/V,MAAhC;;AAEAgW,mBAAiB/G,WAAjB,GAA+B2G,SAA/B;AACAZ,UAASY,SAAT,IAAuBI,gBAAvB;AAEA,EAtWoF;;AAwWrF;;AAEA/B,sBAAqB,UAAW1N,OAAX,EAAoBsN,QAApB,EAA8B3f,SAA9B,EAA0C;;AAE9D,MAAI4f,iBAAiB,KAAKC,sBAA1B;AAAA,MACCkC,gBAAgBnC,eAAgBD,QAAhB,CADjB;AAAA,MAGCzL,WAAW,KAAKJ,SAHjB;;AAKA,MAAKiO,kBAAkB90H,SAAvB,EAAmC;;AAElC80H,mBAAgB,EAAhB;AACAnC,kBAAgBD,QAAhB,IAA6BoC,aAA7B;AAEA;;AAEDA,gBAAe/hB,SAAf,IAA6BqS,OAA7B;;AAEAA,UAAQ0I,WAAR,GAAsB7G,SAAS3lH,MAA/B;AACA2lH,WAAS/kH,IAAT,CAAekjH,OAAf;AAEA,EA7XoF;;AA+XrFoP,yBAAwB,UAAWpP,OAAX,EAAqB;;AAE5C,MAAI6B,WAAW,KAAKJ,SAApB;AAAA,MACCkO,cAAc3P,QAAQA,OADvB;AAAA,MAECsN,WAAWqC,YAAY5N,QAAZ,CAAqB76G,IAFjC;AAAA,MAGCymG,YAAYgiB,YAAY9iE,IAHzB;AAAA,MAIC0gE,iBAAiB,KAAKC,sBAJvB;AAAA,MAKCkC,gBAAgBnC,eAAgBD,QAAhB,CALjB;AAAA,MAOCsC,sBAAsB/N,SAAUA,SAAS3lH,MAAT,GAAkB,CAA5B,CAPvB;AAAA,MAQC6yH,aAAa/O,QAAQ0I,WARtB;;AAUAkH,sBAAoBlH,WAApB,GAAkCqG,UAAlC;AACAlN,WAAUkN,UAAV,IAAyBa,mBAAzB;AACA/N,WAAS9qD,GAAT;;AAEA,SAAO24D,cAAe/hB,SAAf,CAAP;;AAEAkiB,oBAAkB;;AAEjB,QAAM,IAAIC,CAAV,IAAeJ,aAAf,EAA+B,MAAMG,gBAAN,CAFd,CAEsC;;AAEvD,UAAOtC,eAAgBD,QAAhB,CAAP;AAEA;AAED,EAzZoF;;AA2ZrFU,eAAc,UAAWhO,OAAX,EAAqB;;AAElC,MAAI6B,WAAW,KAAKJ,SAApB;AAAA,MACC4N,YAAYrP,QAAQ0I,WADrB;AAAA,MAGC4G,kBAAkB,KAAKhB,gBAAL,EAHnB;AAAA,MAKCyB,uBAAuBlO,SAAUyN,eAAV,CALxB;;AAOAtP,UAAQ0I,WAAR,GAAsB4G,eAAtB;AACAzN,WAAUyN,eAAV,IAA8BtP,OAA9B;;AAEA+P,uBAAqBrH,WAArB,GAAmC2G,SAAnC;AACAxN,WAAUwN,SAAV,IAAwBU,oBAAxB;AAEA,EA1aoF;;AA4arF7B,mBAAkB,UAAWlO,OAAX,EAAqB;;AAEtC,MAAI6B,WAAW,KAAKJ,SAApB;AAAA,MACC4N,YAAYrP,QAAQ0I,WADrB;AAAA,MAGC8G,qBAAqB,EAAG,KAAKlB,gBAH9B;AAAA,MAKC0B,oBAAoBnO,SAAU2N,kBAAV,CALrB;;AAOAxP,UAAQ0I,WAAR,GAAsB8G,kBAAtB;AACA3N,WAAU2N,kBAAV,IAAiCxP,OAAjC;;AAEAgQ,oBAAkBtH,WAAlB,GAAgC2G,SAAhC;AACAxN,WAAUwN,SAAV,IAAwBW,iBAAxB;AAEA,EA3boF;;AA8brF;;AAEAzE,0BAAyB,YAAY;;AAEpC,MAAInD,eAAe,KAAKmG,oBAAxB;AAAA,MACCe,kBAAkB,KAAKd,2BAAL,EADnB;AAAA,MAEClG,cAAcF,aAAckH,eAAd,CAFf;;AAIA,MAAKhH,gBAAgB1tH,SAArB,EAAiC;;AAEhC0tH,iBAAc,IAAIzf,iBAAJ,CACb,IAAIppE,YAAJ,CAAkB,CAAlB,CADa,EACU,IAAIA,YAAJ,CAAkB,CAAlB,CADV,EAEb,CAFa,EAEV,KAAKwwF,gCAFK,CAAd;;AAIA3H,eAAY4H,YAAZ,GAA2BZ,eAA3B;AACAlH,gBAAckH,eAAd,IAAkChH,WAAlC;AAEA;;AAED,SAAOA,WAAP;AAEA,EAndoF;;AAqdrFwC,8BAA6B,UAAWxC,WAAX,EAAyB;;AAErD,MAAIF,eAAe,KAAKmG,oBAAxB;AAAA,MACCc,YAAY/G,YAAY4H,YADzB;AAAA,MAGCV,qBAAqB,EAAG,KAAKhB,2BAH9B;AAAA,MAKC2B,wBAAwB/H,aAAcoH,kBAAd,CALzB;;AAOAlH,cAAY4H,YAAZ,GAA2BV,kBAA3B;AACApH,eAAcoH,kBAAd,IAAqClH,WAArC;;AAEA6H,wBAAsBD,YAAtB,GAAqCb,SAArC;AACAjH,eAAciH,SAAd,IAA4Bc,qBAA5B;AAEA,EApeoF;;AAserFF,mCAAkC,IAAIxwF,YAAJ,CAAkB,CAAlB,CAtemD;;AAwerF;AACA;AACA;AACA2wF,aAAY,UAAW1jB,IAAX,EAAiB2jB,YAAjB,EAAgC;;AAE3C,MAAInO,OAAOmO,gBAAgB,KAAKzE,KAAhC;AAAA,MACC0B,WAAWpL,KAAKh7G,IADjB;AAAA,MAGCopH,aAAa,OAAO5jB,IAAP,KAAgB,QAAhB,GACZP,cAAca,UAAd,CAA0BkV,IAA1B,EAAgCxV,IAAhC,CADY,GAC6BA,IAJ3C;AAAA,MAMCihB,WAAW2C,eAAe,IAAf,GAAsBA,WAAWppH,IAAjC,GAAwCwlG,IANpD;AAAA,MAQCkhB,iBAAiB,KAAKC,cAAL,CAAqBF,QAArB,CARlB;AAAA,MASCN,kBAAkB,IATnB;;AAWA,MAAKO,mBAAmBhzH,SAAxB,EAAoC;;AAEnC,OAAI21H,iBACF3C,eAAegB,YAAf,CAA6BtB,QAA7B,CADF;;AAGA,OAAKiD,mBAAmB31H,SAAxB,EAAoC;;AAEnC,WAAO21H,cAAP;AAEA;;AAED;AACA;AACAlD,qBAAkBO,eAAeE,YAAf,CAA6B,CAA7B,CAAlB;;AAEA;AACA,OAAKwC,eAAe,IAApB,EACCA,aAAajD,gBAAgBpF,KAA7B;AAED;;AAED;AACA,MAAKqI,eAAe,IAApB,EAA2B,OAAO,IAAP;;AAE3B;AACA,MAAIE,YAAY,IAAI3I,eAAJ,CAAqB,IAArB,EAA2ByI,UAA3B,EAAuCD,YAAvC,CAAhB;;AAEA,OAAKjD,WAAL,CAAkBoD,SAAlB,EAA6BnD,eAA7B;;AAEA;AACA,OAAKU,kBAAL,CAAyByC,SAAzB,EAAoC7C,QAApC,EAA8CL,QAA9C;;AAEA,SAAOkD,SAAP;AAEA,EA1hBoF;;AA4hBrF;AACAD,iBAAgB,UAAW7jB,IAAX,EAAiB2jB,YAAjB,EAAgC;;AAE/C,MAAInO,OAAOmO,gBAAgB,KAAKzE,KAAhC;AAAA,MACC0B,WAAWpL,KAAKh7G,IADjB;AAAA,MAGCopH,aAAa,OAAO5jB,IAAP,KAAgB,QAAhB,GACZP,cAAca,UAAd,CAA0BkV,IAA1B,EAAgCxV,IAAhC,CADY,GAC6BA,IAJ3C;AAAA,MAMCihB,WAAW2C,aAAaA,WAAWppH,IAAxB,GAA+BwlG,IAN3C;AAAA,MAQCkhB,iBAAiB,KAAKC,cAAL,CAAqBF,QAArB,CARlB;;AAUA,MAAKC,mBAAmBhzH,SAAxB,EAAoC;;AAEnC,UAAOgzH,eAAegB,YAAf,CAA6BtB,QAA7B,KAA2C,IAAlD;AAEA;;AAED,SAAO,IAAP;AAEA,EAjjBoF;;AAmjBrF;AACAmD,gBAAe,YAAY;;AAE1B,MAAIhC,UAAU,KAAKL,QAAnB;AAAA,MACCsC,WAAW,KAAKrC,eADjB;AAAA,MAECxM,WAAW,KAAKJ,SAFjB;AAAA,MAGCoF,YAAY,KAAKyH,gBAHlB;;AAKA,OAAKD,eAAL,GAAuB,CAAvB;AACA,OAAKC,gBAAL,GAAwB,CAAxB;;AAEA,OAAM,IAAI/wH,IAAI,CAAd,EAAiBA,MAAMmzH,QAAvB,EAAiC,EAAGnzH,CAApC,EAAwC;;AAEvCkxH,WAASlxH,CAAT,EAAagqD,KAAb;AAEA;;AAED,OAAM,IAAIhqD,IAAI,CAAd,EAAiBA,MAAMspH,SAAvB,EAAkC,EAAGtpH,CAArC,EAAyC;;AAExCskH,YAAUtkH,CAAV,EAAcgjH,QAAd,GAAyB,CAAzB;AAEA;;AAED,SAAO,IAAP;AAEA,EA5kBoF;;AA8kBrF;AACAxmG,SAAQ,UAAW+xG,SAAX,EAAuB;;AAE9BA,eAAa,KAAK1gB,SAAlB;;AAEA,MAAIqjB,UAAU,KAAKL,QAAnB;AAAA,MACCsC,WAAW,KAAKrC,eADjB;AAAA,MAGCjwF,OAAO,KAAKA,IAAL,IAAa0tF,SAHrB;AAAA,MAICC,gBAAgBlxH,KAAKM,IAAL,CAAW2wH,SAAX,CAJjB;AAAA,MAMCpL,YAAY,KAAKyM,UAAL,IAAmB,CANhC;;AAQA;;AAEA,OAAM,IAAI5vH,IAAI,CAAd,EAAiBA,MAAMmzH,QAAvB,EAAiC,EAAGnzH,CAApC,EAAwC;;AAEvC,OAAIk8G,SAASgV,QAASlxH,CAAT,CAAb;;AAEAk8G,UAAOoS,OAAP,CAAgBztF,IAAhB,EAAsB0tF,SAAtB,EAAiCC,aAAjC,EAAgDrL,SAAhD;AAEA;;AAED;;AAEA,MAAImB,WAAW,KAAKJ,SAApB;AAAA,MACCoF,YAAY,KAAKyH,gBADlB;;AAGA,OAAM,IAAI/wH,IAAI,CAAd,EAAiBA,MAAMspH,SAAvB,EAAkC,EAAGtpH,CAArC,EAAyC;;AAExCskH,YAAUtkH,CAAV,EAAcypE,KAAd,CAAqB05C,SAArB;AAEA;;AAED,SAAO,IAAP;AAEA,EAlnBoF;;AAonBrF;AACAiL,UAAS,YAAY;;AAEpB,SAAO,KAAKC,KAAZ;AAEA,EAznBoF;;AA2nBrF;AACA+E,cAAa,UAAWjkB,IAAX,EAAkB;;AAE9B,MAAI+hB,UAAU,KAAKL,QAAnB;AAAA,MACCT,WAAWjhB,KAAKxlG,IADjB;AAAA,MAECynH,gBAAgB,KAAKd,cAFtB;AAAA,MAGCD,iBAAiBe,cAAehB,QAAf,CAHlB;;AAKA,MAAKC,mBAAmBhzH,SAAxB,EAAoC;;AAEnC;AACA;AACA;;AAEA,OAAIg2H,kBAAkBhD,eAAeE,YAArC;;AAEA,QAAM,IAAIvwH,IAAI,CAAR,EAAWiK,IAAIopH,gBAAgB10H,MAArC,EAA6CqB,MAAMiK,CAAnD,EAAsD,EAAGjK,CAAzD,EAA6D;;AAE5D,QAAIk8G,SAASmX,gBAAiBrzH,CAAjB,CAAb;;AAEA,SAAKisH,iBAAL,CAAwB/P,MAAxB;;AAEA,QAAIsV,aAAatV,OAAOiP,WAAxB;AAAA,QACCoG,qBAAqBL,QAASA,QAAQvyH,MAAR,GAAiB,CAA1B,CADtB;;AAGAu9G,WAAOiP,WAAP,GAAqB,IAArB;AACAjP,WAAOkP,iBAAP,GAA2B,IAA3B;;AAEAmG,uBAAmBpG,WAAnB,GAAiCqG,UAAjC;AACAN,YAASM,UAAT,IAAwBD,kBAAxB;AACAL,YAAQ13D,GAAR;;AAEA,SAAKo4D,gCAAL,CAAuC1V,MAAvC;AAEA;;AAED,UAAOkV,cAAehB,QAAf,CAAP;AAEA;AAED,EAnqBoF;;AAqqBrF;AACAkD,cAAa,UAAW3O,IAAX,EAAkB;;AAE9B,MAAIoL,WAAWpL,KAAKh7G,IAApB;AAAA,MACCynH,gBAAgB,KAAKd,cADtB;;AAGA,OAAM,IAAIF,QAAV,IAAsBgB,aAAtB,EAAsC;;AAErC,OAAIC,eAAeD,cAAehB,QAAf,EAA0BiB,YAA7C;AAAA,OACCnV,SAASmV,aAActB,QAAd,CADV;;AAGA,OAAK7T,WAAW7+G,SAAhB,EAA4B;;AAE3B,SAAK4uH,iBAAL,CAAwB/P,MAAxB;AACA,SAAKoV,qBAAL,CAA4BpV,MAA5B;AAEA;AAED;;AAED,MAAI8T,iBAAiB,KAAKC,sBAA1B;AAAA,MACCkC,gBAAgBnC,eAAgBD,QAAhB,CADjB;;AAGA,MAAKoC,kBAAkB90H,SAAvB,EAAmC;;AAElC,QAAM,IAAI+yG,SAAV,IAAuB+hB,aAAvB,EAAuC;;AAEtC,QAAI1P,UAAU0P,cAAe/hB,SAAf,CAAd;AACAqS,YAAQgB,oBAAR;AACA,SAAKoO,sBAAL,CAA6BpP,OAA7B;AAEA;AAED;AAED,EAxsBoF;;AA0sBrF;AACA8Q,gBAAe,UAAWpkB,IAAX,EAAiB2jB,YAAjB,EAAgC;;AAE9C,MAAI5W,SAAS,KAAK8W,cAAL,CAAqB7jB,IAArB,EAA2B2jB,YAA3B,CAAb;;AAEA,MAAK5W,WAAW,IAAhB,EAAuB;;AAEtB,QAAK+P,iBAAL,CAAwB/P,MAAxB;AACA,QAAKoV,qBAAL,CAA4BpV,MAA5B;AAEA;AAED;;AAttBoF,CAA3D,CAA3B;;AA0tBA;;;;AAIA,SAASsX,OAAT,CAAkB/1H,KAAlB,EAA0B;;AAEzB,KAAK,OAAOA,KAAP,KAAiB,QAAtB,EAAiC;;AAEhCqP,UAAQC,IAAR,CAAc,oDAAd;AACAtP,UAAQiB,UAAW,CAAX,CAAR;AAEA;;AAED,MAAKjB,KAAL,GAAaA,KAAb;AAEA;;AAED+1H,QAAQz1H,SAAR,CAAkByO,KAAlB,GAA0B,YAAY;;AAErC,QAAO,IAAIgnH,OAAJ,CAAa,KAAK/1H,KAAL,CAAW+O,KAAX,KAAqBnP,SAArB,GAAiC,KAAKI,KAAtC,GAA8C,KAAKA,KAAL,CAAW+O,KAAX,EAA3D,CAAP;AAEA,CAJD;;AAMA;;;;AAIA,SAASinH,uBAAT,GAAmC;;AAElC1/E,gBAAeh1C,IAAf,CAAqB,IAArB;;AAEA,MAAKG,IAAL,GAAY,yBAAZ;AACA,MAAKwlD,iBAAL,GAAyBrnD,SAAzB;AAEA;;AAEDo2H,wBAAwB11H,SAAxB,GAAoCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe+vB,eAAeh2C,SAA9B,CAAf,EAA0D;;AAE7F0O,cAAagnH,uBAFgF;;AAI7Fl2C,4BAA2B,IAJkE;;AAM7F7wE,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBm1C,iBAAeh2C,SAAf,CAAyB2O,IAAzB,CAA8B3N,IAA9B,CAAoC,IAApC,EAA0CH,MAA1C;;AAEA,OAAK8lD,iBAAL,GAAyB9lD,OAAO8lD,iBAAhC;;AAEA,SAAO,IAAP;AAEA,EAd4F;;AAgB7Fl4C,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA;;AApB4F,CAA1D,CAApC;;AAwBA;;;;AAIA,SAASgnH,0BAAT,CAAqCC,iBAArC,EAAwDpiF,QAAxD,EAAkE5hC,MAAlE,EAA0E6hC,UAA1E,EAAuF;;AAEtF,MAAKpqB,IAAL,GAAYusG,iBAAZ;AACA,MAAKpiF,QAAL,GAAgBA,QAAhB;AACA,MAAK5hC,MAAL,GAAcA,MAAd;;AAEA,MAAK6hC,UAAL,GAAkBA,eAAe,IAAjC;AAEA;;AAEDxzC,OAAO8N,gBAAP,CAAyB4nH,2BAA2B31H,SAApD,EAA+D;;AAE9DwY,QAAO;;AAENrY,OAAK,YAAY;;AAEhB,UAAO,KAAKkpB,IAAL,CAAU7Q,KAAjB;AAEA;;AANK,EAFuD;;AAY9DzW,QAAO;;AAEN5B,OAAK,YAAY;;AAEhB,UAAO,KAAKkpB,IAAL,CAAUtnB,KAAjB;AAEA;;AANK;;AAZuD,CAA/D;;AAwBA9B,OAAOK,MAAP,CAAeq1H,2BAA2B31H,SAA1C,EAAqD;;AAEpDulC,+BAA8B,IAFsB;;AAIpDn3B,OAAM,UAAW1N,KAAX,EAAkBZ,CAAlB,EAAsB;;AAE3B,OAAKupB,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAjD,IAA4D9R,CAA5D;;AAEA,SAAO,IAAP;AAEA,EAVmD;;AAYpDuO,OAAM,UAAW3N,KAAX,EAAkBgM,CAAlB,EAAsB;;AAE3B,OAAK2c,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAhC,GAAyC,CAA1D,IAAgElF,CAAhE;;AAEA,SAAO,IAAP;AAEA,EAlBmD;;AAoBpD0U,OAAM,UAAW1gB,KAAX,EAAkB0T,CAAlB,EAAsB;;AAE3B,OAAKiV,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAhC,GAAyC,CAA1D,IAAgEwC,CAAhE;;AAEA,SAAO,IAAP;AAEA,EA1BmD;;AA4BpD2T,OAAM,UAAWrnB,KAAX,EAAkBoO,CAAlB,EAAsB;;AAE3B,OAAKua,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAhC,GAAyC,CAA1D,IAAgE9C,CAAhE;;AAEA,SAAO,IAAP;AAEA,EAlCmD;;AAoCpDkD,OAAM,UAAWtR,KAAX,EAAmB;;AAExB,SAAO,KAAK2oB,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAjD,CAAP;AAEA,EAxCmD;;AA0CpDK,OAAM,UAAWvR,KAAX,EAAmB;;AAExB,SAAO,KAAK2oB,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAhC,GAAyC,CAA1D,CAAP;AAEA,EA9CmD;;AAgDpD6G,OAAM,UAAW/X,KAAX,EAAmB;;AAExB,SAAO,KAAK2oB,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAhC,GAAyC,CAA1D,CAAP;AAEA,EApDmD;;AAsDpDwW,OAAM,UAAW1nB,KAAX,EAAmB;;AAExB,SAAO,KAAK2oB,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAhC,GAAyC,CAA1D,CAAP;AAEA,EA1DmD;;AA4DpD0iC,QAAO,UAAW5zC,KAAX,EAAkBZ,CAAlB,EAAqB4M,CAArB,EAAyB;;AAE/BhM,UAAQA,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAxC;;AAEA,OAAKyX,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,CAAzB,IAA+BZ,CAA/B;AACA,OAAKupB,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,CAAzB,IAA+BgM,CAA/B;;AAEA,SAAO,IAAP;AAEA,EArEmD;;AAuEpDiM,SAAQ,UAAWjY,KAAX,EAAkBZ,CAAlB,EAAqB4M,CAArB,EAAwB0H,CAAxB,EAA4B;;AAEnC1T,UAAQA,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAxC;;AAEA,OAAKyX,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,CAAzB,IAA+BZ,CAA/B;AACA,OAAKupB,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,CAAzB,IAA+BgM,CAA/B;AACA,OAAK2c,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,CAAzB,IAA+B0T,CAA/B;;AAEA,SAAO,IAAP;AAEA,EAjFmD;;AAmFpDmgC,UAAS,UAAW7zC,KAAX,EAAkBZ,CAAlB,EAAqB4M,CAArB,EAAwB0H,CAAxB,EAA2BtF,CAA3B,EAA+B;;AAEvCpO,UAAQA,QAAQ,KAAK2oB,IAAL,CAAUu2D,MAAlB,GAA2B,KAAKhuE,MAAxC;;AAEA,OAAKyX,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,CAAzB,IAA+BZ,CAA/B;AACA,OAAKupB,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,CAAzB,IAA+BgM,CAA/B;AACA,OAAK2c,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,CAAzB,IAA+B0T,CAA/B;AACA,OAAKiV,IAAL,CAAUtnB,KAAV,CAAiBrB,QAAQ,CAAzB,IAA+BoO,CAA/B;;AAEA,SAAO,IAAP;AAEA;;AA9FmD,CAArD;;AAkGA;;;;AAIA,SAAS+mH,iBAAT,CAA4B9zH,KAA5B,EAAmC69E,MAAnC,EAA4C;;AAE3C,MAAK79E,KAAL,GAAaA,KAAb;AACA,MAAK69E,MAAL,GAAcA,MAAd;AACA,MAAKpnE,KAAL,GAAazW,UAAUzC,SAAV,GAAsByC,MAAMnB,MAAN,GAAeg/E,MAArC,GAA8C,CAA3D;;AAEA,MAAKj8C,OAAL,GAAe,KAAf;AACA,MAAKyB,WAAL,GAAmB,EAAExzB,QAAQ,CAAV,EAAa4G,OAAO,CAAE,CAAtB,EAAnB;;AAEA,MAAKuN,OAAL,GAAe,CAAf;AAEA;;AAED9lB,OAAOC,cAAP,CAAuB21H,kBAAkB71H,SAAzC,EAAoD,aAApD,EAAmE;;AAElEgO,MAAK,UAAWtO,KAAX,EAAmB;;AAEvB,MAAKA,UAAU,IAAf,EAAsB,KAAKqmB,OAAL;AAEtB;;AANiE,CAAnE;;AAUA9lB,OAAOK,MAAP,CAAeu1H,kBAAkB71H,SAAjC,EAA4C;;AAE3C81H,sBAAqB,IAFsB;;AAI3C7xF,mBAAkB,YAAY,CAAE,CAJW;;AAM3C0P,WAAU,UAAW5xC,KAAX,EAAmB;;AAE5B,MAAKq4B,MAAMC,OAAN,CAAet4B,KAAf,CAAL,EAA8B;;AAE7B,SAAM,IAAIvB,SAAJ,CAAe,uDAAf,CAAN;AAEA;;AAED,OAAKgY,KAAL,GAAazW,UAAUzC,SAAV,GAAsByC,MAAMnB,MAAN,GAAe,KAAKg/E,MAA1C,GAAmD,CAAhE;AACA,OAAK79E,KAAL,GAAaA,KAAb;;AAEA,SAAO,IAAP;AAEA,EAnB0C;;AAqB3C6xC,aAAY,UAAWl0C,KAAX,EAAmB;;AAE9B,OAAKikC,OAAL,GAAejkC,KAAf;;AAEA,SAAO,IAAP;AAEA,EA3B0C;;AA6B3CiP,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB,OAAKkB,KAAL,GAAa,IAAIlB,OAAOkB,KAAP,CAAa2M,WAAjB,CAA8B7N,OAAOkB,KAArC,CAAb;AACA,OAAKyW,KAAL,GAAa3X,OAAO2X,KAApB;AACA,OAAKonE,MAAL,GAAc/+E,OAAO++E,MAArB;AACA,OAAKj8C,OAAL,GAAe9iC,OAAO8iC,OAAtB;;AAEA,SAAO,IAAP;AAEA,EAtC0C;;AAwC3CkQ,SAAQ,UAAWC,MAAX,EAAmB/hC,SAAnB,EAA8BgiC,MAA9B,EAAuC;;AAE9CD,YAAU,KAAK8rC,MAAf;AACA7rC,YAAUhiC,UAAU6tE,MAApB;;AAEA,OAAM,IAAI39E,IAAI,CAAR,EAAWC,IAAI,KAAK09E,MAA1B,EAAkC39E,IAAIC,CAAtC,EAAyCD,GAAzC,EAAgD;;AAE/C,QAAKF,KAAL,CAAY+xC,SAAS7xC,CAArB,IAA2B8P,UAAUhQ,KAAV,CAAiBgyC,SAAS9xC,CAA1B,CAA3B;AAEA;;AAED,SAAO,IAAP;AAEA,EArD0C;;AAuD3C+L,MAAK,UAAWtO,KAAX,EAAkBkS,MAAlB,EAA2B;;AAE/B,MAAKA,WAAWtS,SAAhB,EAA4BsS,SAAS,CAAT;;AAE5B,OAAK7P,KAAL,CAAWiM,GAAX,CAAgBtO,KAAhB,EAAuBkS,MAAvB;;AAEA,SAAO,IAAP;AAEA,EA/D0C;;AAiE3CnD,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EArE0C;;AAuE3C6lC,WAAU,UAAWtzB,QAAX,EAAsB;;AAE/B,OAAK+iB,gBAAL,GAAwB/iB,QAAxB;;AAEA,SAAO,IAAP;AAEA;;AA7E0C,CAA5C;;AAiFA;;;;AAIA,SAAS60G,0BAAT,CAAqCh0H,KAArC,EAA4C69E,MAA5C,EAAoDxW,gBAApD,EAAuE;;AAEtEysD,mBAAkB70H,IAAlB,CAAwB,IAAxB,EAA8Be,KAA9B,EAAqC69E,MAArC;;AAEA,MAAKxW,gBAAL,GAAwBA,oBAAoB,CAA5C;AAEA;;AAED2sD,2BAA2B/1H,SAA3B,GAAuCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAe4vG,kBAAkB71H,SAAjC,CAAf,EAA6D;;AAEnG0O,cAAaqnH,0BAFsF;;AAInGl2C,+BAA8B,IAJqE;;AAMnGlxE,OAAM,UAAW9N,MAAX,EAAoB;;AAEzBg1H,oBAAkB71H,SAAlB,CAA4B2O,IAA5B,CAAiC3N,IAAjC,CAAuC,IAAvC,EAA6CH,MAA7C;;AAEA,OAAKuoE,gBAAL,GAAwBvoE,OAAOuoE,gBAA/B;;AAEA,SAAO,IAAP;AAEA;;AAdkG,CAA7D,CAAvC;;AAkBA;;;;AAIA,SAAS4sD,wBAAT,CAAmCj0H,KAAnC,EAA0CyxC,QAA1C,EAAoD41B,gBAApD,EAAuE;;AAEtE71B,iBAAgBvyC,IAAhB,CAAsB,IAAtB,EAA4Be,KAA5B,EAAmCyxC,QAAnC;;AAEA,MAAK41B,gBAAL,GAAwBA,oBAAoB,CAA5C;AAEA;;AAED4sD,yBAAyBh2H,SAAzB,GAAqCC,OAAOK,MAAP,CAAeL,OAAOgmB,MAAP,CAAestB,gBAAgBvzC,SAA/B,CAAf,EAA2D;;AAE/F0O,cAAasnH,wBAFkF;;AAI/Fl2C,6BAA4B,IAJmE;;AAM/FnxE,OAAM,UAAW9N,MAAX,EAAoB;;AAEzB0yC,kBAAgBvzC,SAAhB,CAA0B2O,IAA1B,CAA+B3N,IAA/B,CAAqC,IAArC,EAA2CH,MAA3C;;AAEA,OAAKuoE,gBAAL,GAAwBvoE,OAAOuoE,gBAA/B;;AAEA,SAAO,IAAP;AAEA;;AAd8F,CAA3D,CAArC;;AAkBA;;;;;;AAMA,SAAS6sD,SAAT,CAAoBx4E,MAApB,EAA4B3tB,SAA5B,EAAuCpT,IAAvC,EAA6CC,GAA7C,EAAmD;;AAElD,MAAK+gC,GAAL,GAAW,IAAIF,GAAJ,CAASC,MAAT,EAAiB3tB,SAAjB,CAAX;AACA;;AAEA,MAAKpT,IAAL,GAAYA,QAAQ,CAApB;AACA,MAAKC,GAAL,GAAWA,OAAO6M,QAAlB;;AAEA,MAAK4+D,MAAL,GAAc;AACbhmC,QAAM,EADO;AAEbglC,QAAM,EAFO;AAGb9B,OAAK,EAHQ;AAIb4C,UAAQ,EAAEC,WAAW,CAAb,EAJK;AAKblD,UAAQ;AALK,EAAd;;AAQAhlF,QAAO8N,gBAAP,CAAyB,KAAKq6E,MAA9B,EAAsC;AACrC8tC,cAAY;AACX/1H,QAAK,YAAY;;AAEhB4O,YAAQC,IAAR,CAAc,uEAAd;AACA,WAAO,KAAKk5E,MAAZ;AAEA;AANU;AADyB,EAAtC;AAWA;;AAED,SAASiuC,OAAT,CAAkB/mH,CAAlB,EAAqBC,CAArB,EAAyB;;AAExB,QAAOD,EAAEojB,QAAF,GAAanjB,EAAEmjB,QAAtB;AAEA;;AAED,SAAS4jG,eAAT,CAA0BzrG,MAA1B,EAAkC+4B,SAAlC,EAA6CG,UAA7C,EAAyD5Y,SAAzD,EAAqE;;AAEpE,KAAKtgB,OAAO8c,OAAP,KAAmB,KAAxB,EAAgC;;AAEhC9c,QAAOkf,OAAP,CAAgB6Z,SAAhB,EAA2BG,UAA3B;;AAEA,KAAK5Y,cAAc,IAAnB,EAA0B;;AAEzB,MAAIhE,WAAWtc,OAAOsc,QAAtB;;AAEA,OAAM,IAAIhlC,IAAI,CAAR,EAAWC,IAAI+kC,SAASrmC,MAA9B,EAAsCqB,IAAIC,CAA1C,EAA6CD,GAA7C,EAAoD;;AAEnDm0H,mBAAiBnvF,SAAUhlC,CAAV,CAAjB,EAAgCyhD,SAAhC,EAA2CG,UAA3C,EAAuD,IAAvD;AAEA;AAED;AAED;;AAED5jD,OAAOK,MAAP,CAAe21H,UAAUj2H,SAAzB,EAAoC;;AAEnCwnF,gBAAe,CAFoB;;AAInCx5E,MAAK,UAAWyvC,MAAX,EAAmB3tB,SAAnB,EAA+B;;AAEnC;;AAEA,OAAK4tB,GAAL,CAAS1vC,GAAT,CAAcyvC,MAAd,EAAsB3tB,SAAtB;AAEA,EAVkC;;AAYnCumG,gBAAe,UAAWC,MAAX,EAAmBp0G,MAAnB,EAA4B;;AAE1C,MAAOA,UAAUA,OAAO2xD,mBAAxB,EAAgD;;AAE/C,QAAKn2B,GAAL,CAASD,MAAT,CAAgB95B,qBAAhB,CAAuCzB,OAAOE,WAA9C;AACA,QAAKs7B,GAAL,CAAS5tB,SAAT,CAAmB9hB,GAAnB,CAAwBsoH,OAAOx2H,CAA/B,EAAkCw2H,OAAO5pH,CAAzC,EAA4C,GAA5C,EAAkD2V,SAAlD,CAA6DH,MAA7D,EAAsE3S,GAAtE,CAA2E,KAAKmuC,GAAL,CAASD,MAApF,EAA6F5sC,SAA7F;AAEA,GALD,MAKO,IAAOqR,UAAUA,OAAOupB,oBAAxB,EAAiD;;AAEvD,QAAKiS,GAAL,CAASD,MAAT,CAAgBzvC,GAAhB,CAAqBsoH,OAAOx2H,CAA5B,EAA+Bw2H,OAAO5pH,CAAtC,EAAyC,CAAEwV,OAAOxF,IAAP,GAAcwF,OAAOvF,GAAvB,KAAiCuF,OAAOxF,IAAP,GAAcwF,OAAOvF,GAAtD,CAAzC,EAAuG0F,SAAvG,CAAkHH,MAAlH,EAFuD,CAEqE;AAC5H,QAAKw7B,GAAL,CAAS5tB,SAAT,CAAmB9hB,GAAnB,CAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAAE,CAAhC,EAAoCsU,kBAApC,CAAwDJ,OAAOE,WAA/D;AAEA,GALM,MAKA;;AAENrT,WAAQyD,KAAR,CAAe,2CAAf;AAEA;AAED,EA9BkC;;AAgCnC4jH,kBAAiB,UAAWzrG,MAAX,EAAmBsgB,SAAnB,EAA8Bq2D,cAA9B,EAA+C;;AAE/D,MAAIz9C,aAAay9C,kBAAkB,EAAnC;;AAEA80B,kBAAiBzrG,MAAjB,EAAyB,IAAzB,EAA+Bk5B,UAA/B,EAA2C5Y,SAA3C;;AAEA4Y,aAAWhS,IAAX,CAAiBskF,OAAjB;;AAEA,SAAOtyE,UAAP;AAEA,EA1CkC;;AA4CnC0yE,mBAAkB,UAAW3xE,OAAX,EAAoB3Z,SAApB,EAA+Bq2D,cAA/B,EAAgD;;AAEjE,MAAIz9C,aAAay9C,kBAAkB,EAAnC;;AAEA,MAAKlnE,MAAMC,OAAN,CAAeuqB,OAAf,MAA6B,KAAlC,EAA0C;;AAEzC71C,WAAQC,IAAR,CAAc,4DAAd;AACA,UAAO60C,UAAP;AAEA;;AAED,OAAM,IAAI5hD,IAAI,CAAR,EAAWC,IAAI0iD,QAAQhkD,MAA7B,EAAqCqB,IAAIC,CAAzC,EAA4CD,GAA5C,EAAmD;;AAElDm0H,mBAAiBxxE,QAAS3iD,CAAT,CAAjB,EAA+B,IAA/B,EAAqC4hD,UAArC,EAAiD5Y,SAAjD;AAEA;;AAED4Y,aAAWhS,IAAX,CAAiBskF,OAAjB;;AAEA,SAAOtyE,UAAP;AAEA;;AAjEkC,CAApC;;AAqEA;;;;AAIA,SAAS2yE,KAAT,CAAgBC,SAAhB,EAA4B;;AAE3B,MAAKA,SAAL,GAAmBA,cAAcn3H,SAAhB,GAA8Bm3H,SAA9B,GAA0C,IAA3D;;AAEA,MAAK1mB,SAAL,GAAiB,CAAjB;AACA,MAAK2mB,OAAL,GAAe,CAAf;AACA,MAAKC,WAAL,GAAmB,CAAnB;;AAEA,MAAKC,OAAL,GAAe,KAAf;AAEA;;AAED32H,OAAOK,MAAP,CAAek2H,MAAMx2H,SAArB,EAAgC;;AAE/BiwB,QAAO,YAAY;;AAElB,OAAK8/E,SAAL,GAAiB,CAAE,OAAO8mB,WAAP,KAAuB,WAAvB,GAAqCC,IAArC,GAA4CD,WAA9C,EAA4D7G,GAA5D,EAAjB,CAFkB,CAEkE;;AAEpF,OAAK0G,OAAL,GAAe,KAAK3mB,SAApB;AACA,OAAK4mB,WAAL,GAAmB,CAAnB;AACA,OAAKC,OAAL,GAAe,IAAf;AAEA,EAV8B;;AAY/B3zF,OAAM,YAAY;;AAEjB,OAAK8zF,cAAL;AACA,OAAKH,OAAL,GAAe,KAAf;AACA,OAAKH,SAAL,GAAiB,KAAjB;AAEA,EAlB8B;;AAoB/BM,iBAAgB,YAAY;;AAE3B,OAAKC,QAAL;AACA,SAAO,KAAKL,WAAZ;AAEA,EAzB8B;;AA2B/BK,WAAU,YAAY;;AAErB,MAAIvlF,OAAO,CAAX;;AAEA,MAAK,KAAKglF,SAAL,IAAkB,CAAE,KAAKG,OAA9B,EAAwC;;AAEvC,QAAK3mG,KAAL;AACA,UAAO,CAAP;AAEA;;AAED,MAAK,KAAK2mG,OAAV,EAAoB;;AAEnB,OAAIK,UAAU,CAAE,OAAOJ,WAAP,KAAuB,WAAvB,GAAqCC,IAArC,GAA4CD,WAA9C,EAA4D7G,GAA5D,EAAd;;AAEAv+E,UAAO,CAAEwlF,UAAU,KAAKP,OAAjB,IAA6B,IAApC;AACA,QAAKA,OAAL,GAAeO,OAAf;;AAEA,QAAKN,WAAL,IAAoBllF,IAApB;AAEA;;AAED,SAAOA,IAAP;AAEA;;AAnD8B,CAAhC;;AAuDA;;;;;;;;;;AAUA,SAASylF,SAAT,CAAoBzzG,MAApB,EAA4BD,GAA5B,EAAiCxJ,KAAjC,EAAyC;;AAExC,MAAKyJ,MAAL,GAAgBA,WAAWnkB,SAAb,GAA2BmkB,MAA3B,GAAoC,GAAlD;AACA,MAAKD,GAAL,GAAaA,QAAQlkB,SAAV,GAAwBkkB,GAAxB,GAA8B,CAAzC,CAHwC,CAGI;AAC5C,MAAKxJ,KAAL,GAAeA,UAAU1a,SAAZ,GAA0B0a,KAA1B,GAAkC,CAA/C,CAJwC,CAIU;;AAElD,QAAO,IAAP;AAEA;;AAED/Z,OAAOK,MAAP,CAAe42H,UAAUl3H,SAAzB,EAAoC;;AAEnCgO,MAAK,UAAWyV,MAAX,EAAmBD,GAAnB,EAAwBxJ,KAAxB,EAAgC;;AAEpC,OAAKyJ,MAAL,GAAcA,MAAd;AACA,OAAKD,GAAL,GAAWA,GAAX;AACA,OAAKxJ,KAAL,GAAaA,KAAb;;AAEA,SAAO,IAAP;AAEA,EAVkC;;AAYnCvL,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EAhBkC;;AAkBnCA,OAAM,UAAWwoH,KAAX,EAAmB;;AAExB,OAAK1zG,MAAL,GAAc0zG,MAAM1zG,MAApB;AACA,OAAKD,GAAL,GAAW2zG,MAAM3zG,GAAjB;AACA,OAAKxJ,KAAL,GAAam9G,MAAMn9G,KAAnB;;AAEA,SAAO,IAAP;AAEA,EA1BkC;;AA4BnC;AACAo9G,WAAU,YAAY;;AAErB,MAAIt3G,MAAM,QAAV;AACA,OAAK0D,GAAL,GAAWjkB,KAAKyM,GAAL,CAAU8T,GAAV,EAAevgB,KAAKwM,GAAL,CAAUxM,KAAK4L,EAAL,GAAU2U,GAApB,EAAyB,KAAK0D,GAA9B,CAAf,CAAX;;AAEA,SAAO,IAAP;AAEA,EApCkC;;AAsCnCyiB,iBAAgB,UAAWoxF,IAAX,EAAkB;;AAEjC,OAAK5zG,MAAL,GAAc4zG,KAAKz2H,MAAL,EAAd;;AAEA,MAAK,KAAK6iB,MAAL,KAAgB,CAArB,EAAyB;;AAExB,QAAKzJ,KAAL,GAAa,CAAb;AACA,QAAKwJ,GAAL,GAAW,CAAX;AAEA,GALD,MAKO;;AAEN,QAAKxJ,KAAL,GAAaza,KAAKwR,KAAL,CAAYsmH,KAAKv3H,CAAjB,EAAoBu3H,KAAKjjH,CAAzB,CAAb,CAFM,CAEqC;AAC3C,QAAKoP,GAAL,GAAWjkB,KAAK6jB,IAAL,CAAWnY,MAAMa,KAAN,CAAaurH,KAAK3qH,CAAL,GAAS,KAAK+W,MAA3B,EAAmC,CAAE,CAArC,EAAwC,CAAxC,CAAX,CAAX,CAHM,CAG+D;AAErE;;AAED,SAAO,IAAP;AAEA;;AAxDkC,CAApC;;AA4DA;;;;;;;AAOA,SAAS6zG,WAAT,CAAsB7zG,MAAtB,EAA8BzJ,KAA9B,EAAqCtN,CAArC,EAAyC;;AAExC,MAAK+W,MAAL,GAAgBA,WAAWnkB,SAAb,GAA2BmkB,MAA3B,GAAoC,GAAlD,CAFwC,CAEe;AACvD,MAAKzJ,KAAL,GAAeA,UAAU1a,SAAZ,GAA0B0a,KAA1B,GAAkC,CAA/C,CAHwC,CAGU;AAClD,MAAKtN,CAAL,GAAWA,MAAMpN,SAAR,GAAsBoN,CAAtB,GAA0B,CAAnC,CAJwC,CAIF;;AAEtC,QAAO,IAAP;AAEA;;AAEDzM,OAAOK,MAAP,CAAeg3H,YAAYt3H,SAA3B,EAAsC;;AAErCgO,MAAK,UAAWyV,MAAX,EAAmBzJ,KAAnB,EAA0BtN,CAA1B,EAA8B;;AAElC,OAAK+W,MAAL,GAAcA,MAAd;AACA,OAAKzJ,KAAL,GAAaA,KAAb;AACA,OAAKtN,CAAL,GAASA,CAAT;;AAEA,SAAO,IAAP;AAEA,EAVoC;;AAYrC+B,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EAhBoC;;AAkBrCA,OAAM,UAAWwoH,KAAX,EAAmB;;AAExB,OAAK1zG,MAAL,GAAc0zG,MAAM1zG,MAApB;AACA,OAAKzJ,KAAL,GAAam9G,MAAMn9G,KAAnB;AACA,OAAKtN,CAAL,GAASyqH,MAAMzqH,CAAf;;AAEA,SAAO,IAAP;AAEA,EA1BoC;;AA4BrCu5B,iBAAgB,UAAWoxF,IAAX,EAAkB;;AAEjC,OAAK5zG,MAAL,GAAclkB,KAAKmR,IAAL,CAAW2mH,KAAKv3H,CAAL,GAASu3H,KAAKv3H,CAAd,GAAkBu3H,KAAKjjH,CAAL,GAASijH,KAAKjjH,CAA3C,CAAd;AACA,OAAK4F,KAAL,GAAaza,KAAKwR,KAAL,CAAYsmH,KAAKv3H,CAAjB,EAAoBu3H,KAAKjjH,CAAzB,CAAb;AACA,OAAK1H,CAAL,GAAS2qH,KAAK3qH,CAAd;;AAEA,SAAO,IAAP;AAEA;;AApCoC,CAAtC;;AAwCA;;;;AAIA,SAAS6qH,IAAT,CAAexrH,GAAf,EAAoBC,GAApB,EAA0B;;AAEzB,MAAKD,GAAL,GAAaA,QAAQzM,SAAV,GAAwByM,GAAxB,GAA8B,IAAI+B,OAAJ,CAAa,CAAE0b,QAAf,EAAyB,CAAEA,QAA3B,CAAzC;AACA,MAAKxd,GAAL,GAAaA,QAAQ1M,SAAV,GAAwB0M,GAAxB,GAA8B,IAAI8B,OAAJ,CAAa,CAAE0b,QAAf,EAAyB,CAAEA,QAA3B,CAAzC;AAEA;;AAEDvpB,OAAOK,MAAP,CAAei3H,KAAKv3H,SAApB,EAA+B;;AAE9BgO,MAAK,UAAWjC,GAAX,EAAgBC,GAAhB,EAAsB;;AAE1B,OAAKD,GAAL,CAAS4C,IAAT,CAAe5C,GAAf;AACA,OAAKC,GAAL,CAAS2C,IAAT,CAAe3C,GAAf;;AAEA,SAAO,IAAP;AAEA,EAT6B;;AAW9Bke,gBAAe,UAAWC,MAAX,EAAoB;;AAElC,OAAKC,SAAL;;AAEA,OAAM,IAAInoB,IAAI,CAAR,EAAWooB,KAAKF,OAAOvpB,MAA7B,EAAqCqB,IAAIooB,EAAzC,EAA6CpoB,GAA7C,EAAoD;;AAEnD,QAAKqoB,aAAL,CAAoBH,OAAQloB,CAAR,CAApB;AAEA;;AAED,SAAO,IAAP;AAEA,EAvB6B;;AAyB9BsoB,uBAAsB,YAAY;;AAEjC,MAAI/Y,KAAK,IAAI1D,OAAJ,EAAT;;AAEA,SAAO,SAASyc,oBAAT,CAA+BpY,MAA/B,EAAuCqY,IAAvC,EAA8C;;AAEpD,OAAIC,WAAWjZ,GAAG7C,IAAH,CAAS6b,IAAT,EAAgB7a,cAAhB,CAAgC,GAAhC,CAAf;AACA,QAAK5D,GAAL,CAAS4C,IAAT,CAAewD,MAAf,EAAwB5C,GAAxB,CAA6Bkb,QAA7B;AACA,QAAKze,GAAL,CAAS2C,IAAT,CAAewD,MAAf,EAAwBtD,GAAxB,CAA6B4b,QAA7B;;AAEA,UAAO,IAAP;AAEA,GARD;AAUA,EAdqB,EAzBQ;;AAyC9Bhc,QAAO,YAAY;;AAElB,SAAO,IAAI,KAAKC,WAAT,GAAuBC,IAAvB,CAA6B,IAA7B,CAAP;AAEA,EA7C6B;;AA+C9BA,OAAM,UAAWkc,GAAX,EAAiB;;AAEtB,OAAK9e,GAAL,CAAS4C,IAAT,CAAekc,IAAI9e,GAAnB;AACA,OAAKC,GAAL,CAAS2C,IAAT,CAAekc,IAAI7e,GAAnB;;AAEA,SAAO,IAAP;AAEA,EAtD6B;;AAwD9Boe,YAAW,YAAY;;AAEtB,OAAKre,GAAL,CAASjM,CAAT,GAAa,KAAKiM,GAAL,CAASW,CAAT,GAAa,CAAE8c,QAA5B;AACA,OAAKxd,GAAL,CAASlM,CAAT,GAAa,KAAKkM,GAAL,CAASU,CAAT,GAAa,CAAE8c,QAA5B;;AAEA,SAAO,IAAP;AAEA,EA/D6B;;AAiE9BsB,UAAS,YAAY;;AAEpB;;AAEA,SAAS,KAAK9e,GAAL,CAASlM,CAAT,GAAa,KAAKiM,GAAL,CAASjM,CAAxB,IAAiC,KAAKkM,GAAL,CAASU,CAAT,GAAa,KAAKX,GAAL,CAASW,CAA9D;AAEA,EAvE6B;;AAyE9Bqe,YAAW,UAAWxqB,MAAX,EAAoB;;AAE9B,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,iDAAd;AACAzO,YAAS,IAAIuN,OAAJ,EAAT;AAEA;;AAED,SAAO,KAAKgd,OAAL,KAAiBvqB,OAAOyN,GAAP,CAAY,CAAZ,EAAe,CAAf,CAAjB,GAAsCzN,OAAO0O,UAAP,CAAmB,KAAKlD,GAAxB,EAA6B,KAAKC,GAAlC,EAAwC2D,cAAxC,CAAwD,GAAxD,CAA7C;AAEA,EApF6B;;AAsF9Bqb,UAAS,UAAWzqB,MAAX,EAAoB;;AAE5B,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,+CAAd;AACAzO,YAAS,IAAIuN,OAAJ,EAAT;AAEA;;AAED,SAAO,KAAKgd,OAAL,KAAiBvqB,OAAOyN,GAAP,CAAY,CAAZ,EAAe,CAAf,CAAjB,GAAsCzN,OAAOiP,UAAP,CAAmB,KAAKxD,GAAxB,EAA6B,KAAKD,GAAlC,CAA7C;AAEA,EAjG6B;;AAmG9Bue,gBAAe,UAAWW,KAAX,EAAmB;;AAEjC,OAAKlf,GAAL,CAASA,GAAT,CAAckf,KAAd;AACA,OAAKjf,GAAL,CAASA,GAAT,CAAcif,KAAd;;AAEA,SAAO,IAAP;AAEA,EA1G6B;;AA4G9BC,iBAAgB,UAAWnP,MAAX,EAAoB;;AAEnC,OAAKhQ,GAAL,CAASwD,GAAT,CAAcwM,MAAd;AACA,OAAK/P,GAAL,CAAS6C,GAAT,CAAckN,MAAd;;AAEA,SAAO,IAAP;AAEA,EAnH6B;;AAqH9BoP,iBAAgB,UAAWhd,MAAX,EAAoB;;AAEnC,OAAKpC,GAAL,CAASmD,SAAT,CAAoB,CAAEf,MAAtB;AACA,OAAKnC,GAAL,CAASkD,SAAT,CAAoBf,MAApB;;AAEA,SAAO,IAAP;AAEA,EA5H6B;;AA8H9B0d,gBAAe,UAAWZ,KAAX,EAAmB;;AAEjC,SAAOA,MAAMnrB,CAAN,GAAU,KAAKiM,GAAL,CAASjM,CAAnB,IAAwBmrB,MAAMnrB,CAAN,GAAU,KAAKkM,GAAL,CAASlM,CAA3C,IACNmrB,MAAMve,CAAN,GAAU,KAAKX,GAAL,CAASW,CADb,IACkBue,MAAMve,CAAN,GAAU,KAAKV,GAAL,CAASU,CADrC,GACyC,KADzC,GACiD,IADxD;AAGA,EAnI6B;;AAqI9Bof,cAAa,UAAWjB,GAAX,EAAiB;;AAE7B,SAAO,KAAK9e,GAAL,CAASjM,CAAT,IAAc+qB,IAAI9e,GAAJ,CAAQjM,CAAtB,IAA2B+qB,IAAI7e,GAAJ,CAAQlM,CAAR,IAAa,KAAKkM,GAAL,CAASlM,CAAjD,IACN,KAAKiM,GAAL,CAASW,CAAT,IAAcme,IAAI9e,GAAJ,CAAQW,CADhB,IACqBme,IAAI7e,GAAJ,CAAQU,CAAR,IAAa,KAAKV,GAAL,CAASU,CADlD;AAGA,EA1I6B;;AA4I9Bqf,eAAc,UAAWd,KAAX,EAAkB1qB,MAAlB,EAA2B;;AAExC;AACA;;AAEA,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,oDAAd;AACAzO,YAAS,IAAIuN,OAAJ,EAAT;AAEA;;AAED,SAAOvN,OAAOyN,GAAP,CACN,CAAEid,MAAMnrB,CAAN,GAAU,KAAKiM,GAAL,CAASjM,CAArB,KAA6B,KAAKkM,GAAL,CAASlM,CAAT,GAAa,KAAKiM,GAAL,CAASjM,CAAnD,CADM,EAEN,CAAEmrB,MAAMve,CAAN,GAAU,KAAKX,GAAL,CAASW,CAArB,KAA6B,KAAKV,GAAL,CAASU,CAAT,GAAa,KAAKX,GAAL,CAASW,CAAnD,CAFM,CAAP;AAKA,EA7J6B;;AA+J9Bsf,gBAAe,UAAWnB,GAAX,EAAiB;;AAE/B;;AAEA,SAAOA,IAAI7e,GAAJ,CAAQlM,CAAR,GAAY,KAAKiM,GAAL,CAASjM,CAArB,IAA0B+qB,IAAI9e,GAAJ,CAAQjM,CAAR,GAAY,KAAKkM,GAAL,CAASlM,CAA/C,IACN+qB,IAAI7e,GAAJ,CAAQU,CAAR,GAAY,KAAKX,GAAL,CAASW,CADf,IACoBme,IAAI9e,GAAJ,CAAQW,CAAR,GAAY,KAAKV,GAAL,CAASU,CADzC,GAC6C,KAD7C,GACqD,IAD5D;AAGA,EAtK6B;;AAwK9B0f,aAAY,UAAWnB,KAAX,EAAkB1qB,MAAlB,EAA2B;;AAEtC,MAAKA,WAAWjB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,kDAAd;AACAzO,YAAS,IAAIuN,OAAJ,EAAT;AAEA;;AAED,SAAOvN,OAAOoO,IAAP,CAAasc,KAAb,EAAqBnf,KAArB,CAA4B,KAAKC,GAAjC,EAAsC,KAAKC,GAA3C,CAAP;AAEA,EAnL6B;;AAqL9BuhB,kBAAiB,YAAY;;AAE5B,MAAI/b,KAAK,IAAI1D,OAAJ,EAAT;;AAEA,SAAO,SAASyf,eAAT,CAA0BtC,KAA1B,EAAkC;;AAExC,OAAIuC,eAAehc,GAAG7C,IAAH,CAASsc,KAAT,EAAiBnf,KAAjB,CAAwB,KAAKC,GAA7B,EAAkC,KAAKC,GAAvC,CAAnB;AACA,UAAOwhB,aAAaje,GAAb,CAAkB0b,KAAlB,EAA0BrqB,MAA1B,EAAP;AAEA,GALD;AAOA,EAXgB,EArLa;;AAkM9B+sB,YAAW,UAAW9C,GAAX,EAAiB;;AAE3B,OAAK9e,GAAL,CAASC,GAAT,CAAc6e,IAAI9e,GAAlB;AACA,OAAKC,GAAL,CAASD,GAAT,CAAc8e,IAAI7e,GAAlB;;AAEA,SAAO,IAAP;AAEA,EAzM6B;;AA2M9B4hB,QAAO,UAAW/C,GAAX,EAAiB;;AAEvB,OAAK9e,GAAL,CAASA,GAAT,CAAc8e,IAAI9e,GAAlB;AACA,OAAKC,GAAL,CAASA,GAAT,CAAc6e,IAAI7e,GAAlB;;AAEA,SAAO,IAAP;AAEA,EAlN6B;;AAoN9ByY,YAAW,UAAW7S,MAAX,EAAoB;;AAE9B,OAAK7F,GAAL,CAAS8C,GAAT,CAAc+C,MAAd;AACA,OAAK5F,GAAL,CAAS6C,GAAT,CAAc+C,MAAd;;AAEA,SAAO,IAAP;AAEA,EA3N6B;;AA6N9BF,SAAQ,UAAWmZ,GAAX,EAAiB;;AAExB,SAAOA,IAAI9e,GAAJ,CAAQ2F,MAAR,CAAgB,KAAK3F,GAArB,KAA8B8e,IAAI7e,GAAJ,CAAQ0F,MAAR,CAAgB,KAAK1F,GAArB,CAArC;AAEA;;AAjO6B,CAA/B;;AAqOA;;;;AAIA,SAASwrH,qBAAT,CAAgC7sF,QAAhC,EAA2C;;AAE1C5D,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAK2pC,QAAL,GAAgBA,QAAhB;AACA,MAAKua,MAAL,GAAc,YAAW,oBAAuB,CAAE,CAAlD;AAEA;;AAEDsyE,sBAAsBx3H,SAAtB,GAAkCC,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAlC;AACAw3H,sBAAsBx3H,SAAtB,CAAgC0O,WAAhC,GAA8C8oH,qBAA9C;;AAEAA,sBAAsBx3H,SAAtB,CAAgC4gF,uBAAhC,GAA0D,IAA1D;;AAEA;;;;;AAKA,SAAS62C,mBAAT,CAA8B9sG,MAA9B,EAAsCH,IAAtC,EAA4CmQ,GAA5C,EAAiDqhB,SAAjD,EAA6D;;AAE5D,MAAKrxB,MAAL,GAAcA,MAAd;;AAEA,MAAKH,IAAL,GAAcA,SAASlrB,SAAX,GAAyBkrB,IAAzB,GAAgC,CAA5C;;AAEA,KAAI2Q,QAAUR,QAAQr7B,SAAV,GAAwBq7B,GAAxB,GAA8B,QAA1C;;AAEA,KAAI9T,QAAUm1B,cAAc18C,SAAhB,GAA8B08C,SAA9B,GAA0C,CAAtD;;AAEA;;AAEA,KAAI07E,WAAW,CAAf;;AAEA,KAAIC,cAAc,KAAKhtG,MAAL,CAAYY,QAA9B;;AAEA,KAAKosG,eAAeA,YAAYnsG,UAAhC,EAA6C;;AAE5CksG,aAAWC,YAAY/qF,KAAZ,CAAkBhsC,MAAlB,GAA2B,CAAtC;AAEA,EAJD,MAIO,IAAK+2H,eAAeA,YAAYjsG,gBAAhC,EAAmD;;AAEzDgsG,aAAWC,YAAYhsG,UAAZ,CAAuBzI,MAAvB,CAA8B1K,KAAzC;AAEA;;AAED;;AAEA,KAAI+S,WAAW,IAAIyqB,cAAJ,EAAf;;AAEA,KAAI9H,YAAY,IAAI+G,sBAAJ,CAA4ByiF,WAAW,CAAX,GAAe,CAA3C,EAA8C,CAA9C,CAAhB;;AAEAnsG,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmCnI,SAAnC;;AAEAm5C,cAAarmF,IAAb,CAAmB,IAAnB,EAAyBuqB,QAAzB,EAAmC,IAAI8tC,iBAAJ,CAAuB,EAAEl+B,OAAOA,KAAT,EAAgB6gB,WAAWn1B,KAA3B,EAAvB,CAAnC;;AAEA;;AAEA,MAAKnB,gBAAL,GAAwB,KAAxB;;AAEA,MAAKjH,MAAL;AAEA;;AAEDg5G,oBAAoBz3H,SAApB,GAAgCC,OAAOgmB,MAAP,CAAeohE,aAAarnF,SAA5B,CAAhC;AACAy3H,oBAAoBz3H,SAApB,CAA8B0O,WAA9B,GAA4C+oH,mBAA5C;;AAEAA,oBAAoBz3H,SAApB,CAA8Bye,MAA9B,GAAyC,YAAY;;AAEpD,KAAIjN,KAAK,IAAI8C,OAAJ,EAAT;AACA,KAAI7C,KAAK,IAAI6C,OAAJ,EAAT;AACA,KAAImc,eAAe,IAAI5M,OAAJ,EAAnB;;AAEA,QAAO,SAASpF,MAAT,GAAkB;;AAExB,MAAIu5B,OAAO,CAAE,GAAF,EAAO,GAAP,EAAY,GAAZ,CAAX;;AAEA,OAAKrtB,MAAL,CAAYiB,iBAAZ,CAA+B,IAA/B;;AAEA6E,eAAaxM,eAAb,CAA8B,KAAK0G,MAAL,CAAYvI,WAA1C;;AAEA,MAAIA,cAAc,KAAKuI,MAAL,CAAYvI,WAA9B;;AAEA,MAAI3H,WAAW,KAAK8Q,QAAL,CAAcI,UAAd,CAAyBlR,QAAxC;;AAEA;;AAEA,MAAIk9G,cAAc,KAAKhtG,MAAL,CAAYY,QAA9B;;AAEA,MAAKosG,eAAeA,YAAYnsG,UAAhC,EAA6C;;AAE5C,OAAIC,WAAWksG,YAAYlsG,QAA3B;;AAEA,OAAImhB,QAAQ+qF,YAAY/qF,KAAxB;;AAEA,OAAI4E,MAAM,CAAV;;AAEA,QAAM,IAAIvvC,IAAI,CAAR,EAAWC,IAAI0qC,MAAMhsC,MAA3B,EAAmCqB,IAAIC,CAAvC,EAA0CD,GAA1C,EAAiD;;AAEhD,QAAI2rC,OAAOhB,MAAO3qC,CAAP,CAAX;;AAEA,SAAM,IAAIirB,IAAI,CAAR,EAAW2gB,KAAKD,KAAKrB,aAAL,CAAmB3rC,MAAzC,EAAiDssB,IAAI2gB,EAArD,EAAyD3gB,GAAzD,EAAgE;;AAE/D,SAAIygB,SAASliB,SAAUmiB,KAAMoK,KAAM9qB,CAAN,CAAN,CAAV,CAAb;;AAEA,SAAIhK,SAAS0qB,KAAKrB,aAAL,CAAoBrf,CAApB,CAAb;;AAEA1b,QAAG7C,IAAH,CAASg/B,MAAT,EAAkBj1B,YAAlB,CAAgC0J,WAAhC;;AAEA3Q,QAAG9C,IAAH,CAASuU,MAAT,EAAkBpT,YAAlB,CAAgC2gB,YAAhC,EAA+C5f,SAA/C,GAA2DlB,cAA3D,CAA2E,KAAK6a,IAAhF,EAAuF3b,GAAvF,CAA4F2C,EAA5F;;AAEAiJ,cAAS9B,MAAT,CAAiB64B,GAAjB,EAAsBhgC,GAAG1R,CAAzB,EAA4B0R,GAAG9E,CAA/B,EAAkC8E,GAAG4C,CAArC;;AAEAo9B,WAAMA,MAAM,CAAZ;;AAEA/2B,cAAS9B,MAAT,CAAiB64B,GAAjB,EAAsB//B,GAAG3R,CAAzB,EAA4B2R,GAAG/E,CAA/B,EAAkC+E,GAAG2C,CAArC;;AAEAo9B,WAAMA,MAAM,CAAZ;AAEA;AAED;AAED,GAlCD,MAkCO,IAAKmmF,eAAeA,YAAYjsG,gBAAhC,EAAmD;;AAEzD,OAAIksG,SAASD,YAAYhsG,UAAZ,CAAuBlR,QAApC;;AAEA,OAAIo9G,UAAUF,YAAYhsG,UAAZ,CAAuBzI,MAArC;;AAEA,OAAIsuB,MAAM,CAAV;;AAEA;;AAEA,QAAM,IAAItkB,IAAI,CAAR,EAAW2gB,KAAK+pF,OAAOp/G,KAA7B,EAAoC0U,IAAI2gB,EAAxC,EAA4C3gB,GAA5C,EAAmD;;AAElD1b,OAAGxD,GAAH,CAAQ4pH,OAAO5lH,IAAP,CAAakb,CAAb,CAAR,EAA0B0qG,OAAO3lH,IAAP,CAAaib,CAAb,CAA1B,EAA4C0qG,OAAOn/G,IAAP,CAAayU,CAAb,CAA5C,EAA+DxU,YAA/D,CAA6E0J,WAA7E;;AAEA3Q,OAAGzD,GAAH,CAAQ6pH,QAAQ7lH,IAAR,CAAckb,CAAd,CAAR,EAA2B2qG,QAAQ5lH,IAAR,CAAcib,CAAd,CAA3B,EAA8C2qG,QAAQp/G,IAAR,CAAcyU,CAAd,CAA9C;;AAEAzb,OAAG3B,YAAH,CAAiB2gB,YAAjB,EAAgC5f,SAAhC,GAA4ClB,cAA5C,CAA4D,KAAK6a,IAAjE,EAAwE3b,GAAxE,CAA6E2C,EAA7E;;AAEAiJ,aAAS9B,MAAT,CAAiB64B,GAAjB,EAAsBhgC,GAAG1R,CAAzB,EAA4B0R,GAAG9E,CAA/B,EAAkC8E,GAAG4C,CAArC;;AAEAo9B,UAAMA,MAAM,CAAZ;;AAEA/2B,aAAS9B,MAAT,CAAiB64B,GAAjB,EAAsB//B,GAAG3R,CAAzB,EAA4B2R,GAAG/E,CAA/B,EAAkC+E,GAAG2C,CAArC;;AAEAo9B,UAAMA,MAAM,CAAZ;AAEA;AAED;;AAED/2B,WAASk8B,WAAT,GAAuB,IAAvB;AAEA,EAlFD;AAoFA,CA1FwC,EAAzC;;AA4FA;;;;;;AAMA,SAASmhF,eAAT,CAA0Bx7D,KAA1B,EAAiCnhC,KAAjC,EAAyC;;AAExC4L,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKs7D,KAAL,GAAaA,KAAb;AACA,MAAKA,KAAL,CAAW1wC,iBAAX;;AAEA,MAAK5P,MAAL,GAAcsgD,MAAMl6C,WAApB;AACA,MAAKsD,gBAAL,GAAwB,KAAxB;;AAEA,MAAKyV,KAAL,GAAaA,KAAb;;AAEA,KAAI5P,WAAW,IAAIyqB,cAAJ,EAAf;;AAEA,KAAI9H,YAAY,CACf,CADe,EACZ,CADY,EACT,CADS,EACL,CADK,EACF,CADE,EACC,CADD,EAEf,CAFe,EAEZ,CAFY,EAET,CAFS,EAEL,CAFK,EAEF,CAFE,EAEC,CAFD,EAGf,CAHe,EAGZ,CAHY,EAGT,CAHS,EAGN,CAAE,CAHI,EAGD,CAHC,EAGE,CAHF,EAIf,CAJe,EAIZ,CAJY,EAIT,CAJS,EAIL,CAJK,EAIF,CAJE,EAIC,CAJD,EAKf,CALe,EAKZ,CALY,EAKT,CALS,EAKL,CALK,EAKF,CAAE,CALA,EAKG,CALH,CAAhB;;AAQA,MAAM,IAAIjsC,IAAI,CAAR,EAAWirB,IAAI,CAAf,EAAkBhrB,IAAI,EAA5B,EAAgCD,IAAIC,CAApC,EAAuCD,KAAMirB,GAA7C,EAAoD;;AAEnD,MAAIE,KAAOnrB,IAAIC,CAAN,GAAY3C,KAAK4L,EAAjB,GAAsB,CAA/B;AACA,MAAIkiB,KAAOH,IAAIhrB,CAAN,GAAY3C,KAAK4L,EAAjB,GAAsB,CAA/B;;AAEA+iC,YAAU1sC,IAAV,CACCjC,KAAK8S,GAAL,CAAU+a,EAAV,CADD,EACiB7tB,KAAK+S,GAAL,CAAU8a,EAAV,CADjB,EACiC,CADjC,EAEC7tB,KAAK8S,GAAL,CAAUgb,EAAV,CAFD,EAEiB9tB,KAAK+S,GAAL,CAAU+a,EAAV,CAFjB,EAEiC,CAFjC;AAKA;;AAED9B,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAIpB,sBAAJ,CAA4B/G,SAA5B,EAAuC,CAAvC,CAAnC;;AAEA,KAAIvD,WAAW,IAAI0uB,iBAAJ,CAAuB,EAAEt6B,KAAK,KAAP,EAAvB,CAAf;;AAEA,MAAKg5F,IAAL,GAAY,IAAI1wC,YAAJ,CAAkB97D,QAAlB,EAA4Bof,QAA5B,CAAZ;AACA,MAAK97B,GAAL,CAAU,KAAKkpH,IAAf;;AAEA,MAAKt5G,MAAL;AAEA;;AAEDq5G,gBAAgB93H,SAAhB,GAA4BC,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAA5B;AACA83H,gBAAgB93H,SAAhB,CAA0B0O,WAA1B,GAAwCopH,eAAxC;;AAEAA,gBAAgB93H,SAAhB,CAA0B0nB,OAA1B,GAAoC,YAAY;;AAE/C,MAAKqwG,IAAL,CAAUxsG,QAAV,CAAmB7D,OAAnB;AACA,MAAKqwG,IAAL,CAAUptF,QAAV,CAAmBjjB,OAAnB;AAEA,CALD;;AAOAowG,gBAAgB93H,SAAhB,CAA0Bye,MAA1B,GAAmC,YAAY;;AAE9C,KAAI1C,SAAS,IAAIzH,OAAJ,EAAb;AACA,KAAI8iF,UAAU,IAAI9iF,OAAJ,EAAd;;AAEA,QAAO,SAASmK,MAAT,GAAkB;;AAExB,OAAK69C,KAAL,CAAW1wC,iBAAX;;AAEA,MAAIosG,aAAa,KAAK17D,KAAL,CAAW9pC,QAAX,GAAsB,KAAK8pC,KAAL,CAAW9pC,QAAjC,GAA4C,IAA7D;AACA,MAAIylG,YAAYD,aAAaz4H,KAAK60E,GAAL,CAAU,KAAK9X,KAAL,CAAWxrD,KAArB,CAA7B;;AAEA,OAAKinH,IAAL,CAAUt+G,KAAV,CAAgBzL,GAAhB,CAAqBiqH,SAArB,EAAgCA,SAAhC,EAA2CD,UAA3C;;AAEAj8G,SAAO4H,qBAAP,CAA8B,KAAK24C,KAAL,CAAWl6C,WAAzC;AACAg1E,UAAQzzE,qBAAR,CAA+B,KAAK24C,KAAL,CAAW/7D,MAAX,CAAkB6hB,WAAjD;;AAEA,OAAK21G,IAAL,CAAU9hH,MAAV,CAAkBmhF,QAAQ7nF,GAAR,CAAawM,MAAb,CAAlB;;AAEA,MAAK,KAAKof,KAAL,KAAe77B,SAApB,EAAgC;;AAE/B,QAAKy4H,IAAL,CAAUptF,QAAV,CAAmBxP,KAAnB,CAAyBntB,GAAzB,CAA8B,KAAKmtB,KAAnC;AAEA,GAJD,MAIO;;AAEN,QAAK48F,IAAL,CAAUptF,QAAV,CAAmBxP,KAAnB,CAAyBxsB,IAAzB,CAA+B,KAAK2tD,KAAL,CAAWnhC,KAA1C;AAEA;AAED,EAxBD;AA0BA,CA/BkC,EAAnC;;AAiCA;;;;;;;;AAQA,SAAS+8F,WAAT,CAAsBvtG,MAAtB,EAA+B;;AAE9B,KAAIwtG,WAAW,EAAf;;AAEA,KAAKxtG,UAAUA,OAAOo7D,MAAtB,EAA+B;;AAE9BoyC,WAAS32H,IAAT,CAAempB,MAAf;AAEA;;AAED,MAAM,IAAI1oB,IAAI,CAAd,EAAiBA,IAAI0oB,OAAOsc,QAAP,CAAgBrmC,MAArC,EAA6CqB,GAA7C,EAAoD;;AAEnDk2H,WAAS32H,IAAT,CAAckqE,KAAd,CAAqBysD,QAArB,EAA+BD,YAAavtG,OAAOsc,QAAP,CAAiBhlC,CAAjB,CAAb,CAA/B;AAEA;;AAED,QAAOk2H,QAAP;AAEA;;AAED,SAASC,cAAT,CAAyBztG,MAAzB,EAAkC;;AAEjC,KAAIivC,QAAQs+D,YAAavtG,MAAb,CAAZ;;AAEA,KAAIY,WAAW,IAAIyqB,cAAJ,EAAf;;AAEA,KAAIvqB,WAAW,EAAf;AACA,KAAIkhB,SAAS,EAAb;;AAEA,KAAIpQ,SAAS,IAAIhC,KAAJ,CAAW,CAAX,EAAc,CAAd,EAAiB,CAAjB,CAAb;AACA,KAAIiC,SAAS,IAAIjC,KAAJ,CAAW,CAAX,EAAc,CAAd,EAAiB,CAAjB,CAAb;;AAEA,MAAM,IAAIt4B,IAAI,CAAd,EAAiBA,IAAI23D,MAAMh5D,MAA3B,EAAmCqB,GAAnC,EAA0C;;AAEzC,MAAI6jF,OAAOlsB,MAAO33D,CAAP,CAAX;;AAEA,MAAK6jF,KAAK9+C,MAAL,IAAe8+C,KAAK9+C,MAAL,CAAY++C,MAAhC,EAAyC;;AAExCt6D,YAASjqB,IAAT,CAAe,CAAf,EAAkB,CAAlB,EAAqB,CAArB;AACAiqB,YAASjqB,IAAT,CAAe,CAAf,EAAkB,CAAlB,EAAqB,CAArB;AACAmrC,UAAOnrC,IAAP,CAAa+6B,OAAO1c,CAApB,EAAuB0c,OAAOvY,CAA9B,EAAiCuY,OAAOltB,CAAxC;AACAs9B,UAAOnrC,IAAP,CAAag7B,OAAO3c,CAApB,EAAuB2c,OAAOxY,CAA9B,EAAiCwY,OAAOntB,CAAxC;AAEA;AAED;;AAEDkc,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAAnC;AACAF,UAAS8qB,YAAT,CAAuB,OAAvB,EAAgC,IAAIpB,sBAAJ,CAA4BtI,MAA5B,EAAoC,CAApC,CAAhC;;AAEA,KAAIhC,WAAW,IAAI0uB,iBAAJ,CAAuB,EAAE7sB,cAAchpC,YAAhB,EAA8Bk3C,WAAW,KAAzC,EAAgDC,YAAY,KAA5D,EAAmET,aAAa,IAAhF,EAAvB,CAAf;;AAEAmtC,cAAarmF,IAAb,CAAmB,IAAnB,EAAyBuqB,QAAzB,EAAmCof,QAAnC;;AAEA,MAAKi8E,IAAL,GAAYj8F,MAAZ;AACA,MAAKivC,KAAL,GAAaA,KAAb;;AAEA,MAAK59C,MAAL,GAAc2O,OAAOvI,WAArB;AACA,MAAKsD,gBAAL,GAAwB,KAAxB;AAEA;;AAED0yG,eAAep4H,SAAf,GAA2BC,OAAOgmB,MAAP,CAAeohE,aAAarnF,SAA5B,CAA3B;AACAo4H,eAAep4H,SAAf,CAAyB0O,WAAzB,GAAuC0pH,cAAvC;;AAEAA,eAAep4H,SAAf,CAAyB4rB,iBAAzB,GAA6C,YAAY;;AAExD,KAAI7P,SAAS,IAAIzH,OAAJ,EAAb;;AAEA,KAAI+jH,aAAa,IAAI9lH,OAAJ,EAAjB;AACA,KAAI+lH,iBAAiB,IAAI/lH,OAAJ,EAArB;;AAEA,QAAO,SAASqZ,iBAAT,CAA4Boe,KAA5B,EAAoC;;AAE1C,MAAI4vB,QAAQ,KAAKA,KAAjB;;AAEA,MAAIruC,WAAW,KAAKA,QAApB;AACA,MAAI9Q,WAAW8Q,SAAS+qB,YAAT,CAAuB,UAAvB,CAAf;;AAEAgiF,iBAAet/G,UAAf,CAA2B,KAAK4tG,IAAL,CAAUxkG,WAArC;;AAEA,OAAM,IAAIngB,IAAI,CAAR,EAAWirB,IAAI,CAArB,EAAwBjrB,IAAI23D,MAAMh5D,MAAlC,EAA0CqB,GAA1C,EAAiD;;AAEhD,OAAI6jF,OAAOlsB,MAAO33D,CAAP,CAAX;;AAEA,OAAK6jF,KAAK9+C,MAAL,IAAe8+C,KAAK9+C,MAAL,CAAY++C,MAAhC,EAAyC;;AAExCsyC,eAAWhiH,gBAAX,CAA6BiiH,cAA7B,EAA6CxyC,KAAK1jE,WAAlD;AACArG,WAAO4H,qBAAP,CAA8B00G,UAA9B;AACA59G,aAAS9B,MAAT,CAAiBuU,CAAjB,EAAoBnR,OAAOjc,CAA3B,EAA8Bic,OAAOrP,CAArC,EAAwCqP,OAAO3H,CAA/C;;AAEAikH,eAAWhiH,gBAAX,CAA6BiiH,cAA7B,EAA6CxyC,KAAK9+C,MAAL,CAAY5kB,WAAzD;AACArG,WAAO4H,qBAAP,CAA8B00G,UAA9B;AACA59G,aAAS9B,MAAT,CAAiBuU,IAAI,CAArB,EAAwBnR,OAAOjc,CAA/B,EAAkCic,OAAOrP,CAAzC,EAA4CqP,OAAO3H,CAAnD;;AAEA8Y,SAAK,CAAL;AAEA;AAED;;AAED3B,WAAS+qB,YAAT,CAAuB,UAAvB,EAAoCK,WAApC,GAAkD,IAAlD;;AAEA5P,WAAS/mC,SAAT,CAAmB4rB,iBAAnB,CAAqC5qB,IAArC,CAA2C,IAA3C,EAAiDgpC,KAAjD;AAEA,EAjCD;AAmCA,CA1C4C,EAA7C;;AA4CA;;;;;AAKA,SAASuuF,gBAAT,CAA2Bj8D,KAA3B,EAAkCk8D,UAAlC,EAA8Cr9F,KAA9C,EAAsD;;AAErD,MAAKmhC,KAAL,GAAaA,KAAb;AACA,MAAKA,KAAL,CAAW1wC,iBAAX;;AAEA,MAAKuP,KAAL,GAAaA,KAAb;;AAEA,KAAI5P,WAAW,IAAIytE,oBAAJ,CAA0Bw/B,UAA1B,EAAsC,CAAtC,EAAyC,CAAzC,CAAf;AACA,KAAI7tF,WAAW,IAAI8R,iBAAJ,CAAuB,EAAEP,WAAW,IAAb,EAAmBnd,KAAK,KAAxB,EAAvB,CAAf;;AAEAqjB,MAAKphD,IAAL,CAAW,IAAX,EAAiBuqB,QAAjB,EAA2Bof,QAA3B;;AAEA,MAAK3uB,MAAL,GAAc,KAAKsgD,KAAL,CAAWl6C,WAAzB;AACA,MAAKsD,gBAAL,GAAwB,KAAxB;;AAEA,MAAKjH,MAAL;;AAGA;;;;;;;;;;;;;AAsBA;;AAED85G,iBAAiBv4H,SAAjB,GAA6BC,OAAOgmB,MAAP,CAAem8B,KAAKpiD,SAApB,CAA7B;AACAu4H,iBAAiBv4H,SAAjB,CAA2B0O,WAA3B,GAAyC6pH,gBAAzC;;AAEAA,iBAAiBv4H,SAAjB,CAA2B0nB,OAA3B,GAAqC,YAAY;;AAEhD,MAAK6D,QAAL,CAAc7D,OAAd;AACA,MAAKijB,QAAL,CAAcjjB,OAAd;AAEA,CALD;;AAOA6wG,iBAAiBv4H,SAAjB,CAA2Bye,MAA3B,GAAoC,YAAY;;AAE/C,KAAK,KAAK0c,KAAL,KAAe77B,SAApB,EAAgC;;AAE/B,OAAKqrC,QAAL,CAAcxP,KAAd,CAAoBntB,GAApB,CAAyB,KAAKmtB,KAA9B;AAEA,EAJD,MAIO;;AAEN,OAAKwP,QAAL,CAAcxP,KAAd,CAAoBxsB,IAApB,CAA0B,KAAK2tD,KAAL,CAAWnhC,KAArC;AAEA;;AAED;;;;;;;;;AAeA,CA3BD;;AA6BA;;;;;;AAMA,SAASs9F,mBAAT,CAA8Bn8D,KAA9B,EAAqCnhC,KAArC,EAA6C;;AAE5C4L,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKs7D,KAAL,GAAaA,KAAb;AACA,MAAKA,KAAL,CAAW1wC,iBAAX;;AAEA,MAAK5P,MAAL,GAAcsgD,MAAMl6C,WAApB;AACA,MAAKsD,gBAAL,GAAwB,KAAxB;;AAEA,MAAKyV,KAAL,GAAaA,KAAb;;AAEA,KAAIwP,WAAW,IAAI0uB,iBAAJ,CAAuB,EAAEt6B,KAAK,KAAP,EAAvB,CAAf;;AAEA,KAAIxT,WAAW,IAAIyqB,cAAJ,EAAf;;AAEAzqB,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAI9C,eAAJ,CAAqB,IAAIpP,YAAJ,CAAkB,IAAI,CAAtB,CAArB,EAAgD,CAAhD,CAAnC;;AAEA,MAAKtU,IAAL,GAAY,IAAIu3D,IAAJ,CAAU77D,QAAV,EAAoBof,QAApB,CAAZ;AACA,MAAK97B,GAAL,CAAU,KAAKghB,IAAf;;AAGA,MAAKpR,MAAL;AAEA;;AAEDg6G,oBAAoBz4H,SAApB,GAAgCC,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAhC;AACAy4H,oBAAoBz4H,SAApB,CAA8B0O,WAA9B,GAA4C+pH,mBAA5C;;AAEAA,oBAAoBz4H,SAApB,CAA8B0nB,OAA9B,GAAwC,YAAY;;AAEnD,MAAKuf,QAAL,CAAe,CAAf,EAAmB1b,QAAnB,CAA4B7D,OAA5B;AACA,MAAKuf,QAAL,CAAe,CAAf,EAAmB0D,QAAnB,CAA4BjjB,OAA5B;AAEA,CALD;;AAOA+wG,oBAAoBz4H,SAApB,CAA8Bye,MAA9B,GAAuC,YAAY;;AAElD;;AAEA,KAAIiyE,KAAK,KAAKp0B,KAAL,CAAWz1C,KAAX,GAAmB,GAA5B;AACA,KAAI8pE,KAAK,KAAKr0B,KAAL,CAAWx1C,MAAX,GAAoB,GAA7B;;AAEA,KAAIrM,WAAW,KAAKoV,IAAL,CAAUtE,QAAV,CAAmBI,UAAnB,CAA8BlR,QAA7C;AACA,KAAI1Y,QAAQ0Y,SAAS1Y,KAArB;;AAEA;;AAEAA,OAAO,CAAP,IAAa2uF,EAAb,CAAiB3uF,MAAO,CAAP,IAAa,CAAE4uF,EAAf,CAAmB5uF,MAAO,CAAP,IAAa,CAAb;AACpCA,OAAO,CAAP,IAAa2uF,EAAb,CAAiB3uF,MAAO,CAAP,IAAa4uF,EAAb,CAAiB5uF,MAAO,CAAP,IAAa,CAAb;AAClCA,OAAO,CAAP,IAAa,CAAE2uF,EAAf,CAAmB3uF,MAAO,CAAP,IAAa4uF,EAAb,CAAiB5uF,MAAO,CAAP,IAAa,CAAb;AACpCA,OAAO,CAAP,IAAa,CAAE2uF,EAAf,CAAmB3uF,MAAO,EAAP,IAAc,CAAE4uF,EAAhB,CAAoB5uF,MAAO,EAAP,IAAc,CAAd;AACvCA,OAAO,EAAP,IAAc2uF,EAAd,CAAkB3uF,MAAO,EAAP,IAAc,CAAE4uF,EAAhB,CAAoB5uF,MAAO,EAAP,IAAc,CAAd;;AAEtC0Y,UAASk8B,WAAT,GAAuB,IAAvB;;AAEA,KAAK,KAAKxb,KAAL,KAAe77B,SAApB,EAAgC;;AAE/B,OAAKuwB,IAAL,CAAU8a,QAAV,CAAmBxP,KAAnB,CAAyBntB,GAAzB,CAA8B,KAAKmtB,KAAnC;AAEA,EAJD,MAIO;;AAEN,OAAKtL,IAAL,CAAU8a,QAAV,CAAmBxP,KAAnB,CAAyBxsB,IAAzB,CAA+B,KAAK2tD,KAAL,CAAWnhC,KAA1C;AAEA;AAED,CA9BD;;AAgCA;;;;;;AAMA,SAASu9F,qBAAT,CAAgCp8D,KAAhC,EAAuC9xC,IAAvC,EAA6C2Q,KAA7C,EAAqD;;AAEpD4L,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKs7D,KAAL,GAAaA,KAAb;AACA,MAAKA,KAAL,CAAW1wC,iBAAX;;AAEA,MAAK5P,MAAL,GAAcsgD,MAAMl6C,WAApB;AACA,MAAKsD,gBAAL,GAAwB,KAAxB;;AAEA,MAAKyV,KAAL,GAAaA,KAAb;;AAEA,KAAI5P,WAAW,IAAIggE,wBAAJ,CAA8B/gE,IAA9B,CAAf;AACAe,UAASod,OAAT,CAAkBppC,KAAK4L,EAAL,GAAU,GAA5B;;AAEA,MAAKw/B,QAAL,GAAgB,IAAI8R,iBAAJ,CAAuB,EAAEP,WAAW,IAAb,EAAmBnd,KAAK,KAAxB,EAAvB,CAAhB;AACA,KAAK,KAAK5D,KAAL,KAAe77B,SAApB,EAAgC,KAAKqrC,QAAL,CAAc6B,YAAd,GAA6BhpC,YAA7B;;AAEhC,KAAIiX,WAAW8Q,SAAS+qB,YAAT,CAAuB,UAAvB,CAAf;AACA,KAAI3J,SAAS,IAAIxI,YAAJ,CAAkB1pB,SAASjC,KAAT,GAAiB,CAAnC,CAAb;;AAEA+S,UAAS8qB,YAAT,CAAuB,OAAvB,EAAgC,IAAI9C,eAAJ,CAAqB5G,MAArB,EAA6B,CAA7B,CAAhC;;AAEA,MAAK99B,GAAL,CAAU,IAAIuzC,IAAJ,CAAU72B,QAAV,EAAoB,KAAKof,QAAzB,CAAV;;AAEA,MAAKlsB,MAAL;AAEA;;AAEDi6G,sBAAsB14H,SAAtB,GAAkCC,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAlC;AACA04H,sBAAsB14H,SAAtB,CAAgC0O,WAAhC,GAA8CgqH,qBAA9C;;AAEAA,sBAAsB14H,SAAtB,CAAgC0nB,OAAhC,GAA0C,YAAY;;AAErD,MAAKuf,QAAL,CAAe,CAAf,EAAmB1b,QAAnB,CAA4B7D,OAA5B;AACA,MAAKuf,QAAL,CAAe,CAAf,EAAmB0D,QAAnB,CAA4BjjB,OAA5B;AAEA,CALD;;AAOAgxG,sBAAsB14H,SAAtB,CAAgCye,MAAhC,GAAyC,YAAY;;AAEpD,KAAI1C,SAAS,IAAIzH,OAAJ,EAAb;;AAEA,KAAIioB,SAAS,IAAIhC,KAAJ,EAAb;AACA,KAAIiC,SAAS,IAAIjC,KAAJ,EAAb;;AAEA,QAAO,SAAS9b,MAAT,GAAkB;;AAExB,MAAIsyB,OAAO,KAAK9J,QAAL,CAAe,CAAf,CAAX;;AAEA,MAAK,KAAK9L,KAAL,KAAe77B,SAApB,EAAgC;;AAE/B,QAAKqrC,QAAL,CAAcxP,KAAd,CAAoBntB,GAApB,CAAyB,KAAKmtB,KAA9B;AAEA,GAJD,MAIO;;AAEN,OAAIwR,SAASoE,KAAKxlB,QAAL,CAAc+qB,YAAd,CAA4B,OAA5B,CAAb;;AAEA/Z,UAAO5tB,IAAP,CAAa,KAAK2tD,KAAL,CAAWnhC,KAAxB;AACAqB,UAAO7tB,IAAP,CAAa,KAAK2tD,KAAL,CAAW37B,WAAxB;;AAEA,QAAM,IAAI1+B,IAAI,CAAR,EAAWC,IAAIyqC,OAAOn0B,KAA5B,EAAmCvW,IAAIC,CAAvC,EAA0CD,GAA1C,EAAiD;;AAEhD,QAAIk5B,QAAUl5B,IAAMC,IAAI,CAAZ,GAAoBq6B,MAApB,GAA6BC,MAAzC;;AAEAmQ,WAAOh0B,MAAP,CAAe1W,CAAf,EAAkBk5B,MAAMtb,CAAxB,EAA2Bsb,MAAMnX,CAAjC,EAAoCmX,MAAM9rB,CAA1C;AAEA;;AAEDs9B,UAAOgK,WAAP,GAAqB,IAArB;AAEA;;AAED5F,OAAK96B,MAAL,CAAa8F,OAAO4H,qBAAP,CAA8B,KAAK24C,KAAL,CAAWl6C,WAAzC,EAAuD7R,MAAvD,EAAb;AAEA,EA7BD;AA+BA,CAtCwC,EAAzC;;AAwCA;;;;AAIA,SAASooH,UAAT,CAAqBnuG,IAArB,EAA2Bi3E,SAA3B,EAAsCllE,MAAtC,EAA8CC,MAA9C,EAAuD;;AAEtDhS,QAAOA,QAAQ,EAAf;AACAi3E,aAAYA,aAAa,EAAzB;AACAllE,UAAS,IAAIhC,KAAJ,CAAWgC,WAAWj9B,SAAX,GAAuBi9B,MAAvB,GAAgC,QAA3C,CAAT;AACAC,UAAS,IAAIjC,KAAJ,CAAWiC,WAAWl9B,SAAX,GAAuBk9B,MAAvB,GAAgC,QAA3C,CAAT;;AAEA,KAAIrqB,SAASsvF,YAAY,CAAzB;AACA,KAAI3Z,OAAOt9D,OAAOi3E,SAAlB;AACA,KAAIh3E,WAAWD,OAAO,CAAtB;;AAEA,KAAIiB,WAAW,EAAf;AAAA,KAAmBkhB,SAAS,EAA5B;;AAEA,MAAM,IAAI1qC,IAAI,CAAR,EAAWirB,IAAI,CAAf,EAAkB8lB,IAAI,CAAEvoB,QAA9B,EAAwCxoB,KAAKw/F,SAA7C,EAAwDx/F,KAAM+wC,KAAK80C,IAAnE,EAA0E;;AAEzEr8D,WAASjqB,IAAT,CAAe,CAAEipB,QAAjB,EAA2B,CAA3B,EAA8BuoB,CAA9B,EAAiCvoB,QAAjC,EAA2C,CAA3C,EAA8CuoB,CAA9C;AACAvnB,WAASjqB,IAAT,CAAewxC,CAAf,EAAkB,CAAlB,EAAqB,CAAEvoB,QAAvB,EAAiCuoB,CAAjC,EAAoC,CAApC,EAAuCvoB,QAAvC;;AAEA,MAAI0Q,QAAQl5B,MAAMkQ,MAAN,GAAeoqB,MAAf,GAAwBC,MAApC;;AAEArB,QAAMtpB,OAAN,CAAe86B,MAAf,EAAuBzf,CAAvB,EAA4BA,KAAK,CAAL;AAC5BiO,QAAMtpB,OAAN,CAAe86B,MAAf,EAAuBzf,CAAvB,EAA4BA,KAAK,CAAL;AAC5BiO,QAAMtpB,OAAN,CAAe86B,MAAf,EAAuBzf,CAAvB,EAA4BA,KAAK,CAAL;AAC5BiO,QAAMtpB,OAAN,CAAe86B,MAAf,EAAuBzf,CAAvB,EAA4BA,KAAK,CAAL;AAE5B;;AAED,KAAI3B,WAAW,IAAIyqB,cAAJ,EAAf;AACAzqB,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAAnC;AACAF,UAAS8qB,YAAT,CAAuB,OAAvB,EAAgC,IAAIpB,sBAAJ,CAA4BtI,MAA5B,EAAoC,CAApC,CAAhC;;AAEA,KAAIhC,WAAW,IAAI0uB,iBAAJ,CAAuB,EAAE7sB,cAAchpC,YAAhB,EAAvB,CAAf;;AAEA6jF,cAAarmF,IAAb,CAAmB,IAAnB,EAAyBuqB,QAAzB,EAAmCof,QAAnC;AAEA;;AAEDguF,WAAW34H,SAAX,GAAuBC,OAAOgmB,MAAP,CAAeohE,aAAarnF,SAA5B,CAAvB;AACA24H,WAAW34H,SAAX,CAAqB0O,WAArB,GAAmCiqH,UAAnC;;AAEA;;;;;;AAMA,SAASC,eAAT,CAA0Bn1G,MAA1B,EAAkCo1G,OAAlC,EAA2CC,OAA3C,EAAoDr3B,SAApD,EAA+DllE,MAA/D,EAAuEC,MAAvE,EAAgF;;AAE/E/Y,UAASA,UAAU,EAAnB;AACAo1G,WAAUA,WAAW,EAArB;AACAC,WAAUA,WAAW,CAArB;AACAr3B,aAAYA,aAAa,EAAzB;AACAllE,UAAS,IAAIhC,KAAJ,CAAWgC,WAAWj9B,SAAX,GAAuBi9B,MAAvB,GAAgC,QAA3C,CAAT;AACAC,UAAS,IAAIjC,KAAJ,CAAWiC,WAAWl9B,SAAX,GAAuBk9B,MAAvB,GAAgC,QAA3C,CAAT;;AAEA,KAAI/Q,WAAW,EAAf;AACA,KAAIkhB,SAAS,EAAb;;AAEA,KAAI7sC,CAAJ,EAAOsU,CAAP;AACA,KAAIxF,CAAJ,EAAO3M,CAAP,EAAUirB,CAAV,EAAarN,CAAb,EAAgBsb,KAAhB;;AAEA;;AAEA,MAAMl5B,IAAI,CAAV,EAAaA,KAAK42H,OAAlB,EAA2B52H,GAA3B,EAAkC;;AAEjC2M,MAAM3M,IAAI42H,OAAN,IAAoBt5H,KAAK4L,EAAL,GAAU,CAA9B,CAAJ;;AAEArL,MAAIP,KAAK+S,GAAL,CAAU1D,CAAV,IAAgB6U,MAApB;AACArP,MAAI7U,KAAK8S,GAAL,CAAUzD,CAAV,IAAgB6U,MAApB;;AAEAgI,WAASjqB,IAAT,CAAe,CAAf,EAAkB,CAAlB,EAAqB,CAArB;AACAiqB,WAASjqB,IAAT,CAAe1B,CAAf,EAAkB,CAAlB,EAAqBsU,CAArB;;AAEA+mB,UAAUl5B,IAAI,CAAN,GAAYs6B,MAAZ,GAAqBC,MAA7B;;AAEAmQ,SAAOnrC,IAAP,CAAa25B,MAAMtb,CAAnB,EAAsBsb,MAAMnX,CAA5B,EAA+BmX,MAAM9rB,CAArC;AACAs9B,SAAOnrC,IAAP,CAAa25B,MAAMtb,CAAnB,EAAsBsb,MAAMnX,CAA5B,EAA+BmX,MAAM9rB,CAArC;AAEA;;AAED;;AAEA,MAAMpN,IAAI,CAAV,EAAaA,KAAK62H,OAAlB,EAA2B72H,GAA3B,EAAkC;;AAEjCk5B,UAAUl5B,IAAI,CAAN,GAAYs6B,MAAZ,GAAqBC,MAA7B;;AAEA3c,MAAI4D,SAAWA,SAASq1G,OAAT,GAAmB72H,CAAlC;;AAEA,OAAMirB,IAAI,CAAV,EAAaA,IAAIu0E,SAAjB,EAA4Bv0E,GAA5B,EAAmC;;AAElC;;AAEAte,OAAMse,IAAIu0E,SAAN,IAAsBliG,KAAK4L,EAAL,GAAU,CAAhC,CAAJ;;AAEArL,OAAIP,KAAK+S,GAAL,CAAU1D,CAAV,IAAgBiR,CAApB;AACAzL,OAAI7U,KAAK8S,GAAL,CAAUzD,CAAV,IAAgBiR,CAApB;;AAEA4L,YAASjqB,IAAT,CAAe1B,CAAf,EAAkB,CAAlB,EAAqBsU,CAArB;AACAu4B,UAAOnrC,IAAP,CAAa25B,MAAMtb,CAAnB,EAAsBsb,MAAMnX,CAA5B,EAA+BmX,MAAM9rB,CAArC;;AAEA;;AAEAT,OAAM,CAAEse,IAAI,CAAN,IAAYu0E,SAAd,IAA8BliG,KAAK4L,EAAL,GAAU,CAAxC,CAAJ;;AAEArL,OAAIP,KAAK+S,GAAL,CAAU1D,CAAV,IAAgBiR,CAApB;AACAzL,OAAI7U,KAAK8S,GAAL,CAAUzD,CAAV,IAAgBiR,CAApB;;AAEA4L,YAASjqB,IAAT,CAAe1B,CAAf,EAAkB,CAAlB,EAAqBsU,CAArB;AACAu4B,UAAOnrC,IAAP,CAAa25B,MAAMtb,CAAnB,EAAsBsb,MAAMnX,CAA5B,EAA+BmX,MAAM9rB,CAArC;AAEA;AAED;;AAED,KAAIkc,WAAW,IAAIyqB,cAAJ,EAAf;AACAzqB,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAAnC;AACAF,UAAS8qB,YAAT,CAAuB,OAAvB,EAAgC,IAAIpB,sBAAJ,CAA4BtI,MAA5B,EAAoC,CAApC,CAAhC;;AAEA,KAAIhC,WAAW,IAAI0uB,iBAAJ,CAAuB,EAAE7sB,cAAchpC,YAAhB,EAAvB,CAAf;;AAEA6jF,cAAarmF,IAAb,CAAmB,IAAnB,EAAyBuqB,QAAzB,EAAmCof,QAAnC;AAEA;;AAEDiuF,gBAAgB54H,SAAhB,GAA4BC,OAAOgmB,MAAP,CAAeohE,aAAarnF,SAA5B,CAA5B;AACA44H,gBAAgB54H,SAAhB,CAA0B0O,WAA1B,GAAwCkqH,eAAxC;;AAEA;;;;;AAKA,SAASG,iBAAT,CAA4BpuG,MAA5B,EAAoCH,IAApC,EAA0CmQ,GAA1C,EAA+CqhB,SAA/C,EAA2D;;AAE1D;;AAEA,MAAKrxB,MAAL,GAAcA,MAAd;;AAEA,MAAKH,IAAL,GAAcA,SAASlrB,SAAX,GAAyBkrB,IAAzB,GAAgC,CAA5C;;AAEA,KAAI2Q,QAAUR,QAAQr7B,SAAV,GAAwBq7B,GAAxB,GAA8B,QAA1C;;AAEA,KAAI9T,QAAUm1B,cAAc18C,SAAhB,GAA8B08C,SAA9B,GAA0C,CAAtD;;AAEA;;AAEA,KAAI07E,WAAW,CAAf;;AAEA,KAAIC,cAAc,KAAKhtG,MAAL,CAAYY,QAA9B;;AAEA,KAAKosG,eAAeA,YAAYnsG,UAAhC,EAA6C;;AAE5CksG,aAAWC,YAAY/qF,KAAZ,CAAkBhsC,MAA7B;AAEA,EAJD,MAIO;;AAENmO,UAAQC,IAAR,CAAc,oGAAd;AAEA;;AAED;;AAEA,KAAIuc,WAAW,IAAIyqB,cAAJ,EAAf;;AAEA,KAAI9H,YAAY,IAAI+G,sBAAJ,CAA4ByiF,WAAW,CAAX,GAAe,CAA3C,EAA8C,CAA9C,CAAhB;;AAEAnsG,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmCnI,SAAnC;;AAEAm5C,cAAarmF,IAAb,CAAmB,IAAnB,EAAyBuqB,QAAzB,EAAmC,IAAI8tC,iBAAJ,CAAuB,EAAEl+B,OAAOA,KAAT,EAAgB6gB,WAAWn1B,KAA3B,EAAvB,CAAnC;;AAEA;;AAEA,MAAKnB,gBAAL,GAAwB,KAAxB;AACA,MAAKjH,MAAL;AAEA;;AAEDs6G,kBAAkB/4H,SAAlB,GAA8BC,OAAOgmB,MAAP,CAAeohE,aAAarnF,SAA5B,CAA9B;AACA+4H,kBAAkB/4H,SAAlB,CAA4B0O,WAA5B,GAA0CqqH,iBAA1C;;AAEAA,kBAAkB/4H,SAAlB,CAA4Bye,MAA5B,GAAuC,YAAY;;AAElD,KAAIjN,KAAK,IAAI8C,OAAJ,EAAT;AACA,KAAI7C,KAAK,IAAI6C,OAAJ,EAAT;AACA,KAAImc,eAAe,IAAI5M,OAAJ,EAAnB;;AAEA,QAAO,SAASpF,MAAT,GAAkB;;AAExB,OAAKkM,MAAL,CAAYiB,iBAAZ,CAA+B,IAA/B;;AAEA6E,eAAaxM,eAAb,CAA8B,KAAK0G,MAAL,CAAYvI,WAA1C;;AAEA,MAAIA,cAAc,KAAKuI,MAAL,CAAYvI,WAA9B;;AAEA,MAAI3H,WAAW,KAAK8Q,QAAL,CAAcI,UAAd,CAAyBlR,QAAxC;;AAEA;;AAEA,MAAIk9G,cAAc,KAAKhtG,MAAL,CAAYY,QAA9B;;AAEA,MAAIE,WAAWksG,YAAYlsG,QAA3B;;AAEA,MAAImhB,QAAQ+qF,YAAY/qF,KAAxB;;AAEA,MAAI4E,MAAM,CAAV;;AAEA,OAAM,IAAIvvC,IAAI,CAAR,EAAWC,IAAI0qC,MAAMhsC,MAA3B,EAAmCqB,IAAIC,CAAvC,EAA0CD,GAA1C,EAAiD;;AAEhD,OAAI2rC,OAAOhB,MAAO3qC,CAAP,CAAX;;AAEA,OAAIihB,SAAS0qB,KAAK1qB,MAAlB;;AAEA1R,MAAG7C,IAAH,CAAS8c,SAAUmiB,KAAKx+B,CAAf,CAAT,EACEP,GADF,CACO4c,SAAUmiB,KAAKv+B,CAAf,CADP,EAEER,GAFF,CAEO4c,SAAUmiB,KAAKx7B,CAAf,CAFP,EAGEvC,YAHF,CAGgB,CAHhB,EAIE6I,YAJF,CAIgB0J,WAJhB;;AAMA3Q,MAAG9C,IAAH,CAASuU,MAAT,EAAkBpT,YAAlB,CAAgC2gB,YAAhC,EAA+C5f,SAA/C,GAA2DlB,cAA3D,CAA2E,KAAK6a,IAAhF,EAAuF3b,GAAvF,CAA4F2C,EAA5F;;AAEAiJ,YAAS9B,MAAT,CAAiB64B,GAAjB,EAAsBhgC,GAAG1R,CAAzB,EAA4B0R,GAAG9E,CAA/B,EAAkC8E,GAAG4C,CAArC;;AAEAo9B,SAAMA,MAAM,CAAZ;;AAEA/2B,YAAS9B,MAAT,CAAiB64B,GAAjB,EAAsB//B,GAAG3R,CAAzB,EAA4B2R,GAAG/E,CAA/B,EAAkC+E,GAAG2C,CAArC;;AAEAo9B,SAAMA,MAAM,CAAZ;AAEA;;AAED/2B,WAASk8B,WAAT,GAAuB,IAAvB;AAEA,EA9CD;AAgDA,CAtDsC,EAAvC;;AAwDA;;;;;;AAMA,SAASqiF,sBAAT,CAAiC18D,KAAjC,EAAwC9xC,IAAxC,EAA8C2Q,KAA9C,EAAsD;;AAErD4L,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,MAAKs7D,KAAL,GAAaA,KAAb;AACA,MAAKA,KAAL,CAAW1wC,iBAAX;;AAEA,MAAK5P,MAAL,GAAcsgD,MAAMl6C,WAApB;AACA,MAAKsD,gBAAL,GAAwB,KAAxB;;AAEA,MAAKyV,KAAL,GAAaA,KAAb;;AAEA,KAAK3Q,SAASlrB,SAAd,EAA0BkrB,OAAO,CAAP;;AAE1B,KAAIe,WAAW,IAAIyqB,cAAJ,EAAf;AACAzqB,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAIpB,sBAAJ,CAA4B,CAC9D,CAAEzqB,IAD4D,EACtDA,IADsD,EAChD,CADgD,EAE9DA,IAF8D,EAExDA,IAFwD,EAElD,CAFkD,EAG9DA,IAH8D,EAGxD,CAAEA,IAHsD,EAGhD,CAHgD,EAI9D,CAAEA,IAJ4D,EAItD,CAAEA,IAJoD,EAI9C,CAJ8C,EAK9D,CAAEA,IAL4D,EAKtDA,IALsD,EAKhD,CALgD,CAA5B,EAMhC,CANgC,CAAnC;;AAQA,KAAImgB,WAAW,IAAI0uB,iBAAJ,CAAuB,EAAEt6B,KAAK,KAAP,EAAvB,CAAf;;AAEA,MAAKk6F,UAAL,GAAkB,IAAI7xC,IAAJ,CAAU77D,QAAV,EAAoBof,QAApB,CAAlB;AACA,MAAK97B,GAAL,CAAU,KAAKoqH,UAAf;;AAEA1tG,YAAW,IAAIyqB,cAAJ,EAAX;AACAzqB,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAIpB,sBAAJ,CAA4B,CAAE,CAAF,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAX,EAAc,CAAd,EAAiB,CAAjB,CAA5B,EAAkD,CAAlD,CAAnC;;AAEA,MAAKikF,UAAL,GAAkB,IAAI9xC,IAAJ,CAAU77D,QAAV,EAAoBof,QAApB,CAAlB;AACA,MAAK97B,GAAL,CAAU,KAAKqqH,UAAf;;AAEA,MAAKz6G,MAAL;AAEA;;AAEDu6G,uBAAuBh5H,SAAvB,GAAmCC,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAnC;AACAg5H,uBAAuBh5H,SAAvB,CAAiC0O,WAAjC,GAA+CsqH,sBAA/C;;AAEAA,uBAAuBh5H,SAAvB,CAAiC0nB,OAAjC,GAA2C,YAAY;;AAEtD,MAAKuxG,UAAL,CAAgB1tG,QAAhB,CAAyB7D,OAAzB;AACA,MAAKuxG,UAAL,CAAgBtuF,QAAhB,CAAyBjjB,OAAzB;AACA,MAAKwxG,UAAL,CAAgB3tG,QAAhB,CAAyB7D,OAAzB;AACA,MAAKwxG,UAAL,CAAgBvuF,QAAhB,CAAyBjjB,OAAzB;AAEA,CAPD;;AASAsxG,uBAAuBh5H,SAAvB,CAAiCye,MAAjC,GAA0C,YAAY;;AAErD,KAAIjN,KAAK,IAAI8C,OAAJ,EAAT;AACA,KAAI7C,KAAK,IAAI6C,OAAJ,EAAT;AACA,KAAIuxF,KAAK,IAAIvxF,OAAJ,EAAT;;AAEA,QAAO,SAASmK,MAAT,GAAkB;;AAExBjN,KAAGmS,qBAAH,CAA0B,KAAK24C,KAAL,CAAWl6C,WAArC;AACA3Q,KAAGkS,qBAAH,CAA0B,KAAK24C,KAAL,CAAW/7D,MAAX,CAAkB6hB,WAA5C;AACAyjF,KAAGr2F,UAAH,CAAeiC,EAAf,EAAmBD,EAAnB;;AAEA,OAAKynH,UAAL,CAAgBhjH,MAAhB,CAAwB4vF,EAAxB;;AAEA,MAAK,KAAK1qE,KAAL,KAAe77B,SAApB,EAAgC;;AAE/B,QAAK25H,UAAL,CAAgBtuF,QAAhB,CAAyBxP,KAAzB,CAA+BntB,GAA/B,CAAoC,KAAKmtB,KAAzC;AACA,QAAK+9F,UAAL,CAAgBvuF,QAAhB,CAAyBxP,KAAzB,CAA+BntB,GAA/B,CAAoC,KAAKmtB,KAAzC;AAEA,GALD,MAKO;;AAEN,QAAK89F,UAAL,CAAgBtuF,QAAhB,CAAyBxP,KAAzB,CAA+BxsB,IAA/B,CAAqC,KAAK2tD,KAAL,CAAWnhC,KAAhD;AACA,QAAK+9F,UAAL,CAAgBvuF,QAAhB,CAAyBxP,KAAzB,CAA+BxsB,IAA/B,CAAqC,KAAK2tD,KAAL,CAAWnhC,KAAhD;AAEA;;AAED,OAAK+9F,UAAL,CAAgBjjH,MAAhB,CAAwB4vF,EAAxB;AACA,OAAKqzB,UAAL,CAAgBz/G,KAAhB,CAAsBrF,CAAtB,GAA0ByxF,GAAGjlG,MAAH,EAA1B;AAEA,EAvBD;AAyBA,CA/ByC,EAA1C;;AAiCA;;;;;;;;;;AAUA,SAASu4H,YAAT,CAAuBj3G,MAAvB,EAAgC;;AAE/B,KAAIqJ,WAAW,IAAIyqB,cAAJ,EAAf;AACA,KAAIrL,WAAW,IAAI0uB,iBAAJ,CAAuB,EAAEl+B,OAAO,QAAT,EAAmBqR,cAAcjpC,UAAjC,EAAvB,CAAf;;AAEA,KAAIkoB,WAAW,EAAf;AACA,KAAIkhB,SAAS,EAAb;;AAEA,KAAIysF,WAAW,EAAf;;AAEA;;AAEA,KAAIC,eAAe,IAAI9+F,KAAJ,CAAW,QAAX,CAAnB;AACA,KAAI++F,YAAY,IAAI/+F,KAAJ,CAAW,QAAX,CAAhB;AACA,KAAIg/F,UAAU,IAAIh/F,KAAJ,CAAW,QAAX,CAAd;AACA,KAAIi/F,cAAc,IAAIj/F,KAAJ,CAAW,QAAX,CAAlB;AACA,KAAIk/F,aAAa,IAAIl/F,KAAJ,CAAW,QAAX,CAAjB;;AAEA;;AAEAm/F,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;AACAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;AACAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;AACAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;;AAEA;;AAEAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;AACAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;AACAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;AACAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;;AAEA;;AAEAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;AACAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;AACAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;AACAK,SAAS,IAAT,EAAe,IAAf,EAAqBL,YAArB;;AAEA;;AAEAK,SAAS,GAAT,EAAc,IAAd,EAAoBJ,SAApB;AACAI,SAAS,GAAT,EAAc,IAAd,EAAoBJ,SAApB;AACAI,SAAS,GAAT,EAAc,IAAd,EAAoBJ,SAApB;AACAI,SAAS,GAAT,EAAc,IAAd,EAAoBJ,SAApB;;AAEA;;AAEAI,SAAS,IAAT,EAAe,IAAf,EAAqBH,OAArB;AACAG,SAAS,IAAT,EAAe,IAAf,EAAqBH,OAArB;AACAG,SAAS,IAAT,EAAe,IAAf,EAAqBH,OAArB;;AAEA;;AAEAG,SAAS,GAAT,EAAc,GAAd,EAAmBF,WAAnB;AACAE,SAAS,GAAT,EAAc,GAAd,EAAmBD,UAAnB;;AAEA;;AAEAC,SAAS,KAAT,EAAgB,KAAhB,EAAuBD,UAAvB;AACAC,SAAS,KAAT,EAAgB,KAAhB,EAAuBD,UAAvB;;AAEAC,SAAS,KAAT,EAAgB,KAAhB,EAAuBD,UAAvB;AACAC,SAAS,KAAT,EAAgB,KAAhB,EAAuBD,UAAvB;;AAEA,UAASC,OAAT,CAAkBtqH,CAAlB,EAAqBC,CAArB,EAAwB8rB,KAAxB,EAAgC;;AAE/Bw+F,WAAUvqH,CAAV,EAAa+rB,KAAb;AACAw+F,WAAUtqH,CAAV,EAAa8rB,KAAb;AAEA;;AAED,UAASw+F,QAAT,CAAmBtwF,EAAnB,EAAuBlO,KAAvB,EAA+B;;AAE9B1P,WAASjqB,IAAT,CAAe,CAAf,EAAkB,CAAlB,EAAqB,CAArB;AACAmrC,SAAOnrC,IAAP,CAAa25B,MAAMtb,CAAnB,EAAsBsb,MAAMnX,CAA5B,EAA+BmX,MAAM9rB,CAArC;;AAEA,MAAK+pH,SAAU/vF,EAAV,MAAmB/pC,SAAxB,EAAoC;;AAEnC85H,YAAU/vF,EAAV,IAAiB,EAAjB;AAEA;;AAED+vF,WAAU/vF,EAAV,EAAe7nC,IAAf,CAAuBiqB,SAAS7qB,MAAT,GAAkB,CAApB,GAA0B,CAA/C;AAEA;;AAED2qB,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAAnC;AACAF,UAAS8qB,YAAT,CAAuB,OAAvB,EAAgC,IAAIpB,sBAAJ,CAA4BtI,MAA5B,EAAoC,CAApC,CAAhC;;AAEA06C,cAAarmF,IAAb,CAAmB,IAAnB,EAAyBuqB,QAAzB,EAAmCof,QAAnC;;AAEA,MAAKzoB,MAAL,GAAcA,MAAd;AACA,KAAK,KAAKA,MAAL,CAAYspB,sBAAjB,EAA0C,KAAKtpB,MAAL,CAAYspB,sBAAZ;;AAE1C,MAAKxvB,MAAL,GAAckG,OAAOE,WAArB;AACA,MAAKsD,gBAAL,GAAwB,KAAxB;;AAEA,MAAK0zG,QAAL,GAAgBA,QAAhB;;AAEA,MAAK36G,MAAL;AAEA;;AAED06G,aAAan5H,SAAb,GAAyBC,OAAOgmB,MAAP,CAAeohE,aAAarnF,SAA5B,CAAzB;AACAm5H,aAAan5H,SAAb,CAAuB0O,WAAvB,GAAqCyqH,YAArC;;AAEAA,aAAan5H,SAAb,CAAuBye,MAAvB,GAAgC,YAAY;;AAE3C,KAAI8M,QAAJ,EAAc6tG,QAAd;;AAEA,KAAIr9G,SAAS,IAAIzH,OAAJ,EAAb;AACA,KAAI4N,SAAS,IAAIipB,MAAJ,EAAb;;AAEA,UAASyuF,QAAT,CAAmB3uG,KAAnB,EAA0BnrB,CAA1B,EAA6B4M,CAA7B,EAAgC0H,CAAhC,EAAoC;;AAEnC2H,SAAO/N,GAAP,CAAYlO,CAAZ,EAAe4M,CAAf,EAAkB0H,CAAlB,EAAsBiO,SAAtB,CAAiCH,MAAjC;;AAEA,MAAIiI,SAASivG,SAAUnuG,KAAV,CAAb;;AAEA,MAAKd,WAAW7qB,SAAhB,EAA4B;;AAE3B,OAAImb,WAAW8Q,SAAS+qB,YAAT,CAAuB,UAAvB,CAAf;;AAEA,QAAM,IAAIr0C,IAAI,CAAR,EAAWC,IAAIioB,OAAOvpB,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjDwY,aAAS9B,MAAT,CAAiBwR,OAAQloB,CAAR,CAAjB,EAA8B8Z,OAAOjc,CAArC,EAAwCic,OAAOrP,CAA/C,EAAkDqP,OAAO3H,CAAzD;AAEA;AAED;AAED;;AAED,QAAO,SAASqK,MAAT,GAAkB;;AAExB8M,aAAW,KAAKA,QAAhB;AACA6tG,aAAW,KAAKA,QAAhB;;AAEA,MAAItqH,IAAI,CAAR;AAAA,MAAW+N,IAAI,CAAf;;AAEA;AACA;;AAEAqF,SAAOC,gBAAP,CAAwBxT,IAAxB,CAA8B,KAAKuT,MAAL,CAAYC,gBAA1C;;AAEA;;AAEAy3G,WAAU,GAAV,EAAe,CAAf,EAAkB,CAAlB,EAAqB,CAAE,CAAvB;AACAA,WAAU,GAAV,EAAe,CAAf,EAAkB,CAAlB,EAAqB,CAArB;;AAEA;;AAEAA,WAAU,IAAV,EAAgB,CAAE9qH,CAAlB,EAAqB,CAAE+N,CAAvB,EAA0B,CAAE,CAA5B;AACA+8G,WAAU,IAAV,EAAgB9qH,CAAhB,EAAmB,CAAE+N,CAArB,EAAwB,CAAE,CAA1B;AACA+8G,WAAU,IAAV,EAAgB,CAAE9qH,CAAlB,EAAqB+N,CAArB,EAAwB,CAAE,CAA1B;AACA+8G,WAAU,IAAV,EAAgB9qH,CAAhB,EAAmB+N,CAAnB,EAAsB,CAAE,CAAxB;;AAEA;;AAEA+8G,WAAU,IAAV,EAAgB,CAAE9qH,CAAlB,EAAqB,CAAE+N,CAAvB,EAA0B,CAA1B;AACA+8G,WAAU,IAAV,EAAgB9qH,CAAhB,EAAmB,CAAE+N,CAArB,EAAwB,CAAxB;AACA+8G,WAAU,IAAV,EAAgB,CAAE9qH,CAAlB,EAAqB+N,CAArB,EAAwB,CAAxB;AACA+8G,WAAU,IAAV,EAAgB9qH,CAAhB,EAAmB+N,CAAnB,EAAsB,CAAtB;;AAEA;;AAEA+8G,WAAU,IAAV,EAAgB9qH,IAAI,GAApB,EAAyB+N,IAAI,GAA7B,EAAkC,CAAE,CAApC;AACA+8G,WAAU,IAAV,EAAgB,CAAE9qH,CAAF,GAAM,GAAtB,EAA2B+N,IAAI,GAA/B,EAAoC,CAAE,CAAtC;AACA+8G,WAAU,IAAV,EAAgB,CAAhB,EAAmB/8G,IAAI,CAAvB,EAA0B,CAAE,CAA5B;;AAEA;;AAEA+8G,WAAU,KAAV,EAAiB,CAAE9qH,CAAnB,EAAsB,CAAtB,EAAyB,CAAzB;AACA8qH,WAAU,KAAV,EAAiB9qH,CAAjB,EAAoB,CAApB,EAAuB,CAAvB;AACA8qH,WAAU,KAAV,EAAiB,CAAjB,EAAoB,CAAE/8G,CAAtB,EAAyB,CAAzB;AACA+8G,WAAU,KAAV,EAAiB,CAAjB,EAAoB/8G,CAApB,EAAuB,CAAvB;;AAEA+8G,WAAU,KAAV,EAAiB,CAAE9qH,CAAnB,EAAsB,CAAtB,EAAyB,CAAE,CAA3B;AACA8qH,WAAU,KAAV,EAAiB9qH,CAAjB,EAAoB,CAApB,EAAuB,CAAE,CAAzB;AACA8qH,WAAU,KAAV,EAAiB,CAAjB,EAAoB,CAAE/8G,CAAtB,EAAyB,CAAE,CAA3B;AACA+8G,WAAU,KAAV,EAAiB,CAAjB,EAAoB/8G,CAApB,EAAuB,CAAE,CAAzB;;AAEA0O,WAAS+qB,YAAT,CAAuB,UAAvB,EAAoCK,WAApC,GAAkD,IAAlD;AAEA,EAnDD;AAqDA,CAhF+B,EAAhC;;AAkFA;;;;;AAKA,SAASkjF,SAAT,CAAoBlvG,MAApB,EAA4BwQ,KAA5B,EAAoC;;AAEnC,MAAKxQ,MAAL,GAAcA,MAAd;;AAEA,KAAKwQ,UAAU77B,SAAf,EAA2B67B,QAAQ,QAAR;;AAE3B,KAAI8S,UAAU,IAAI5J,WAAJ,CAAiB,CAAE,CAAF,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAX,EAAc,CAAd,EAAiB,CAAjB,EAAoB,CAApB,EAAuB,CAAvB,EAA0B,CAA1B,EAA6B,CAA7B,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,CAAtC,EAAyC,CAAzC,EAA4C,CAA5C,EAA+C,CAA/C,EAAkD,CAAlD,EAAqD,CAArD,EAAwD,CAAxD,EAA2D,CAA3D,EAA8D,CAA9D,EAAiE,CAAjE,EAAoE,CAApE,EAAuE,CAAvE,CAAjB,CAAd;AACA,KAAI6J,YAAY,IAAI/J,YAAJ,CAAkB,IAAI,CAAtB,CAAhB;;AAEA,KAAI5Y,WAAW,IAAIyqB,cAAJ,EAAf;AACAzqB,UAAS6qB,QAAT,CAAmB,IAAI7C,eAAJ,CAAqBtF,OAArB,EAA8B,CAA9B,CAAnB;AACA1iB,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAI9C,eAAJ,CAAqBrF,SAArB,EAAgC,CAAhC,CAAnC;;AAEAm5C,cAAarmF,IAAb,CAAmB,IAAnB,EAAyBuqB,QAAzB,EAAmC,IAAI8tC,iBAAJ,CAAuB,EAAEl+B,OAAOA,KAAT,EAAvB,CAAnC;;AAEA,MAAKzV,gBAAL,GAAwB,KAAxB;;AAEA,MAAKjH,MAAL;AAEA;;AAEDo7G,UAAU75H,SAAV,GAAsBC,OAAOgmB,MAAP,CAAeohE,aAAarnF,SAA5B,CAAtB;AACA65H,UAAU75H,SAAV,CAAoB0O,WAApB,GAAkCmrH,SAAlC;;AAEAA,UAAU75H,SAAV,CAAoBye,MAApB,GAA+B,YAAY;;AAE1C,KAAIoM,MAAM,IAAItB,IAAJ,EAAV;;AAEA,QAAO,SAAS9K,MAAT,CAAiBkM,MAAjB,EAA0B;;AAEhC,MAAKA,WAAWrrB,SAAhB,EAA4B;;AAE3ByP,WAAQC,IAAR,CAAc,qDAAd;AAEA;;AAED,MAAK,KAAK2b,MAAL,KAAgBrrB,SAArB,EAAiC;;AAEhCurB,OAAIH,aAAJ,CAAmB,KAAKC,MAAxB;AAEA;;AAED,MAAKE,IAAIC,OAAJ,EAAL,EAAqB;;AAErB,MAAI/e,MAAM8e,IAAI9e,GAAd;AACA,MAAIC,MAAM6e,IAAI7e,GAAd;;AAEA;;;;;;;;;;;;;;;AAgBA,MAAIyO,WAAW,KAAK8Q,QAAL,CAAcI,UAAd,CAAyBlR,QAAxC;AACA,MAAI1Y,QAAQ0Y,SAAS1Y,KAArB;;AAEAA,QAAO,CAAP,IAAaiK,IAAIlM,CAAjB,CAAoBiC,MAAO,CAAP,IAAaiK,IAAIU,CAAjB,CAAoB3K,MAAO,CAAP,IAAaiK,IAAIoI,CAAjB;AACxCrS,QAAO,CAAP,IAAagK,IAAIjM,CAAjB,CAAoBiC,MAAO,CAAP,IAAaiK,IAAIU,CAAjB,CAAoB3K,MAAO,CAAP,IAAaiK,IAAIoI,CAAjB;AACxCrS,QAAO,CAAP,IAAagK,IAAIjM,CAAjB,CAAoBiC,MAAO,CAAP,IAAagK,IAAIW,CAAjB,CAAoB3K,MAAO,CAAP,IAAaiK,IAAIoI,CAAjB;AACxCrS,QAAO,CAAP,IAAaiK,IAAIlM,CAAjB,CAAoBiC,MAAO,EAAP,IAAcgK,IAAIW,CAAlB,CAAqB3K,MAAO,EAAP,IAAciK,IAAIoI,CAAlB;AACzCrS,QAAO,EAAP,IAAciK,IAAIlM,CAAlB,CAAqBiC,MAAO,EAAP,IAAciK,IAAIU,CAAlB,CAAqB3K,MAAO,EAAP,IAAcgK,IAAIqI,CAAlB;AAC1CrS,QAAO,EAAP,IAAcgK,IAAIjM,CAAlB,CAAqBiC,MAAO,EAAP,IAAciK,IAAIU,CAAlB,CAAqB3K,MAAO,EAAP,IAAcgK,IAAIqI,CAAlB;AAC1CrS,QAAO,EAAP,IAAcgK,IAAIjM,CAAlB,CAAqBiC,MAAO,EAAP,IAAcgK,IAAIW,CAAlB,CAAqB3K,MAAO,EAAP,IAAcgK,IAAIqI,CAAlB;AAC1CrS,QAAO,EAAP,IAAciK,IAAIlM,CAAlB,CAAqBiC,MAAO,EAAP,IAAcgK,IAAIW,CAAlB,CAAqB3K,MAAO,EAAP,IAAcgK,IAAIqI,CAAlB;;AAE1CqG,WAASk8B,WAAT,GAAuB,IAAvB;;AAEA,OAAKprB,QAAL,CAAc6G,qBAAd;AAEA,EAnDD;AAqDA,CAzD4B,EAA7B;;AA2DAynG,UAAU75H,SAAV,CAAoB0qB,aAApB,GAAoC,UAAWC,MAAX,EAAoB;;AAEvD,MAAKA,MAAL,GAAcA,MAAd;AACA,MAAKlM,MAAL;;AAEA,QAAO,IAAP;AAEA,CAPD;;AASA;;;;AAIA,SAASq7G,UAAT,CAAqBjvG,GAArB,EAA0B8P,GAA1B,EAAgC;;AAE/B,MAAKx5B,IAAL,GAAY,YAAZ;;AAEA,MAAK0pB,GAAL,GAAWA,GAAX;;AAEA,KAAIsQ,QAAUR,QAAQr7B,SAAV,GAAwBq7B,GAAxB,GAA8B,QAA1C;;AAEA,KAAIsT,UAAU,IAAI5J,WAAJ,CAAiB,CAAE,CAAF,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAX,EAAc,CAAd,EAAiB,CAAjB,EAAoB,CAApB,EAAuB,CAAvB,EAA0B,CAA1B,EAA6B,CAA7B,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,CAAtC,EAAyC,CAAzC,EAA4C,CAA5C,EAA+C,CAA/C,EAAkD,CAAlD,EAAqD,CAArD,EAAwD,CAAxD,EAA2D,CAA3D,EAA8D,CAA9D,EAAiE,CAAjE,EAAoE,CAApE,EAAuE,CAAvE,CAAjB,CAAd;;AAEA,KAAI6J,YAAY,CAAE,CAAF,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAE,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB,CAAE,CAAxB,EAA2B,CAAE,CAA7B,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,CAAE,CAAxC,EAA2C,CAA3C,EAA8C,CAA9C,EAAiD,CAAjD,EAAoD,CAAE,CAAtD,EAAyD,CAAE,CAA3D,EAA8D,CAA9D,EAAiE,CAAE,CAAnE,EAAsE,CAAE,CAAxE,EAA2E,CAAE,CAA7E,EAAgF,CAAE,CAAlF,EAAqF,CAArF,EAAwF,CAAE,CAA1F,EAA6F,CAAE,CAA/F,CAAhB;;AAEA,KAAI3iB,WAAW,IAAIyqB,cAAJ,EAAf;;AAEAzqB,UAAS6qB,QAAT,CAAmB,IAAI7C,eAAJ,CAAqBtF,OAArB,EAA8B,CAA9B,CAAnB;;AAEA1iB,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAIpB,sBAAJ,CAA4B/G,SAA5B,EAAuC,CAAvC,CAAnC;;AAEAm5C,cAAarmF,IAAb,CAAmB,IAAnB,EAAyBuqB,QAAzB,EAAmC,IAAI8tC,iBAAJ,CAAuB,EAAEl+B,OAAOA,KAAT,EAAvB,CAAnC;;AAEA,MAAK5P,QAAL,CAAc6G,qBAAd;AAEA;;AAED0nG,WAAW95H,SAAX,GAAuBC,OAAOgmB,MAAP,CAAeohE,aAAarnF,SAA5B,CAAvB;AACA85H,WAAW95H,SAAX,CAAqB0O,WAArB,GAAmCorH,UAAnC;;AAEAA,WAAW95H,SAAX,CAAqB4rB,iBAArB,GAAyC,UAAWoe,KAAX,EAAmB;;AAE3D,KAAInf,MAAM,KAAKA,GAAf;;AAEA,KAAKA,IAAIC,OAAJ,EAAL,EAAqB;;AAErBD,KAAIE,SAAJ,CAAe,KAAKtQ,QAApB;;AAEAoQ,KAAIG,OAAJ,CAAa,KAAKvR,KAAlB;;AAEA,MAAKA,KAAL,CAAW9J,cAAX,CAA2B,GAA3B;;AAEAo3B,UAAS/mC,SAAT,CAAmB4rB,iBAAnB,CAAqC5qB,IAArC,CAA2C,IAA3C,EAAiDgpC,KAAjD;AAEA,CAdD;;AAgBA;;;;AAIA,SAAS+vF,WAAT,CAAsBztG,KAAtB,EAA6B9B,IAA7B,EAAmCmQ,GAAnC,EAAyC;;AAExC,MAAKx5B,IAAL,GAAY,aAAZ;;AAEA,MAAKmrB,KAAL,GAAaA,KAAb;;AAEA,MAAK9B,IAAL,GAAcA,SAASlrB,SAAX,GAAyB,CAAzB,GAA6BkrB,IAAzC;;AAEA,KAAI2Q,QAAUR,QAAQr7B,SAAV,GAAwBq7B,GAAxB,GAA8B,QAA1C;;AAEA,KAAIuT,YAAY,CAAE,CAAF,EAAK,CAAE,CAAP,EAAU,CAAV,EAAa,CAAE,CAAf,EAAkB,CAAlB,EAAqB,CAArB,EAAwB,CAAE,CAA1B,EAA6B,CAAE,CAA/B,EAAkC,CAAlC,EAAqC,CAArC,EAAwC,CAAxC,EAA2C,CAA3C,EAA8C,CAAE,CAAhD,EAAmD,CAAnD,EAAsD,CAAtD,EAAyD,CAAE,CAA3D,EAA8D,CAAE,CAAhE,EAAmE,CAAnE,EAAsE,CAAtE,EAAyE,CAAE,CAA3E,EAA8E,CAA9E,EAAiF,CAAjF,EAAoF,CAApF,EAAuF,CAAvF,EAA0F,CAA1F,EAA6F,CAA7F,EAAgG,CAAhG,EAAmG,CAAnG,EAAsG,CAAtG,EAAyG,CAAzG,CAAhB;;AAEA,KAAI3iB,WAAW,IAAIyqB,cAAJ,EAAf;AACAzqB,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAIpB,sBAAJ,CAA4B/G,SAA5B,EAAuC,CAAvC,CAAnC;AACA3iB,UAAS6G,qBAAT;;AAEAg1D,MAAKpmF,IAAL,CAAW,IAAX,EAAiBuqB,QAAjB,EAA2B,IAAI8tC,iBAAJ,CAAuB,EAAEl+B,OAAOA,KAAT,EAAvB,CAA3B;;AAEA;;AAEA,KAAI6+F,aAAa,CAAE,CAAF,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAE,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB,CAAE,CAAxB,EAA2B,CAAE,CAA7B,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,CAAtC,EAAyC,CAAzC,EAA4C,CAAE,CAA9C,EAAiD,CAAE,CAAnD,EAAsD,CAAtD,EAAyD,CAAzD,EAA4D,CAAE,CAA9D,EAAiE,CAAjE,CAAjB;;AAEA,KAAIliF,YAAY,IAAI9B,cAAJ,EAAhB;AACA8B,WAAUzB,YAAV,CAAwB,UAAxB,EAAoC,IAAIpB,sBAAJ,CAA4B+kF,UAA5B,EAAwC,CAAxC,CAApC;AACAliF,WAAU1lB,qBAAV;;AAEA,MAAKvjB,GAAL,CAAU,IAAIuzC,IAAJ,CAAUtK,SAAV,EAAqB,IAAI2E,iBAAJ,CAAuB,EAAEthB,OAAOA,KAAT,EAAgBwB,SAAS,GAAzB,EAA8Bud,aAAa,IAA3C,EAAiDS,YAAY,KAA7D,EAAvB,CAArB,CAAV;AAEA;;AAEDo/E,YAAY/5H,SAAZ,GAAwBC,OAAOgmB,MAAP,CAAemhE,KAAKpnF,SAApB,CAAxB;AACA+5H,YAAY/5H,SAAZ,CAAsB0O,WAAtB,GAAoCqrH,WAApC;;AAEAA,YAAY/5H,SAAZ,CAAsB4rB,iBAAtB,GAA0C,UAAWoe,KAAX,EAAmB;;AAE5D,KAAIvwB,QAAQ,CAAE,KAAK6S,KAAL,CAAWC,QAAzB;;AAEA,KAAKhtB,KAAKqR,GAAL,CAAU6I,KAAV,IAAoB,IAAzB,EAAgCA,QAAQ,IAAR,CAJ4B,CAId;;AAE9C,MAAKA,KAAL,CAAWzL,GAAX,CAAgB,MAAM,KAAKwc,IAA3B,EAAiC,MAAM,KAAKA,IAA5C,EAAkD/Q,KAAlD;;AAEA,MAAKwtB,QAAL,CAAe,CAAf,EAAmB0D,QAAnB,CAA4BqP,IAA5B,GAAqCvgC,QAAQ,CAAV,GAAgBvW,QAAhB,GAA2BD,SAA9D,CAR4D,CAQa;;AAEzE,MAAKgT,MAAL,CAAa,KAAKqW,KAAL,CAAWpJ,MAAxB;;AAEA6jB,UAAS/mC,SAAT,CAAmB4rB,iBAAnB,CAAqC5qB,IAArC,CAA2C,IAA3C,EAAiDgpC,KAAjD;AAEA,CAdD;;AAgBA;;;;;;;;;;;;;;;;AAgBA,IAAIiwF,YAAJ,EAAkBC,YAAlB;;AAEA,SAASC,WAAT,CAAsBh8G,GAAtB,EAA2Bs/B,MAA3B,EAAmC78C,MAAnC,EAA2Cu6B,KAA3C,EAAkDi/F,UAAlD,EAA8DC,SAA9D,EAA0E;;AAEzE;;AAEAtzF,UAAS/lC,IAAT,CAAe,IAAf;;AAEA,KAAKm6B,UAAU77B,SAAf,EAA2B67B,QAAQ,QAAR;AAC3B,KAAKv6B,WAAWtB,SAAhB,EAA4BsB,SAAS,CAAT;AAC5B,KAAKw5H,eAAe96H,SAApB,EAAgC86H,aAAa,MAAMx5H,MAAnB;AAChC,KAAKy5H,cAAc/6H,SAAnB,EAA+B+6H,YAAY,MAAMD,UAAlB;;AAE/B,KAAKH,iBAAiB36H,SAAtB,EAAkC;;AAEjC26H,iBAAe,IAAIjkF,cAAJ,EAAf;AACAikF,eAAa5jF,YAAb,CAA2B,UAA3B,EAAuC,IAAIpB,sBAAJ,CAA4B,CAAE,CAAF,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAX,EAAc,CAAd,EAAiB,CAAjB,CAA5B,EAAkD,CAAlD,CAAvC;;AAEAilF,iBAAe,IAAI7+B,sBAAJ,CAA4B,CAA5B,EAA+B,GAA/B,EAAoC,CAApC,EAAuC,CAAvC,EAA0C,CAA1C,CAAf;AACA6+B,eAAaz1G,SAAb,CAAwB,CAAxB,EAA2B,CAAE,GAA7B,EAAkC,CAAlC;AAEA;;AAED,MAAKhK,QAAL,CAAc9L,IAAd,CAAoB8uC,MAApB;;AAEA,MAAK5tB,IAAL,GAAY,IAAIu3D,IAAJ,CAAU6yC,YAAV,EAAwB,IAAI5gE,iBAAJ,CAAuB,EAAEl+B,OAAOA,KAAT,EAAvB,CAAxB,CAAZ;AACA,MAAKtL,IAAL,CAAUnK,gBAAV,GAA6B,KAA7B;AACA,MAAK7W,GAAL,CAAU,KAAKghB,IAAf;;AAEA,MAAKkoG,IAAL,GAAY,IAAI31E,IAAJ,CAAU83E,YAAV,EAAwB,IAAIz9E,iBAAJ,CAAuB,EAAEthB,OAAOA,KAAT,EAAvB,CAAxB,CAAZ;AACA,MAAK48F,IAAL,CAAUryG,gBAAV,GAA6B,KAA7B;AACA,MAAK7W,GAAL,CAAU,KAAKkpH,IAAf;;AAEA,MAAKuC,YAAL,CAAmBn8G,GAAnB;AACA,MAAK9M,SAAL,CAAgBzQ,MAAhB,EAAwBw5H,UAAxB,EAAoCC,SAApC;AAEA;;AAEDF,YAAYn6H,SAAZ,GAAwBC,OAAOgmB,MAAP,CAAe8gB,SAAS/mC,SAAxB,CAAxB;AACAm6H,YAAYn6H,SAAZ,CAAsB0O,WAAtB,GAAoCyrH,WAApC;;AAEAA,YAAYn6H,SAAZ,CAAsBs6H,YAAtB,GAAuC,YAAY;;AAElD,KAAIlgH,OAAO,IAAI9F,OAAJ,EAAX;AACA,KAAI/G,OAAJ;;AAEA,QAAO,SAAS+sH,YAAT,CAAuBn8G,GAAvB,EAA6B;;AAEnC;;AAEA,MAAKA,IAAIzR,CAAJ,GAAQ,OAAb,EAAuB;;AAEtB,QAAKgO,UAAL,CAAgB1M,GAAhB,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B;AAEA,GAJD,MAIO,IAAKmQ,IAAIzR,CAAJ,GAAQ,CAAE,OAAf,EAAyB;;AAE/B,QAAKgO,UAAL,CAAgB1M,GAAhB,CAAqB,CAArB,EAAwB,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B;AAEA,GAJM,MAIA;;AAENoM,QAAKpM,GAAL,CAAUmQ,IAAI/J,CAAd,EAAiB,CAAjB,EAAoB,CAAE+J,IAAIre,CAA1B,EAA8B+Q,SAA9B;;AAEAtD,aAAUhO,KAAK6jB,IAAL,CAAWjF,IAAIzR,CAAf,CAAV;;AAEA,QAAKgO,UAAL,CAAgBsE,gBAAhB,CAAkC5E,IAAlC,EAAwC7M,OAAxC;AAEA;AAED,EAtBD;AAwBA,CA7BsC,EAAvC;;AA+BA4sH,YAAYn6H,SAAZ,CAAsBqR,SAAtB,GAAkC,UAAWzQ,MAAX,EAAmBw5H,UAAnB,EAA+BC,SAA/B,EAA2C;;AAE5E,KAAKD,eAAe96H,SAApB,EAAgC86H,aAAa,MAAMx5H,MAAnB;AAChC,KAAKy5H,cAAc/6H,SAAnB,EAA+B+6H,YAAY,MAAMD,UAAlB;;AAE/B,MAAKvqG,IAAL,CAAUpW,KAAV,CAAgBzL,GAAhB,CAAqB,CAArB,EAAwBzO,KAAKyM,GAAL,CAAU,CAAV,EAAapL,SAASw5H,UAAtB,CAAxB,EAA4D,CAA5D;AACA,MAAKvqG,IAAL,CAAU1J,YAAV;;AAEA,MAAK4xG,IAAL,CAAUt+G,KAAV,CAAgBzL,GAAhB,CAAqBqsH,SAArB,EAAgCD,UAAhC,EAA4CC,SAA5C;AACA,MAAKtC,IAAL,CAAUt9G,QAAV,CAAmB/N,CAAnB,GAAuB9L,MAAvB;AACA,MAAKm3H,IAAL,CAAU5xG,YAAV;AAEA,CAZD;;AAcAg0G,YAAYn6H,SAAZ,CAAsBu6H,QAAtB,GAAiC,UAAWp/F,KAAX,EAAmB;;AAEnD,MAAKtL,IAAL,CAAU8a,QAAV,CAAmBxP,KAAnB,CAAyBxsB,IAAzB,CAA+BwsB,KAA/B;AACA,MAAK48F,IAAL,CAAUptF,QAAV,CAAmBxP,KAAnB,CAAyBxsB,IAAzB,CAA+BwsB,KAA/B;AAEA,CALD;;AAOA;;;;;AAKA,SAASq/F,UAAT,CAAqBhwG,IAArB,EAA4B;;AAE3BA,QAAOA,QAAQ,CAAf;;AAEA,KAAIiB,WAAW,CACd,CADc,EACX,CADW,EACR,CADQ,EACLjB,IADK,EACC,CADD,EACI,CADJ,EAEd,CAFc,EAEX,CAFW,EAER,CAFQ,EAEL,CAFK,EAEFA,IAFE,EAEI,CAFJ,EAGd,CAHc,EAGX,CAHW,EAGR,CAHQ,EAGL,CAHK,EAGF,CAHE,EAGCA,IAHD,CAAf;;AAMA,KAAImiB,SAAS,CACZ,CADY,EACT,CADS,EACN,CADM,EACH,CADG,EACA,GADA,EACK,CADL,EAEZ,CAFY,EAET,CAFS,EAEN,CAFM,EAEH,GAFG,EAEE,CAFF,EAEK,CAFL,EAGZ,CAHY,EAGT,CAHS,EAGN,CAHM,EAGH,CAHG,EAGA,GAHA,EAGK,CAHL,CAAb;;AAMA,KAAIphB,WAAW,IAAIyqB,cAAJ,EAAf;AACAzqB,UAAS8qB,YAAT,CAAuB,UAAvB,EAAmC,IAAIpB,sBAAJ,CAA4BxpB,QAA5B,EAAsC,CAAtC,CAAnC;AACAF,UAAS8qB,YAAT,CAAuB,OAAvB,EAAgC,IAAIpB,sBAAJ,CAA4BtI,MAA5B,EAAoC,CAApC,CAAhC;;AAEA,KAAIhC,WAAW,IAAI0uB,iBAAJ,CAAuB,EAAE7sB,cAAchpC,YAAhB,EAAvB,CAAf;;AAEA6jF,cAAarmF,IAAb,CAAmB,IAAnB,EAAyBuqB,QAAzB,EAAmCof,QAAnC;AAEA;;AAED6vF,WAAWx6H,SAAX,GAAuBC,OAAOgmB,MAAP,CAAeohE,aAAarnF,SAA5B,CAAvB;AACAw6H,WAAWx6H,SAAX,CAAqB0O,WAArB,GAAmC8rH,UAAnC;;AAEA;;;;AAIA,SAASC,KAAT,CAAgBrrH,CAAhB,EAAmBC,CAAnB,EAAsB+C,CAAtB,EAAyByC,CAAzB,EAA4BqO,MAA5B,EAAoCiY,KAApC,EAA2CmR,aAA3C,EAA2D;;AAE1Dv9B,SAAQC,IAAR,CAAc,sEAAd;AACA,QAAO,IAAIq9B,KAAJ,CAAWj9B,CAAX,EAAcC,CAAd,EAAiB+C,CAAjB,EAAoB8Q,MAApB,EAA4BiY,KAA5B,EAAmCmR,aAAnC,CAAP;AAEA;;AAED,IAAIouF,YAAY,CAAhB;;AAEA,IAAIC,aAAa,CAAjB;;AAEA,SAASC,gBAAT,CAA2B1wF,SAA3B,EAAuC;;AAEtCn7B,SAAQC,IAAR,CAAc,gEAAd;AACA,QAAOk7B,SAAP;AAEA;;AAED,SAAS2wF,aAAT,CAAwB3wF,SAAxB,EAAoC;;AAEnC,KAAKA,cAAc5qC,SAAnB,EAA+B4qC,YAAY,EAAZ;;AAE/Bn7B,SAAQC,IAAR,CAAc,6DAAd;AACAk7B,WAAUga,eAAV,GAA4B,IAA5B;AACAha,WAAUA,SAAV,GAAsBA,SAAtB;AACAA,WAAUz7B,KAAV,GAAkB,YAAY;;AAE7B,SAAOy7B,UAAUloC,KAAV,EAAP;AAEA,EAJD;AAKA,QAAOkoC,SAAP;AAEA;;AAED,SAASgsF,UAAT,CAAqB3qG,QAArB,EAA+Bof,QAA/B,EAA0C;;AAEzC57B,SAAQC,IAAR,CAAc,oDAAd;AACA,QAAO,IAAIk5E,MAAJ,CAAY38D,QAAZ,EAAsBof,QAAtB,CAAP;AAEA;;AAED,SAASmwF,QAAT,CAAmBnwF,QAAnB,EAA8B;;AAE7B57B,SAAQC,IAAR,CAAc,kDAAd;AACA,QAAO,IAAIi2E,MAAJ,CAAYt6C,QAAZ,CAAP;AAEA;;AAED,SAASowF,cAAT,CAAyBxvG,QAAzB,EAAmCof,QAAnC,EAA8C;;AAE7C57B,SAAQC,IAAR,CAAc,wDAAd;AACA,QAAO,IAAIk5E,MAAJ,CAAY38D,QAAZ,EAAsBof,QAAtB,CAAP;AAEA;;AAED,SAASqwF,kBAAT,CAA6BvwF,UAA7B,EAA0C;;AAEzC17B,SAAQC,IAAR,CAAc,oEAAd;AACA,QAAO,IAAIuqD,cAAJ,CAAoB9uB,UAApB,CAAP;AAEA;;AAED,SAASwwF,qBAAT,CAAgCxwF,UAAhC,EAA6C;;AAE5C17B,SAAQC,IAAR,CAAc,uEAAd;AACA,QAAO,IAAIuqD,cAAJ,CAAoB9uB,UAApB,CAAP;AAEA;;AAED,SAASywF,sBAAT,CAAiCzwF,UAAjC,EAA8C;;AAE7C17B,SAAQC,IAAR,CAAc,wEAAd;AACA,QAAO,IAAIuqD,cAAJ,CAAoB9uB,UAApB,CAAP;AAEA;;AAED,SAAS0wF,MAAT,CAAiBr7H,CAAjB,EAAoB4M,CAApB,EAAuB0H,CAAvB,EAA2B;;AAE1BrF,SAAQC,IAAR,CAAc,2DAAd;AACA,QAAO,IAAIsF,OAAJ,CAAaxU,CAAb,EAAgB4M,CAAhB,EAAmB0H,CAAnB,CAAP;AAEA;;AAED;;AAEA,SAASgnH,sBAAT,CAAiCr5H,KAAjC,EAAwCyxC,QAAxC,EAAmD;;AAElDzkC,SAAQC,IAAR,CAAc,4GAAd;AACA,QAAO,IAAIukC,eAAJ,CAAqBxxC,KAArB,EAA4ByxC,QAA5B,EAAuCI,UAAvC,CAAmD,IAAnD,CAAP;AAEA;;AAED,SAASynF,aAAT,CAAwBt5H,KAAxB,EAA+ByxC,QAA/B,EAA0C;;AAEzCzkC,SAAQC,IAAR,CAAc,oFAAd;AACA,QAAO,IAAIylC,mBAAJ,CAAyB1yC,KAAzB,EAAgCyxC,QAAhC,CAAP;AAEA;;AAED,SAAS8nF,cAAT,CAAyBv5H,KAAzB,EAAgCyxC,QAAhC,EAA2C;;AAE1CzkC,SAAQC,IAAR,CAAc,sFAAd;AACA,QAAO,IAAI0lC,oBAAJ,CAA0B3yC,KAA1B,EAAiCyxC,QAAjC,CAAP;AAEA;;AAED,SAAS+nF,qBAAT,CAAgCx5H,KAAhC,EAAuCyxC,QAAvC,EAAkD;;AAEjDzkC,SAAQC,IAAR,CAAc,oGAAd;AACA,QAAO,IAAI2lC,2BAAJ,CAAiC5yC,KAAjC,EAAwCyxC,QAAxC,CAAP;AAEA;;AAED,SAASgoF,cAAT,CAAyBz5H,KAAzB,EAAgCyxC,QAAhC,EAA2C;;AAE1CzkC,SAAQC,IAAR,CAAc,sFAAd;AACA,QAAO,IAAI6lC,oBAAJ,CAA0B9yC,KAA1B,EAAiCyxC,QAAjC,CAAP;AAEA;;AAED,SAASioF,eAAT,CAA0B15H,KAA1B,EAAiCyxC,QAAjC,EAA4C;;AAE3CzkC,SAAQC,IAAR,CAAc,wFAAd;AACA,QAAO,IAAI8lC,qBAAJ,CAA2B/yC,KAA3B,EAAkCyxC,QAAlC,CAAP;AAEA;;AAED,SAASkoF,cAAT,CAAyB35H,KAAzB,EAAgCyxC,QAAhC,EAA2C;;AAE1CzkC,SAAQC,IAAR,CAAc,sFAAd;AACA,QAAO,IAAI+lC,oBAAJ,CAA0BhzC,KAA1B,EAAiCyxC,QAAjC,CAAP;AAEA;;AAED,SAASmoF,eAAT,CAA0B55H,KAA1B,EAAiCyxC,QAAjC,EAA4C;;AAE3CzkC,SAAQC,IAAR,CAAc,wFAAd;AACA,QAAO,IAAIgmC,qBAAJ,CAA2BjzC,KAA3B,EAAkCyxC,QAAlC,CAAP;AAEA;;AAED,SAASooF,gBAAT,CAA2B75H,KAA3B,EAAkCyxC,QAAlC,EAA6C;;AAE5CzkC,SAAQC,IAAR,CAAc,0FAAd;AACA,QAAO,IAAIimC,sBAAJ,CAA4BlzC,KAA5B,EAAmCyxC,QAAnC,CAAP;AAEA;;AAED,SAASqoF,gBAAT,CAA2B95H,KAA3B,EAAkCyxC,QAAlC,EAA6C;;AAE5CzkC,SAAQC,IAAR,CAAc,0FAAd;AACA,QAAO,IAAIkmC,sBAAJ,CAA4BnzC,KAA5B,EAAmCyxC,QAAnC,CAAP;AAEA;;AAED;;AAEA2tD,MAAMl7E,MAAN,GAAe,UAAW61G,SAAX,EAAsBz6B,QAAtB,EAAiC;;AAE/CtyF,SAAQpB,GAAR,CAAa,0CAAb;;AAEAmuH,WAAU97H,SAAV,GAAsBC,OAAOgmB,MAAP,CAAek7E,MAAMnhG,SAArB,CAAtB;AACA87H,WAAU97H,SAAV,CAAoB0O,WAApB,GAAkCotH,SAAlC;AACAA,WAAU97H,SAAV,CAAoBqhG,QAApB,GAA+BA,QAA/B;;AAEA,QAAOy6B,SAAP;AAEA,CAVD;;AAYA;;AAEA77H,OAAOK,MAAP,CAAeumG,UAAU7mG,SAAzB,EAAoC;;AAEnC+7H,uBAAsB,UAAWt6B,SAAX,EAAuB;;AAE5C1yF,UAAQC,IAAR,CAAc,sHAAd;;AAEA;;AAEA,MAAImjF,MAAM,KAAKqP,SAAL,CAAgBC,SAAhB,CAAV;AACA,SAAO,KAAKu6B,cAAL,CAAqB7pC,GAArB,CAAP;AAEA,EAXkC;;AAanC8pC,6BAA4B,UAAWx6B,SAAX,EAAuB;;AAElD1yF,UAAQC,IAAR,CAAc,4HAAd;;AAEA;;AAEA,MAAImjF,MAAM,KAAK4B,eAAL,CAAsB0N,SAAtB,CAAV;AACA,SAAO,KAAKu6B,cAAL,CAAqB7pC,GAArB,CAAP;AAEA,EAtBkC;;AAwBnC6pC,iBAAgB,UAAW7xG,MAAX,EAAoB;;AAEnCpb,UAAQC,IAAR,CAAc,gHAAd;;AAEA,MAAIuc,WAAW,IAAImhB,QAAJ,EAAf;;AAEA,OAAM,IAAIzqC,IAAI,CAAR,EAAWC,IAAIioB,OAAOvpB,MAA5B,EAAoCqB,IAAIC,CAAxC,EAA2CD,GAA3C,EAAkD;;AAEjD,OAAIgpB,QAAQd,OAAQloB,CAAR,CAAZ;AACAspB,YAASE,QAAT,CAAkBjqB,IAAlB,CAAwB,IAAI8S,OAAJ,CAAa2W,MAAMnrB,CAAnB,EAAsBmrB,MAAMve,CAA5B,EAA+Bue,MAAM7W,CAAN,IAAW,CAA1C,CAAxB;AAEA;;AAED,SAAOmX,QAAP;AAEA;;AAvCkC,CAApC;;AA2CA;;AAEAtrB,OAAOK,MAAP,CAAeonG,KAAK1nG,SAApB,EAA+B;;AAE9Bk8H,aAAY,UAAW/xG,MAAX,EAAoB;;AAE/Bpb,UAAQC,IAAR,CAAc,iEAAd;AACA,OAAKkb,aAAL,CAAoBC,MAApB;AAEA;;AAP6B,CAA/B;;AAWA;;AAEA,SAASgyG,kBAAT,CAA6BhyG,MAA7B,EAAsC;;AAErCpb,SAAQC,IAAR,CAAc,mFAAd;;AAEA61F,kBAAiB7jG,IAAjB,CAAuB,IAAvB,EAA6BmpB,MAA7B;AACA,MAAKhpB,IAAL,GAAY,YAAZ;AACA,MAAK4qF,MAAL,GAAc,IAAd;AAEA;;AAEDowC,mBAAmBn8H,SAAnB,GAA+BC,OAAOgmB,MAAP,CAAe4+E,iBAAiB7kG,SAAhC,CAA/B;;AAEA;;AAEA,SAASo8H,YAAT,CAAuBjyG,MAAvB,EAAgC;;AAE/Bpb,SAAQC,IAAR,CAAc,6EAAd;;AAEA61F,kBAAiB7jG,IAAjB,CAAuB,IAAvB,EAA6BmpB,MAA7B;AACA,MAAKhpB,IAAL,GAAY,YAAZ;AAEA;;AAEDi7H,aAAap8H,SAAb,GAAyBC,OAAOgmB,MAAP,CAAe4+E,iBAAiB7kG,SAAhC,CAAzB;;AAEA;;AAEA,SAASq8H,MAAT,CAAiBlyG,MAAjB,EAA0B;;AAEzBpb,SAAQC,IAAR,CAAc,oEAAd;;AAEA61F,kBAAiB7jG,IAAjB,CAAuB,IAAvB,EAA6BmpB,MAA7B;AACA,MAAKhpB,IAAL,GAAY,YAAZ;AAEA;;AAEDk7H,OAAOr8H,SAAP,GAAmBC,OAAOgmB,MAAP,CAAe4+E,iBAAiB7kG,SAAhC,CAAnB;;AAEAC,OAAOK,MAAP,CAAe+7H,OAAOr8H,SAAtB,EAAiC;;AAEhCs8H,gBAAe,YAAW,OAAU;;AAEnCvtH,UAAQyD,KAAR,CAAe,kDAAf;AAEA,EAN+B;AAOhC+pH,wBAAuB,YAAW,oBAAuB;;AAExDxtH,UAAQyD,KAAR,CAAe,0DAAf;AAEA,EAX+B;AAYhCgqH,2BAA0B,YAAW,kBAAqB;;AAEzDztH,UAAQyD,KAAR,CAAe,6DAAf;AAEA;;AAhB+B,CAAjC;;AAoBA;;AAEA,SAASiqH,UAAT,CAAqBjyG,IAArB,EAA4B;;AAE3Bzb,SAAQC,IAAR,CAAc,wDAAd;AACA,QAAO,IAAIwrH,UAAJ,CAAgBhwG,IAAhB,CAAP;AAEA;;AAED,SAASkyG,iBAAT,CAA4B/xG,MAA5B,EAAoCwQ,KAApC,EAA4C;;AAE3CpsB,SAAQC,IAAR,CAAc,kFAAd;AACA,QAAO,IAAI6qH,SAAJ,CAAelvG,MAAf,EAAuBwQ,KAAvB,CAAP;AAEA;;AAED,SAASwhG,WAAT,CAAsBhyG,MAAtB,EAA8BgQ,GAA9B,EAAoC;;AAEnC5rB,SAAQC,IAAR,CAAc,sEAAd;AACA,QAAO,IAAIq4E,YAAJ,CAAkB,IAAIsT,aAAJ,CAAmBhwE,OAAOY,QAA1B,CAAlB,EAAwD,IAAI8tC,iBAAJ,CAAuB,EAAEl+B,OAAOR,QAAQr7B,SAAR,GAAoBq7B,GAApB,GAA0B,QAAnC,EAAvB,CAAxD,CAAP;AAEA;;AAEDg+F,WAAW34H,SAAX,CAAqB48H,SAArB,GAAiC,YAAY;;AAE5C7tH,SAAQyD,KAAR,CAAe,0FAAf;AAEA,CAJD;;AAMA4lH,eAAep4H,SAAf,CAAyBye,MAAzB,GAAkC,YAAY;;AAE7C1P,SAAQyD,KAAR,CAAe,8DAAf;AAEA,CAJD;;AAMA,SAASqqH,eAAT,CAA0BlyG,MAA1B,EAAkCgQ,GAAlC,EAAwC;;AAEvC5rB,SAAQC,IAAR,CAAc,8EAAd;AACA,QAAO,IAAIq4E,YAAJ,CAAkB,IAAI6B,iBAAJ,CAAuBv+D,OAAOY,QAA9B,CAAlB,EAA4D,IAAI8tC,iBAAJ,CAAuB,EAAEl+B,OAAOR,QAAQr7B,SAAR,GAAoBq7B,GAApB,GAA0B,QAAnC,EAAvB,CAA5D,CAAP;AAEA;;AAED;;AAEA16B,OAAOK,MAAP,CAAemzG,OAAOzzG,SAAtB,EAAiC;;AAEhCq3G,iBAAgB,UAAW5vF,GAAX,EAAiB;;AAEhC1Y,UAAQC,IAAR,CAAc,sGAAd;AACA,SAAO+nG,YAAYM,cAAZ,CAA4B5vF,GAA5B,CAAP;AAEA;;AAP+B,CAAjC;;AAWA,SAASq1G,SAAT,CAAoBl/B,OAApB,EAA8B;;AAE7B7uF,SAAQC,IAAR,CAAc,uDAAd;AACA,QAAO,IAAI2uF,UAAJ,CAAgBC,OAAhB,CAAP;AAEA;;AAED,SAASm/B,mBAAT,CAA8Bn/B,OAA9B,EAAwC;;AAEvC7uF,SAAQC,IAAR,CAAc,wEAAd;AACA,QAAO,IAAIqxF,iBAAJ,CAAuBzC,OAAvB,CAAP;AAEA;;AAED;;AAEA39F,OAAOK,MAAP,CAAei3H,KAAKv3H,SAApB,EAA+B;;AAE9BmS,SAAQ,UAAWmvF,cAAX,EAA4B;;AAEnCvyF,UAAQC,IAAR,CAAc,yDAAd;AACA,SAAO,KAAK+b,SAAL,CAAgBu2E,cAAhB,CAAP;AAEA,EAP6B;AAQ9BryE,QAAO,YAAY;;AAElBlgB,UAAQC,IAAR,CAAc,sDAAd;AACA,SAAO,KAAK8b,OAAL,EAAP;AAEA,EAb6B;AAc9BkyG,oBAAmB,UAAWnyG,GAAX,EAAiB;;AAEnC9b,UAAQC,IAAR,CAAc,wEAAd;AACA,SAAO,KAAKgd,aAAL,CAAoBnB,GAApB,CAAP;AAEA,EAnB6B;AAoB9BL,OAAM,UAAW82E,cAAX,EAA4B;;AAEjCvyF,UAAQC,IAAR,CAAc,qDAAd;AACA,SAAO,KAAKgc,OAAL,CAAcs2E,cAAd,CAAP;AAEA;AAzB6B,CAA/B;;AA4BArhG,OAAOK,MAAP,CAAeipB,KAAKvpB,SAApB,EAA+B;;AAE9BmS,SAAQ,UAAWmvF,cAAX,EAA4B;;AAEnCvyF,UAAQC,IAAR,CAAc,yDAAd;AACA,SAAO,KAAK+b,SAAL,CAAgBu2E,cAAhB,CAAP;AAEA,EAP6B;AAQ9BryE,QAAO,YAAY;;AAElBlgB,UAAQC,IAAR,CAAc,sDAAd;AACA,SAAO,KAAK8b,OAAL,EAAP;AAEA,EAb6B;AAc9BkyG,oBAAmB,UAAWnyG,GAAX,EAAiB;;AAEnC9b,UAAQC,IAAR,CAAc,wEAAd;AACA,SAAO,KAAKgd,aAAL,CAAoBnB,GAApB,CAAP;AAEA,EAnB6B;AAoB9BoyG,uBAAsB,UAAW9wG,MAAX,EAAoB;;AAEzCpd,UAAQC,IAAR,CAAc,8EAAd;AACA,SAAO,KAAKid,gBAAL,CAAuBE,MAAvB,CAAP;AAEA,EAzB6B;AA0B9B3B,OAAM,UAAW82E,cAAX,EAA4B;;AAEjCvyF,UAAQC,IAAR,CAAc,qDAAd;AACA,SAAO,KAAKgc,OAAL,CAAcs2E,cAAd,CAAP;AAEA;AA/B6B,CAA/B;;AAkCA/gD,MAAMvgD,SAAN,CAAgBmS,MAAhB,GAAyB,UAAWmvF,cAAX,EAA4B;;AAEpDvyF,SAAQC,IAAR,CAAc,0DAAd;AACA,QAAO,KAAK+b,SAAL,CAAgBu2E,cAAhB,CAAP;AAEA,CALD;;AAOArhG,OAAOK,MAAP,CAAe2K,KAAf,EAAsB;;AAErBiyH,WAAU,YAAY;;AAErBnuH,UAAQC,IAAR,CAAc,yEAAd;AACA,SAAOzP,KAAKiM,MAAL,EAAP;AAEA,EAPoB;;AASrB2xH,oBAAmB,UAAWz9H,KAAX,EAAmB;;AAErCqP,UAAQC,IAAR,CAAc,0EAAd;AACA,SAAO/D,MAAM4C,eAAN,CAAuBnO,KAAvB,CAAP;AAEA,EAdoB;;AAgBrB09H,iBAAgB,UAAW19H,KAAX,EAAmB;;AAElCqP,UAAQC,IAAR,CAAc,sEAAd;AACA,SAAO/D,MAAMwC,cAAN,CAAsB/N,KAAtB,CAAP;AAEA;;AArBoB,CAAtB;;AAyBAO,OAAOK,MAAP,CAAeujB,QAAQ7jB,SAAvB,EAAkC;;AAEjCq9H,uBAAsB,UAAWt7H,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEhD7C,UAAQC,IAAR,CAAc,qFAAd;AACA,SAAO,KAAK6C,OAAL,CAAc9P,KAAd,EAAqB6P,MAArB,CAAP;AAEA,EAPgC;AAQjC0rH,kBAAiB,UAAWvhH,MAAX,EAAoB;;AAEpChN,UAAQC,IAAR,CAAc,gGAAd;AACA,SAAO+M,OAAOjM,YAAP,CAAqB,IAArB,CAAP;AAEA,EAbgC;AAcjCytH,uBAAsB,YAAW,OAAU;;AAE1CxuH,UAAQyD,KAAR,CAAe,0DAAf;AAEA,EAlBgC;AAmBjCgrH,gBAAe,UAAW15F,MAAX,CAAkB,qBAAlB,EAA0C;;AAExD/0B,UAAQC,IAAR,CAAc,2GAAd;AACA,SAAO,KAAKuJ,sBAAL,CAA6BurB,MAA7B,CAAP;AAEA,EAxBgC;AAyBjC25F,sBAAqB,YAAW,2BAA8B;;AAE7D1uH,UAAQyD,KAAR,CAAe,yDAAf;AAEA;;AA7BgC,CAAlC;;AAiCAvS,OAAOK,MAAP,CAAeiS,QAAQvS,SAAvB,EAAkC;;AAEjC09H,kBAAiB,UAAWvxH,CAAX,EAAe;;AAE/B4C,UAAQC,IAAR,CAAc,wEAAd;AACA,SAAO,KAAK6E,YAAL,CAAmB1H,CAAnB,CAAP;AAEA,EAPgC;AAQjCkxH,uBAAsB,UAAWt7H,KAAX,EAAkB6P,MAAlB,EAA2B;;AAEhD7C,UAAQC,IAAR,CAAc,qFAAd;AACA,SAAO,KAAK6C,OAAL,CAAc9P,KAAd,EAAqB6P,MAArB,CAAP;AAEA,EAbgC;AAcjC+rH,cAAa,YAAY;;AAExB,MAAInsH,EAAJ;;AAEA,SAAO,SAASmsH,WAAT,GAAuB;;AAE7B,OAAKnsH,OAAOlS,SAAZ,EAAwBkS,KAAK,IAAI8C,OAAJ,EAAL;AACxBvF,WAAQC,IAAR,CAAc,sGAAd;AACA,UAAOwC,GAAG0C,mBAAH,CAAwB,IAAxB,EAA8B,CAA9B,CAAP;AAEA,GAND;AAQA,EAZY,EAdoB;AA2BjCo0B,4BAA2B,UAAWvyB,CAAX,EAAe;;AAEzChH,UAAQC,IAAR,CAAc,gGAAd;AACA,SAAO,KAAK4G,0BAAL,CAAiCG,CAAjC,CAAP;AAEA,EAhCgC;AAiCjC6nH,kBAAiB,YAAY;;AAE5B7uH,UAAQC,IAAR,CAAc,qDAAd;AAEA,EArCgC;AAsCjCsuH,kBAAiB,UAAWvhH,MAAX,EAAoB;;AAEpChN,UAAQC,IAAR,CAAc,gGAAd;AACA,SAAO+M,OAAOrD,YAAP,CAAqB,IAArB,CAAP;AAEA,EA3CgC;AA4CjCmlH,kBAAiB,UAAW9hH,MAAX,EAAoB;;AAEpChN,UAAQC,IAAR,CAAc,gGAAd;AACA,SAAO+M,OAAOrD,YAAP,CAAqB,IAArB,CAAP;AAEA,EAjDgC;AAkDjC6kH,uBAAsB,YAAW,OAAU;;AAE1CxuH,UAAQyD,KAAR,CAAe,0DAAf;AAEA,EAtDgC;AAuDjCsrH,aAAY,UAAWlvH,CAAX,EAAe;;AAE1BG,UAAQC,IAAR,CAAc,kGAAd;AACAJ,IAAE0T,kBAAF,CAAsB,IAAtB;AAEA,EA5DgC;AA6DjCy7G,cAAa,UAAWhiH,MAAX,EAAoB;;AAEhChN,UAAQC,IAAR,CAAc,4FAAd;AACA,SAAO+M,OAAOrD,YAAP,CAAqB,IAArB,CAAP;AAEA,EAlEgC;AAmEjC+L,YAAW,YAAY;;AAEtB1V,UAAQyD,KAAR,CAAe,+CAAf;AAEA,EAvEgC;AAwEjCk2B,UAAS,YAAY;;AAEpB35B,UAAQyD,KAAR,CAAe,6CAAf;AAEA,EA5EgC;AA6EjCm2B,UAAS,YAAY;;AAEpB55B,UAAQyD,KAAR,CAAe,6CAAf;AAEA,EAjFgC;AAkFjCo2B,UAAS,YAAY;;AAEpB75B,UAAQyD,KAAR,CAAe,6CAAf;AAEA,EAtFgC;AAuFjCwrH,eAAc,YAAY;;AAEzBjvH,UAAQyD,KAAR,CAAe,kDAAf;AAEA,EA3FgC;AA4FjCgrH,gBAAe,UAAW15F,MAAX,CAAkB,qBAAlB,EAA0C;;AAExD/0B,UAAQC,IAAR,CAAc,2GAAd;AACA,SAAO,KAAKuJ,sBAAL,CAA6BurB,MAA7B,CAAP;AAEA,EAjGgC;AAkGjC25F,sBAAqB,YAAW,2BAA8B;;AAE7D1uH,UAAQyD,KAAR,CAAe,yDAAf;AAEA,EAtGgC;AAuGjCyrH,cAAa,UAAW3hH,IAAX,EAAiBC,KAAjB,EAAwBE,MAAxB,EAAgCD,GAAhC,EAAqCE,IAArC,EAA2CC,GAA3C,EAAiD;;AAE7D5N,UAAQC,IAAR,CAAc,sHAAd;AACA,SAAO,KAAKqN,eAAL,CAAsBC,IAAtB,EAA4BC,KAA5B,EAAmCC,GAAnC,EAAwCC,MAAxC,EAAgDC,IAAhD,EAAsDC,GAAtD,CAAP;AAEA;;AA5GgC,CAAlC;;AAgHA0S,MAAMrvB,SAAN,CAAgBk+H,kBAAhB,GAAqC,UAAWruG,IAAX,EAAkB;;AAEtD9gB,SAAQC,IAAR,CAAc,2EAAd;AACA,QAAO,KAAKkhB,cAAL,CAAqBL,IAArB,CAAP;AAEA,CALD;;AAOA9S,WAAW/c,SAAX,CAAqBs9H,eAArB,GAAuC,UAAWvhH,MAAX,EAAoB;;AAE1DhN,SAAQC,IAAR,CAAc,iHAAd;AACA,QAAO+M,OAAOwF,eAAP,CAAwB,IAAxB,CAAP;AAEA,CALD;;AAOAthB,OAAOK,MAAP,CAAek9C,IAAIx9C,SAAnB,EAA8B;;AAE7Bg9H,oBAAmB,UAAWnyG,GAAX,EAAiB;;AAEnC9b,UAAQC,IAAR,CAAc,uEAAd;AACA,SAAO,KAAKgd,aAAL,CAAoBnB,GAApB,CAAP;AAEA,EAP4B;AAQ7BszG,sBAAqB,UAAW7xG,KAAX,EAAmB;;AAEvCvd,UAAQC,IAAR,CAAc,2EAAd;AACA,SAAO,KAAKqd,eAAL,CAAsBC,KAAtB,CAAP;AAEA,EAb4B;AAc7B2wG,uBAAsB,UAAW9wG,MAAX,EAAoB;;AAEzCpd,UAAQC,IAAR,CAAc,6EAAd;AACA,SAAO,KAAKid,gBAAL,CAAuBE,MAAvB,CAAP;AAEA;;AAnB4B,CAA9B;;AAuBAlsB,OAAOK,MAAP,CAAeygD,SAAS/gD,SAAxB,EAAmC;;AAElCgvF,OAAM,YAAY;;AAEjBjgF,UAAQC,IAAR,CAAc,yDAAd;AACA,SAAO,KAAK8yC,OAAL,EAAP;AAEA,EAPiC;AAQlCs8E,qBAAoB,UAAWnzG,KAAX,EAAkB1qB,MAAlB,EAA2B;;AAE9CwO,UAAQC,IAAR,CAAc,4EAAd;AACA,SAAO,KAAKkyC,YAAL,CAAmBj2B,KAAnB,EAA0B1qB,MAA1B,CAAP;AAEA,EAbiC;AAclC89H,WAAU,UAAW99H,MAAX,EAAoB;;AAE7BwO,UAAQC,IAAR,CAAc,iEAAd;AACA,SAAO,KAAK+yC,WAAL,CAAkBxhD,MAAlB,CAAP;AAEA,EAnBiC;AAoBlC2iB,SAAQ,UAAW3iB,MAAX,EAAoB;;AAE3BwO,UAAQC,IAAR,CAAc,6DAAd;AACA,SAAO,KAAKgyC,SAAL,CAAgBzgD,MAAhB,CAAP;AAEA,EAzBiC;AA0BlC+rB,QAAO,UAAW/rB,MAAX,EAAoB;;AAE1BwO,UAAQC,IAAR,CAAc,2DAAd;AACA,SAAO,KAAKgzC,QAAL,CAAezhD,MAAf,CAAP;AAEA;;AA/BiC,CAAnC;;AAmCAN,OAAOK,MAAP,CAAeygD,QAAf,EAAyB;;AAExBq9E,qBAAoB,UAAWnzG,KAAX,EAAkB7b,CAAlB,EAAqBC,CAArB,EAAwB+C,CAAxB,EAA2B7R,MAA3B,EAAoC;;AAEvDwO,UAAQC,IAAR,CAAc,4EAAd;AACA,SAAO+xC,SAASG,YAAT,CAAuBj2B,KAAvB,EAA8B7b,CAA9B,EAAiCC,CAAjC,EAAoC+C,CAApC,EAAuC7R,MAAvC,CAAP;AAEA,EAPuB;AAQxB2iB,SAAQ,UAAW9T,CAAX,EAAcC,CAAd,EAAiB+C,CAAjB,EAAoB7R,MAApB,EAA6B;;AAEpCwO,UAAQC,IAAR,CAAc,6DAAd;AACA,SAAO+xC,SAASC,SAAT,CAAoB5xC,CAApB,EAAuBC,CAAvB,EAA0B+C,CAA1B,EAA6B7R,MAA7B,CAAP;AAEA;;AAbuB,CAAzB;;AAiBAN,OAAOK,MAAP,CAAeuoG,MAAM7oG,SAArB,EAAgC;;AAE/Bs+H,mBAAkB,UAAW78B,SAAX,EAAuB;;AAExC1yF,UAAQC,IAAR,CAAc,kFAAd;AACA,SAAO,KAAKmlF,aAAL,CAAoBsN,SAApB,CAAP;AAEA,EAP8B;AAQ/B88B,UAAS,UAAWj2G,OAAX,EAAqB;;AAE7BvZ,UAAQC,IAAR,CAAc,0EAAd;AACA,SAAO,IAAI0jF,eAAJ,CAAqB,IAArB,EAA2BpqE,OAA3B,CAAP;AAEA,EAb8B;AAc/Bk2G,eAAc,UAAWl2G,OAAX,EAAqB;;AAElCvZ,UAAQC,IAAR,CAAc,6EAAd;AACA,SAAO,IAAIorF,aAAJ,CAAmB,IAAnB,EAAyB9xE,OAAzB,CAAP;AAEA;;AAnB8B,CAAhC;;AAuBAroB,OAAOK,MAAP,CAAewN,QAAQ9N,SAAvB,EAAkC;;AAEjCy+H,gBAAe,UAAW1sH,SAAX,EAAsBrR,KAAtB,EAA6BkR,MAA7B,EAAsC;;AAEpD7C,UAAQC,IAAR,CAAc,6EAAd;AACA,SAAO,KAAK8C,mBAAL,CAA0BC,SAA1B,EAAqCrR,KAArC,EAA4CkR,MAA5C,CAAP;AAEA,EAPgC;AAQjC8sH,sBAAqB,UAAW9vH,CAAX,EAAe;;AAEnCG,UAAQC,IAAR,CAAc,mFAAd;AACA,SAAO,KAAKoC,mBAAL,CAA0BxC,CAA1B,CAAP;AAEA,EAbgC;AAcjC+vH,kBAAiB,YAAY;;AAE5B5vH,UAAQC,IAAR,CAAc,2EAAd;AACA,SAAO,KAAK2B,eAAL,EAAP;AAEA;;AAnBgC,CAAlC;;AAuBA1Q,OAAOK,MAAP,CAAegU,QAAQtU,SAAvB,EAAkC;;AAEjC4+H,6BAA4B,YAAY;;AAEvC7vH,UAAQyD,KAAR,CAAe,2GAAf;AAEA,EANgC;AAOjCqsH,yBAAwB,YAAY;;AAEnC9vH,UAAQyD,KAAR,CAAe,mGAAf;AAEA,EAXgC;AAYjCssH,wBAAuB,UAAW3yH,CAAX,EAAe;;AAErC4C,UAAQC,IAAR,CAAc,uFAAd;AACA,SAAO,KAAK2U,qBAAL,CAA4BxX,CAA5B,CAAP;AAEA,EAjBgC;AAkBjC4yH,qBAAoB,UAAW5yH,CAAX,EAAe;;AAElC4C,UAAQC,IAAR,CAAc,iFAAd;AACA,SAAO,KAAK4U,kBAAL,CAAyBzX,CAAzB,CAAP;AAEA,EAvBgC;AAwBjC6yH,sBAAqB,UAAWt+H,KAAX,EAAkBsb,MAAlB,EAA2B;;AAE/CjN,UAAQC,IAAR,CAAc,mFAAd;AACA,SAAO,KAAKkF,mBAAL,CAA0B8H,MAA1B,EAAkCtb,KAAlC,CAAP;AAEA,EA7BgC;AA8BjCu+H,kBAAiB,UAAW9yH,CAAX,EAAe;;AAE/B4C,UAAQC,IAAR,CAAc,qFAAd;AACA,SAAO,KAAK0J,YAAL,CAAmBvM,CAAnB,CAAP;AAEA,EAnCgC;AAoCjCsyH,gBAAe,UAAW1sH,SAAX,EAAsBrR,KAAtB,EAA6BkR,MAA7B,EAAsC;;AAEpD7C,UAAQC,IAAR,CAAc,6EAAd;AACA,SAAO,KAAK8C,mBAAL,CAA0BC,SAA1B,EAAqCrR,KAArC,EAA4CkR,MAA5C,CAAP;AAEA,EAzCgC;AA0CjC8sH,sBAAqB,UAAW9vH,CAAX,EAAe;;AAEnCG,UAAQC,IAAR,CAAc,mFAAd;AACA,SAAO,KAAKoC,mBAAL,CAA0BxC,CAA1B,CAAP;AAEA,EA/CgC;AAgDjC+vH,kBAAiB,YAAY;;AAE5B5vH,UAAQC,IAAR,CAAc,2EAAd;AACA,SAAO,KAAK2B,eAAL,EAAP;AAEA;;AArDgC,CAAlC;;AAyDA1Q,OAAOK,MAAP,CAAeunB,QAAQ7nB,SAAvB,EAAkC;;AAEjCy+H,gBAAe,UAAW1sH,SAAX,EAAsBrR,KAAtB,EAA6BkR,MAA7B,EAAsC;;AAEpD7C,UAAQC,IAAR,CAAc,6EAAd;AACA,SAAO,KAAK8C,mBAAL,CAA0BC,SAA1B,EAAqCrR,KAArC,EAA4CkR,MAA5C,CAAP;AAEA,EAPgC;AAQjC+sH,kBAAiB,YAAY;;AAE5B5vH,UAAQC,IAAR,CAAc,2EAAd;AACA,SAAO,KAAK2B,eAAL,EAAP;AAEA;;AAbgC,CAAlC;;AAiBA;;AAEA1Q,OAAOK,MAAP,CAAeosC,SAAS1sC,SAAxB,EAAmC;;AAElCk/H,kBAAiB,YAAY;;AAE5BnwH,UAAQyD,KAAR,CAAe,sDAAf;AAEA,EANiC;AAOlC80E,uBAAsB,YAAY;;AAEjCv4E,UAAQyD,KAAR,CAAe,0GAAf;AAEA;;AAXiC,CAAnC;;AAeAvS,OAAOK,MAAP,CAAeymC,SAAS/mC,SAAxB,EAAmC;;AAElCm/H,iBAAgB,UAAW95G,IAAX,EAAkB;;AAEjCtW,UAAQC,IAAR,CAAc,2EAAd;AACA,SAAO,KAAKu6B,eAAL,CAAsBlkB,IAAtB,CAAP;AAEA,EAPiC;AAQlC+5G,cAAa,YAAY;;AAExBrwH,UAAQC,IAAR,CAAc,2EAAd;AAEA,EAZiC;AAalCyV,YAAW,UAAW+N,QAAX,EAAqBpY,IAArB,EAA4B;;AAEtCrL,UAAQC,IAAR,CAAc,gGAAd;AACA,SAAO,KAAK65B,eAAL,CAAsBzuB,IAAtB,EAA4BoY,QAA5B,CAAP;AAEA,EAlBiC;AAmBlC6sG,mBAAkB,YAAY;;AAE7BtwH,UAAQyD,KAAR,CAAe,gHAAf;AAEA;;AAvBiC,CAAnC;;AA2BAvS,OAAO8N,gBAAP,CAAyBg5B,SAAS/mC,SAAlC,EAA6C;;AAE5Cs/H,aAAY;AACXn/H,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,qDAAd;AACA,UAAO,KAAKqV,QAAL,CAActP,KAArB;AAEA,GANU;AAOX/G,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,qDAAd;AACA,QAAKqV,QAAL,CAActP,KAAd,GAAsBrV,KAAtB;AAEA;AAZU,EAFgC;AAgB5C6/H,gBAAe;AACdp/H,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,+FAAd;AAEA,GALa;AAMdhB,OAAK,YAAY;;AAEhBe,WAAQC,IAAR,CAAc,+FAAd;AAEA;AAVa;;AAhB6B,CAA7C;;AA+BA/O,OAAO8N,gBAAP,CAAyBu3E,IAAItlF,SAA7B,EAAwC;;AAEvC4kD,UAAS;AACRzkD,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,kDAAd;AACA,UAAO,KAAKu2E,MAAZ;AAEA;AANO;;AAF8B,CAAxC;;AAaAtlF,OAAOC,cAAP,CAAuBylF,SAAS3lF,SAAhC,EAA2C,kBAA3C,EAA+D;;AAE9DG,MAAK,YAAY;;AAEhB4O,UAAQC,IAAR,CAAc,oDAAd;AAEA,EAN6D;AAO9DhB,MAAK,YAAY;;AAEhBe,UAAQC,IAAR,CAAc,oDAAd;AAEA;;AAX6D,CAA/D;;AAeA/O,OAAOC,cAAP,CAAuBihG,MAAMnhG,SAA7B,EAAwC,sBAAxC,EAAgE;;AAE/DG,MAAK,YAAY;;AAEhB4O,UAAQC,IAAR,CAAc,gEAAd;AACA,SAAO,KAAKoyF,kBAAZ;AAEA,EAP8D;AAQ/DpzF,MAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,UAAQC,IAAR,CAAc,gEAAd;AACA,OAAKoyF,kBAAL,GAA0B1hG,KAA1B;AAEA;;AAb8D,CAAhE;;AAiBA;;AAEA6zE,kBAAkBvzE,SAAlB,CAA4Bw/H,OAA5B,GAAsC,UAAWzrD,WAAX,EAAwBJ,SAAxB,EAAoC;;AAEzE5kE,SAAQC,IAAR,CAAc,oDACZ,8DADF;;AAGA,KAAK2kE,cAAcr0E,SAAnB,EAA+B,KAAKq0E,SAAL,GAAiBA,SAAjB;AAC/B,MAAKG,cAAL,CAAqBC,WAArB;AAEA,CARD;;AAUA;;AAEA9zE,OAAO8N,gBAAP,CAAyBi7F,MAAMhpG,SAA/B,EAA0C;AACzCy/H,aAAY;AACXzxH,OAAK,YAAY;;AAEhBe,WAAQC,IAAR,CAAc,4CAAd;AAEA;AALU,EAD6B;AAQzC0wH,kBAAiB;AAChB1xH,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,0DAAd;AACA,QAAKwwB,MAAL,CAAYtd,MAAZ,CAAmBsxD,GAAnB,GAAyB9zE,KAAzB;AAEA;AANe,EARwB;AAgBzCigI,mBAAkB;AACjB3xH,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,4DAAd;AACA,QAAKwwB,MAAL,CAAYtd,MAAZ,CAAmB5F,IAAnB,GAA0B5c,KAA1B;AAEA;AANgB,EAhBuB;AAwBzCkgI,oBAAmB;AAClB5xH,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,8DAAd;AACA,QAAKwwB,MAAL,CAAYtd,MAAZ,CAAmB3F,KAAnB,GAA2B7c,KAA3B;AAEA;AANiB,EAxBsB;AAgCzCmgI,kBAAiB;AAChB7xH,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,0DAAd;AACA,QAAKwwB,MAAL,CAAYtd,MAAZ,CAAmB1F,GAAnB,GAAyB9c,KAAzB;AAEA;AANe,EAhCwB;AAwCzCogI,qBAAoB;AACnB9xH,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,gEAAd;AACA,QAAKwwB,MAAL,CAAYtd,MAAZ,CAAmBzF,MAAnB,GAA4B/c,KAA5B;AAEA;AANkB,EAxCqB;AAgDzC2gC,mBAAkB;AACjBryB,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,4DAAd;AACA,QAAKwwB,MAAL,CAAYtd,MAAZ,CAAmBxF,IAAnB,GAA0Bhd,KAA1B;AAEA;AANgB,EAhDuB;AAwDzC4gC,kBAAiB;AAChBtyB,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,0DAAd;AACA,QAAKwwB,MAAL,CAAYtd,MAAZ,CAAmBvF,GAAnB,GAAyBjd,KAAzB;AAEA;AANe,EAxDwB;AAgEzCqgI,sBAAqB;AACpB/xH,OAAK,YAAY;;AAEhBe,WAAQC,IAAR,CAAc,gHAAd;AAEA;AALmB,EAhEoB;AAuEzCywB,aAAY;AACXzxB,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,+CAAd;AACA,QAAKwwB,MAAL,CAAY89B,IAAZ,GAAmB59D,KAAnB;AAEA;AANU,EAvE6B;AA+EzCsgI,iBAAgB;AACfhyH,OAAK,YAAY;;AAEhBe,WAAQC,IAAR,CAAc,gDAAd;AAEA;AALc,EA/EyB;AAsFzCixH,iBAAgB;AACfjyH,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,4DAAd;AACA,QAAKwwB,MAAL,CAAY+9B,OAAZ,CAAoB12C,KAApB,GAA4BnnB,KAA5B;AAEA;AANc,EAtFyB;AA8FzCwgI,kBAAiB;AAChBlyH,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,8DAAd;AACA,QAAKwwB,MAAL,CAAY+9B,OAAZ,CAAoBz2C,MAApB,GAA6BpnB,KAA7B;AAEA;AANe;AA9FwB,CAA1C;;AAwGA;;AAEAO,OAAO8N,gBAAP,CAAyBwlC,gBAAgBvzC,SAAzC,EAAoD;;AAEnDY,SAAQ;AACPT,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,yEAAd;AACA,UAAO,KAAKjN,KAAL,CAAWnB,MAAlB;AAEA;AANM,EAF2C;AAUnDu/H,mBAAkB,YAAW,aAAgB;;AAE5CpxH,UAAQyD,KAAR,CAAe,8DAAf;AAEA;;AAdkD,CAApD;;AAkBAvS,OAAOK,MAAP,CAAe01C,eAAeh2C,SAA9B,EAAyC;;AAExCogI,WAAU,UAAW1/H,KAAX,EAAmB;;AAE5BqO,UAAQC,IAAR,CAAc,oEAAd;AACA,OAAKonC,QAAL,CAAe11C,KAAf;AAEA,EAPuC;AAQxC2/H,cAAa,UAAWpwG,KAAX,EAAkBzX,KAAlB,EAAyBgiF,WAAzB,EAAuC;;AAEnD,MAAKA,gBAAgBl7F,SAArB,EAAiC;;AAEhCyP,WAAQC,IAAR,CAAc,sEAAd;AAEA;AACDD,UAAQC,IAAR,CAAc,0DAAd;AACA,OAAKwnC,QAAL,CAAevmB,KAAf,EAAsBzX,KAAtB;AAEA,EAlBuC;AAmBxC8nH,iBAAgB,YAAY;;AAE3BvxH,UAAQC,IAAR,CAAc,gEAAd;AACA,OAAKynC,WAAL;AAEA,EAxBuC;AAyBxCyoF,kBAAiB,YAAY;;AAE5BnwH,UAAQC,IAAR,CAAc,4DAAd;AAEA,EA7BuC;AA8BxCuxH,iBAAgB,YAAY;;AAE3BxxH,UAAQC,IAAR,CAAc,2DAAd;AAEA;;AAlCuC,CAAzC;;AAsCA/O,OAAO8N,gBAAP,CAAyBioC,eAAeh2C,SAAxC,EAAmD;;AAElDuzG,YAAW;AACVpzG,OAAK,YAAY;;AAEhB4O,WAAQyD,KAAR,CAAe,+DAAf;AACA,UAAO,KAAKm8B,MAAZ;AAEA;AANS,EAFuC;AAUlD6kE,UAAS;AACRrzG,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,6DAAd;AACA,UAAO,KAAK2/B,MAAZ;AAEA;AANO;;AAVyC,CAAnD;;AAqBA;;AAEA1uC,OAAOK,MAAP,CAAeqyF,sBAAsB3yF,SAArC,EAAgD;;AAE/CwgI,YAAW,YAAY;;AAEtBzxH,UAAQyD,KAAR,CAAe,6DAAf;AAEA,EAN8C;;AAQ/CiuH,eAAc,YAAY;;AAEzB1xH,UAAQyD,KAAR,CAAe,gEAAf;AAEA,EAZ8C;;AAc/CqgF,WAAU,YAAY;;AAErB9jF,UAAQyD,KAAR,CAAe,4DAAf;AAEA;;AAlB8C,CAAhD;;AAsBA;;AAEAvS,OAAO8N,gBAAP,CAAyB0nH,QAAQz1H,SAAjC,EAA4C;;AAE3C2jC,UAAS;AACR31B,OAAK,YAAY;;AAEhBe,WAAQC,IAAR,CAAc,gFAAd;AAEA;AALO,EAFkC;AAS3CgX,WAAU;AACTtmB,SAAO,YAAY;;AAElBqP,WAAQC,IAAR,CAAc,mFAAd;AACA,UAAO,IAAP;AAEA;AANQ;;AATiC,CAA5C;;AAoBA;;AAEA/O,OAAO8N,gBAAP,CAAyB+rC,SAAS95C,SAAlC,EAA6C;;AAE5C0gI,aAAY;AACXvgI,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,+CAAd;AAEA,GALU;AAMXhB,OAAK,YAAY;;AAEhBe,WAAQC,IAAR,CAAc,+CAAd;AAEA;AAVU,EAFgC;AAc5C2xH,UAAS;AACRxgI,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,4CAAd;AACA,UAAO,IAAIurB,KAAJ,EAAP;AAEA;AANO,EAdmC;;AAuB5C44E,UAAS;AACRhzG,OAAK,YAAY;;AAEhB4O,WAAQyD,KAAR,CAAe,WAAW,KAAKrR,IAAhB,GAAuB,oEAAtC;AAEA,GALO;AAMR6M,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,WAAW,KAAK7N,IAAhB,GAAuB,oEAArC;AACA,QAAK84C,WAAL,GAAqBv6C,UAAU0D,WAA/B;AAEA;AAXO;;AAvBmC,CAA7C;;AAuCAnD,OAAO8N,gBAAP,CAAyBkrD,kBAAkBj5D,SAA3C,EAAsD;;AAErD4gI,QAAO;AACNzgI,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,2FAAd;AACA,UAAO,KAAP;AAEA,GANK;AAONhB,OAAK,YAAY;;AAEhBe,WAAQC,IAAR,CAAc,0FAAd;AAEA;AAXK;;AAF8C,CAAtD;;AAkBA/O,OAAO8N,gBAAP,CAAyB6uC,eAAe58C,SAAxC,EAAmD;;AAElDg9C,cAAa;AACZ78C,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,+EAAd;AACA,UAAO,KAAK+tC,UAAL,CAAgBC,WAAvB;AAEA,GANW;AAOZhvC,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,gFAAd;AACA,QAAK+tC,UAAL,CAAgBC,WAAhB,GAA8Bt9C,KAA9B;AAEA;AAZW;;AAFqC,CAAnD;;AAmBA;;AAEAO,OAAOK,MAAP,CAAeu4E,cAAc74E,SAA7B,EAAwC;;AAEvC6gI,UAAS,UAAW3/G,QAAX,EAAsB;;AAE9BnS,UAAQC,IAAR,CAAc,6DAAd;AACA,OAAKk0B,gBAAL,CAAuBhiB,QAAvB;AAEA,EAPsC;;AASvC4/G,yBAAwB,YAAY;;AAEnC/xH,UAAQC,IAAR,CAAc,2EAAd;AACA,SAAO,KAAKwrD,eAAL,EAAP;AAEA,EAdsC;;AAgBvC1T,mBAAkB,YAAY;;AAE7B/3C,UAAQC,IAAR,CAAc,mFAAd;AACA,SAAO,KAAK2pD,YAAL,CAAkB7R,gBAAlB,EAAP;AAEA,EArBsC;;AAuBvCi6E,eAAc,YAAY;;AAEzBhyH,UAAQC,IAAR,CAAc,sEAAd;AACA,SAAO,KAAK2pD,YAAL,CAAkBrnB,SAAzB;AAEA,EA5BsC;;AA8BvC0vF,eAAc,YAAY;;AAEzBjyH,UAAQC,IAAR,CAAc,6DAAd;AACA,SAAO,KAAK21C,KAAL,CAAWsH,KAAX,EAAP;AAEA,EAnCsC;;AAqCvCg1E,wBAAuB,YAAY;;AAElClyH,UAAQC,IAAR,CAAc,gGAAd;AACA,SAAO,KAAK+tC,UAAL,CAAgB58C,GAAhB,CAAqB,mBAArB,CAAP;AAEA,EA1CsC;AA2CvC+gI,4BAA2B,YAAY;;AAEtCnyH,UAAQC,IAAR,CAAc,yGAAd;AACA,SAAO,KAAK+tC,UAAL,CAAgB58C,GAAhB,CAAqB,wBAArB,CAAP;AAEA,EAhDsC;AAiDvCghI,8BAA6B,YAAY;;AAExCpyH,UAAQC,IAAR,CAAc,6GAAd;AACA,SAAO,KAAK+tC,UAAL,CAAgB58C,GAAhB,CAAqB,0BAArB,CAAP;AAEA,EAtDsC;AAuDvCihI,gCAA+B,YAAY;;AAE1CryH,UAAQC,IAAR,CAAc,oHAAd;AACA,SAAO,KAAK+tC,UAAL,CAAgB58C,GAAhB,CAAqB,+BAArB,CAAP;AAEA,EA5DsC;AA6DvCkhI,iCAAgC,YAAY;;AAE3CtyH,UAAQC,IAAR,CAAc,sHAAd;AACA,SAAO,KAAK+tC,UAAL,CAAgB58C,GAAhB,CAAqB,gCAArB,CAAP;AAEA,EAlEsC;AAmEvCmhI,sBAAqB,YAAY;;AAEhCvyH,UAAQC,IAAR,CAAc,6FAAd;AACA,SAAO,KAAK+tC,UAAL,CAAgB58C,GAAhB,CAAqB,kBAArB,CAAP;AAEA,EAxEsC;AAyEvC+1D,yBAAwB,YAAY;;AAEnCnnD,UAAQC,IAAR,CAAc,qFAAd;AACA,SAAO,KAAK2pD,YAAL,CAAkBnQ,cAAzB;AAEA,EA9EsC;AA+EvC+4E,0BAAyB,YAAY;;AAEpCxyH,UAAQC,IAAR,CAAc,uGAAd;AACA,SAAO,KAAK+tC,UAAL,CAAgB58C,GAAhB,CAAqB,wBAArB,CAAP;AAEA,EApFsC;AAqFvCqhI,oBAAmB,UAAWxkD,OAAX,EAAqB;;AAEvCjuE,UAAQC,IAAR,CAAc,qEAAd;AACA,OAAKsxD,cAAL,CAAqB0c,OAArB;AAEA,EA1FsC;AA2FvCqD,eAAc,YAAY;;AAEzBtxE,UAAQC,IAAR,CAAc,wDAAd;AAEA,EA/FsC;AAgGvCyyH,eAAc,YAAY;;AAEzB1yH,UAAQC,IAAR,CAAc,wDAAd;AAEA,EApGsC;AAqGvC0yH,gBAAe,YAAY;;AAE1B3yH,UAAQC,IAAR,CAAc,yDAAd;AAEA,EAzGsC;AA0GvC2yH,kBAAiB,YAAY;;AAE5B5yH,UAAQC,IAAR,CAAc,2DAAd;AAEA,EA9GsC;AA+GvC4yH,iBAAgB,YAAY;;AAE3B7yH,UAAQC,IAAR,CAAc,0DAAd;AAEA;;AAnHsC,CAAxC;;AAuHA/O,OAAO8N,gBAAP,CAAyB8qE,cAAc74E,SAAvC,EAAkD;;AAEjDy2D,mBAAkB;AACjBt2D,OAAK,YAAY;;AAEhB,UAAO,KAAKg7D,SAAL,CAAetvB,OAAtB;AAEA,GALgB;AAMjB79B,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,mEAAd;AACA,QAAKmsD,SAAL,CAAetvB,OAAf,GAAyBnsC,KAAzB;AAEA;AAXgB,EAF+B;AAejD61D,gBAAe;AACdp1D,OAAK,YAAY;;AAEhB,UAAO,KAAKg7D,SAAL,CAAeh6D,IAAtB;AAEA,GALa;AAMd6M,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,6DAAd;AACA,QAAKmsD,SAAL,CAAeh6D,IAAf,GAAsBzB,KAAtB;AAEA;AAXa,EAfkC;AA4BjDmiI,oBAAmB;AAClB1hI,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,4FAAd;AACA,UAAO1P,SAAP;AAEA,GANiB;AAOlB0O,OAAK,YAAW,WAAc;;AAE7Be,WAAQC,IAAR,CAAc,4FAAd;AAEA;AAXiB;AA5B8B,CAAlD;;AA2CA/O,OAAO8N,gBAAP,CAAyB4wD,eAAe3+D,SAAxC,EAAmD;;AAElD4qE,WAAU;AACTzqE,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,6FAAd;AACA,UAAO1P,SAAP;AAEA,GANQ;AAOT0O,OAAK,YAAW,cAAiB;;AAEhCe,WAAQC,IAAR,CAAc,6FAAd;AAEA;AAXQ,EAFwC;AAelD8yH,qBAAoB;AACnB3hI,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,uGAAd;AACA,UAAO1P,SAAP;AAEA,GANkB;AAOnB0O,OAAK,YAAY;;AAEhBe,WAAQC,IAAR,CAAc,uGAAd;AAEA;AAXkB,EAf8B;AA4BlD+yH,oBAAmB;AAClB5hI,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,sGAAd;AACA,UAAO1P,SAAP;AAEA,GANiB;AAOlB0O,OAAK,YAAY;;AAEhBe,WAAQC,IAAR,CAAc,sGAAd;AAEA;AAXiB;;AA5B+B,CAAnD;;AA4CA;;AAEA/O,OAAO8N,gBAAP,CAAyBsa,kBAAkBroB,SAA3C,EAAsD;;AAErD8kB,QAAO;AACN3kB,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,wDAAd;AACA,UAAO,KAAK0Z,OAAL,CAAa5D,KAApB;AAEA,GANK;AAON9W,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,wDAAd;AACA,QAAK0Z,OAAL,CAAa5D,KAAb,GAAqBplB,KAArB;AAEA;AAZK,EAF8C;AAgBrDqlB,QAAO;AACN5kB,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,wDAAd;AACA,UAAO,KAAK0Z,OAAL,CAAa3D,KAApB;AAEA,GANK;AAON/W,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,wDAAd;AACA,QAAK0Z,OAAL,CAAa3D,KAAb,GAAqBrlB,KAArB;AAEA;AAZK,EAhB8C;AA8BrDslB,YAAW;AACV7kB,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,gEAAd;AACA,UAAO,KAAK0Z,OAAL,CAAa1D,SAApB;AAEA,GANS;AAOVhX,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,gEAAd;AACA,QAAK0Z,OAAL,CAAa1D,SAAb,GAAyBtlB,KAAzB;AAEA;AAZS,EA9B0C;AA4CrDulB,YAAW;AACV9kB,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,gEAAd;AACA,UAAO,KAAK0Z,OAAL,CAAazD,SAApB;AAEA,GANS;AAOVjX,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,gEAAd;AACA,QAAK0Z,OAAL,CAAazD,SAAb,GAAyBvlB,KAAzB;AAEA;AAZS,EA5C0C;AA0DrDylB,aAAY;AACXhlB,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,kEAAd;AACA,UAAO,KAAK0Z,OAAL,CAAavD,UAApB;AAEA,GANU;AAOXnX,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,kEAAd;AACA,QAAK0Z,OAAL,CAAavD,UAAb,GAA0BzlB,KAA1B;AAEA;AAZU,EA1DyC;AAwErDkS,SAAQ;AACPzR,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,0DAAd;AACA,UAAO,KAAK0Z,OAAL,CAAa9W,MAApB;AAEA,GANM;AAOP5D,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,0DAAd;AACA,QAAK0Z,OAAL,CAAa9W,MAAb,GAAsBlS,KAAtB;AAEA;AAZM,EAxE6C;AAsFrD+lB,SAAQ;AACPtlB,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,0DAAd;AACA,UAAO,KAAK0Z,OAAL,CAAajD,MAApB;AAEA,GANM;AAOPzX,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,0DAAd;AACA,QAAK0Z,OAAL,CAAajD,MAAb,GAAsB/lB,KAAtB;AAEA;AAZM,EAtF6C;AAoGrDwlB,SAAQ;AACP/kB,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,0DAAd;AACA,UAAO,KAAK0Z,OAAL,CAAaxD,MAApB;AAEA,GANM;AAOPlX,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,0DAAd;AACA,QAAK0Z,OAAL,CAAaxD,MAAb,GAAsBxlB,KAAtB;AAEA;AAZM,EApG6C;AAkHrDyB,OAAM;AACLhB,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,sDAAd;AACA,UAAO,KAAK0Z,OAAL,CAAavnB,IAApB;AAEA,GANI;AAOL6M,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,sDAAd;AACA,QAAK0Z,OAAL,CAAavnB,IAAb,GAAoBzB,KAApB;AAEA;AAZI,EAlH+C;AAgIrDimB,kBAAiB;AAChBxlB,OAAK,YAAY;;AAEhB4O,WAAQC,IAAR,CAAc,4EAAd;AACA,UAAO,KAAK0Z,OAAL,CAAa/C,eAApB;AAEA,GANe;AAOhB3X,OAAK,UAAWtO,KAAX,EAAmB;;AAEvBqP,WAAQC,IAAR,CAAc,4EAAd;AACA,QAAK0Z,OAAL,CAAa/C,eAAb,GAA+BjmB,KAA/B;AAEA;AAZe;;AAhIoC,CAAtD;;AAiJA;;AAEAO,OAAO8N,gBAAP,CAAyB4mE,aAAa30E,SAAtC,EAAiD;;AAEhDgiI,WAAU;AACTh0H,OAAK,YAAW,WAAc;;AAE7Be,WAAQC,IAAR,CAAc,iDAAd;AAEA;AALQ;;AAFsC,CAAjD;;AAYA;;AAEAqyG,MAAMrhH,SAAN,CAAgB69F,IAAhB,GAAuB,UAAWpB,IAAX,EAAkB;;AAExC1tF,SAAQC,IAAR,CAAc,wEAAd;AACA,KAAIoc,QAAQ,IAAZ;AACA,KAAI62G,cAAc,IAAIzjB,WAAJ,EAAlB;AACAyjB,aAAYpkC,IAAZ,CAAkBpB,IAAlB,EAAwB,UAAW34D,MAAX,EAAoB;;AAE3C1Y,QAAM+2F,SAAN,CAAiBr+E,MAAjB;AAEA,EAJD;AAKA,QAAO,IAAP;AAEA,CAZD;;AAcAkgF,cAAchkH,SAAd,CAAwBkiI,OAAxB,GAAkC,YAAY;;AAE7CnzH,SAAQC,IAAR,CAAc,6DAAd;AACA,QAAO,KAAKs1G,gBAAL,EAAP;AAEA,CALD;;AAOA;;AAEAlF,WAAWp/G,SAAX,CAAqBmiI,aAArB,GAAqC,UAAWz9E,QAAX,EAAqBU,KAArB,EAA6B;;AAEjEr2C,SAAQC,IAAR,CAAc,sDAAd;AACA,QAAO,KAAKyP,MAAL,CAAaimC,QAAb,EAAuBU,KAAvB,CAAP;AAEA,CALD;;AAOA;;AAEA,IAAIg9E,gBAAgB;;AAEnBxoG,QAAO,UAAWyoG,SAAX,EAAsBvqF,SAAtB,EAAiC9H,mBAAjC,EAAuD;;AAE7DjhC,UAAQC,IAAR,CAAc,iIAAd;AACA,MAAIgN,MAAJ;;AAEA,MAAK87B,UAAU9G,MAAf,EAAwB;;AAEvB8G,aAAUpyB,gBAAV,IAA8BoyB,UAAU3xB,YAAV,EAA9B;;AAEAnK,YAAS87B,UAAU97B,MAAnB;AACA87B,eAAYA,UAAUvsB,QAAtB;AAEA;;AAED82G,YAAUzoG,KAAV,CAAiBke,SAAjB,EAA4B97B,MAA5B,EAAoCg0B,mBAApC;AAEA,EAlBkB;;AAoBnB79B,SAAQ,UAAWoZ,QAAX,EAAsB;;AAE7Bxc,UAAQC,IAAR,CAAc,2FAAd;AACA,SAAOuc,SAASpZ,MAAT,EAAP;AAEA;;AAzBkB,CAApB;;AA6BA,IAAImwH,aAAa;;AAEhB9hC,cAAalhG,SAFG;;AAIhB0gG,cAAa,UAAWv4E,GAAX,EAAgB5C,OAAhB,EAAyB83E,MAAzB,EAAiCE,OAAjC,EAA2C;;AAEvD9tF,UAAQC,IAAR,CAAc,sFAAd;;AAEA,MAAI+wF,SAAS,IAAIiB,aAAJ,EAAb;AACAjB,SAAOc,cAAP,CAAuB,KAAKL,WAA5B;;AAEA,MAAI93E,UAAUq3E,OAAOlC,IAAP,CAAap2E,GAAb,EAAkBk1E,MAAlB,EAA0Br9F,SAA1B,EAAqCu9F,OAArC,CAAd;;AAEA,MAAKh4E,OAAL,EAAe6D,QAAQ7D,OAAR,GAAkBA,OAAlB;;AAEf,SAAO6D,OAAP;AAEA,EAjBe;;AAmBhB65G,kBAAiB,UAAWxhC,IAAX,EAAiBl8E,OAAjB,EAA0B83E,MAA1B,EAAkCE,OAAlC,EAA4C;;AAE5D9tF,UAAQC,IAAR,CAAc,8FAAd;;AAEA,MAAI+wF,SAAS,IAAIe,iBAAJ,EAAb;AACAf,SAAOc,cAAP,CAAuB,KAAKL,WAA5B;;AAEA,MAAI93E,UAAUq3E,OAAOlC,IAAP,CAAakD,IAAb,EAAmBpE,MAAnB,EAA2Br9F,SAA3B,EAAsCu9F,OAAtC,CAAd;;AAEA,MAAKh4E,OAAL,EAAe6D,QAAQ7D,OAAR,GAAkBA,OAAlB;;AAEf,SAAO6D,OAAP;AAEA,EAhCe;;AAkChB85G,wBAAuB,YAAY;;AAElCzzH,UAAQyD,KAAR,CAAe,uFAAf;AAEA,EAtCe;;AAwChBiwH,4BAA2B,YAAY;;AAEtC1zH,UAAQyD,KAAR,CAAe,2FAAf;AAEA;;AA5Ce,CAAjB;;AAgDA;;AAEA,SAASkwH,SAAT,GAAqB;;AAEpB3zH,SAAQyD,KAAR,CAAe,wEAAf;;AAEA,MAAKmwH,aAAL,GAAqB,UAAW5mH,MAAX,EAAmBmG,MAAnB,EAA4B;;AAEhDnT,UAAQC,IAAR,CAAc,4DAAd;AACA+M,SAAOkG,OAAP,CAAgBC,MAAhB;AAEA,EALD;;AAOA,MAAK0gH,eAAL,GAAuB,UAAW7mH,MAAX,EAAmBmG,MAAnB,EAA4B;;AAElDnT,UAAQC,IAAR,CAAc,gEAAd;AACA+M,SAAOsG,SAAP,CAAkBH,MAAlB;AAEA,EALD;;AAOA,MAAK2gH,UAAL,GAAkB,YAAY;;AAE7B9zH,UAAQyD,KAAR,CAAe,kEAAf;AAEA,EAJD;AAMA;;AAED;;AAEA,SAASswH,cAAT,GAA0B;;AAEzB/zH,SAAQyD,KAAR,CAAe,iFAAf;;AAEA,MAAKmnE,UAAL,GAAkBhzD,SAASC,eAAT,CAA0B,8BAA1B,EAA0D,QAA1D,CAAlB;AACA,MAAK6+B,KAAL,GAAa,YAAY,CAAE,CAA3B;AACA,MAAKP,MAAL,GAAc,YAAY,CAAE,CAA5B;AACA,MAAKc,aAAL,GAAqB,YAAY,CAAE,CAAnC;AACA,MAAKj9B,OAAL,GAAe,YAAY,CAAE,CAA7B;AAEA;;AAED;;AAEA,IAAIg6G,aAAa;;AAEhBC,4BAA2B,YAAW,yBAA4B;;AAEjEj0H,UAAQyD,KAAR,CAAe,qEAAf;AAEA,EANe;;AAQhBywH,SAAQ,YAAW,0BAA6B;;AAE/Cl0H,UAAQyD,KAAR,CAAe,qEAAf;AAEA,EAZe;;AAchB0wH,SAAQ,YAAW,0BAA6B;;AAE/Cn0H,UAAQyD,KAAR,CAAe,qEAAf;AAEA;;AAlBe,CAAjB;;AAsBA;;AAEA,SAAS2wH,SAAT,GAAqB;;AAEpBp0H,SAAQyD,KAAR,CAAe,qEAAf;AAEA;;QAEQwW,wBAAAA;QAAuBX,oBAAAA;QAAmBwwD,gBAAAA;QAAeh4C,YAAAA;QAAWpE,cAAAA;QAAa9C,gBAAAA;QAAeD,cAAAA;QAAakrD,UAAAA;QAASC,MAAAA;QAAKC,QAAAA;QAAOG,SAAAA;QAAQK,MAAAA;QAAKc,cAAAA;QAAaT,WAAAA;QAAUQ,OAAAA;QAAM/jC,OAAAA;QAAMilC,eAAAA;QAAcY,WAAAA;QAAUb,OAAAA;QAAMc,SAAAA;QAAQQ,QAAAA;QAAOE,eAAAA;QAAcx/D,cAAAA;QAAa4/D,oBAAAA;QAAmBl8B,cAAAA;QAAagV,gBAAAA;QAAemnB,eAAAA;QAActkE,UAAAA;QAASk7E,0BAAAA;QAAyBQ,oBAAAA;QAAmBS,oBAAAA;QAAmBE,gBAAAA;QAAe8X,eAAAA;QAAc9F,iBAAAA;QAAgBI,uBAAAA;QAAsB3V,wBAAAA;QAAuBf,iBAAAA;QAAgB6a,aAAAA;QAAYhX,cAAAA;QAAa0Z,oBAAAA;QAAmBoE,aAAAA;QAAY1gB,aAAAA;QAAY8V,SAAAA;QAAQsD,cAAAA;QAAaxa,QAAAA;QAAOiiB,cAAAA;QAAarV,kBAAAA;QAAiBC,YAAAA;QAAWE,aAAAA;QAAYI,gBAAAA;QAAeT,kBAAAA;QAAiBM,yBAAAA;QAAwBC,mBAAAA;QAAkBC,eAAAA;QAAcP,cAAAA;QAAaF,QAAAA;QAAO2V,eAAAA;QAAcprC,oBAAAA;QAAmBloC,qBAAAA;QAAoB+zE,aAAAA;QAAY5qC,cAAAA;QAAarpC,SAAAA;QAAQy0E,gBAAAA;QAAeqD,kBAAAA;QAAiB3E,eAAAA;QAAc0F,gBAAAA;QAAe3C,QAAAA;QAAO7R,sBAAAA;QAAqB7F,sBAAAA;QAAqBmC,0BAAAA;QAAyBG,sBAAAA;QAAqBD,qBAAAA;QAAoB5B,uBAAAA;QAAsBqa,gBAAAA;QAAeuB,kBAAAA;QAAiBlc,gBAAAA;QAAe+D,iBAAAA;QAAgB6c,uBAAAA;QAAsBiH,iBAAAA;QAAgB9gB,gBAAAA;QAAe4kB,UAAAA;QAASC,0BAAAA;QAAyB1/E,iBAAAA;QAAgBtJ,WAAAA;QAAUipF,6BAAAA;QAA4BI,6BAAAA;QAA4BF,oBAAAA;QAAmBG,2BAAAA;QAA0B3pF,QAAAA;QAAOtF,WAAAA;QAAUkvF,YAAAA;QAAW3vF,SAAAA;QAAQrlC,kBAAAA;QAAiBu1H,QAAAA;QAAO3qB,8BAAAA;QAA6B0B,oBAAAA;QAAmBK,sBAAAA;QAAqB1B,mBAAAA;QAAkB7B,cAAAA;QAAatpD,WAAAA;QAAmBxhD,OAAT0L;QAAeisH,YAAAA;QAAWI,cAAAA;QAAajoG,QAAAA;QAAOsB,UAAAA;QAASjD,SAAAA;QAAQ8vB,MAAAA;QAAKjrC,UAAAA;QAASsR,UAAAA;QAAS0F,OAAAA;QAAMguG,OAAAA;QAAMh3E,QAAAA;QAAO5a,QAAAA;QAAO9d,UAAAA;QAASvT,UAAAA;QAASxG,UAAAA;QAASiP,aAAAA;QAAYwd,QAAAA;QAAOi9F,wBAAAA;QAAuBC,sBAAAA;QAAqBK,kBAAAA;QAAiBM,iBAAAA;QAAgBG,mBAAAA;QAAkBE,sBAAAA;QAAqBC,wBAAAA;QAAuBC,aAAAA;QAAYC,kBAAAA;QAAiBG,oBAAAA;QAAmBC,yBAAAA;QAAwBG,eAAAA;QAAcU,YAAAA;QAAWC,aAAAA;QAAYC,cAAAA;QAAaI,cAAAA;QAAaK,aAAAA;QAAY3xB,QAAAA;QAAOnB,OAAAA;QAAM+S,YAAAA;QAAWqC,OAAAA;QAAMjW,YAAAA;QAAW1F,QAAAA;QAAOnP,aAAAA;QAAY3gB,aAAAA;QAAY6X,oBAAAA;QAAmBK,qBAAAA;QAAoBI,2BAAAA;QAA0ByB,sBAAAA;QAAqBC,4BAAAA;QAA2BC,qBAAAA;QAAoBC,2BAAAA;QAA0BC,sBAAAA;QAAqBC,4BAAAA;QAA2BC,uBAAAA;QAAsBC,6BAAAA;QAA4B5B,qBAAAA;QAAoBE,2BAAAA;QAA0B2B,eAAAA;QAAcM,qBAAAA;QAAoBY,oBAAAA;QAAmBG,0BAAAA;QAAyBS,gBAAAA;QAAeE,sBAAAA;QAAqByK,eAAAA;QAAcE,qBAAAA;QAAoBI,iBAAAA;QAAgBK,uBAAAA;QAAsBI,eAAAA;QAAcK,qBAAAA;QAAoBlgD,gBAAAA;QAAeC,sBAAAA;QAAqBqgD,gBAAAA;QAAeE,sBAAAA;QAAqBK,gBAAAA;QAAeC,sBAAAA;QAAqB3H,kBAAAA;QAAiBC,wBAAAA;QAAuBgI,gBAAAA;QAAeoB,eAAAA;QAAcC,qBAAAA;QAAoBf,mBAAAA;QAAkBI,yBAAAA;QAAwBY,iBAAAA;QAAgBC,uBAAAA;QAAsBhkD,cAAAA;QAAaI,oBAAAA;QAAmBkhB,iBAAAA;QAAgBurB,iBAAAA;QAAgBsX,oBAAAA;QAAmBz/C,iBAAAA;QAAgB2c,iBAAAA;QAAgBH,uBAAAA;QAAsBD,uBAAAA;QAAsBF,oBAAAA;QAAmBC,mBAAAA;QAAkBH,qBAAAA;QAAoBC,sBAAAA;QAAqBH,oBAAAA;QAAmBC,uBAAAA;QAAsBrc,oBAAAA;QAAmB6c,qBAAAA;QAAoBD,oBAAAA;QAAmBvf,WAAAA;QAAU5E,yBAAAA;QAAwBD,yBAAAA;QAAwBD,wBAAAA;QAAuBD,uBAAAA;QAAsBD,wBAAAA;QAAuBD,uBAAAA;QAAsBF,8BAAAA;QAA6BD,uBAAAA;QAAsBD,sBAAAA;QAAqBlB,kBAAAA;QAAiBuwD,WAAAA;QAAUe,mBAAAA;QAAkBe,mBAAAA;QAAkBG,oBAAAA;QAAmB9C,eAAAA;QAAcgD,YAAAA;QAAWG,aAAAA;QAAYE,uBAAAA;QAAsBE,wBAAAA;QAAuBE,cAAAA;QAAavkG,WAAAA;QAAUC,QAAAA;QAAOI,eAAAA;QAAcC,eAAAA;QAAcC,gBAAAA;QAAeC,oBAAAA;QAAmBC,uBAAAA;QAAsBC,wBAAAA;QAAuBC,iBAAAA;QAAgBC,eAAAA;QAAcC,mBAAAA;QAAkBC,YAAAA;QAAWC,WAAAA;QAAUC,aAAAA;QAAYC,cAAAA;QAAaC,gBAAAA;QAAeC,WAAAA;QAAUC,aAAAA;QAAYC,eAAAA;QAAcC,aAAAA;QAAYC,iBAAAA;QAAgBC,mBAAAA;QAAkBC,sBAAAA;QAAqBC,mBAAAA;QAAkBC,iBAAAA;QAAgBC,cAAAA;QAAaC,mBAAAA;QAAkBC,0BAAAA;QAAyBC,cAAAA;QAAaC,cAAAA;QAAaC,aAAAA;QAAYC,YAAAA;QAAWC,iBAAAA;QAAgBC,yBAAAA;QAAwBC,iBAAAA;QAAgBC,yBAAAA;QAAwBC,iBAAAA;QAAgBC,yBAAAA;QAAwBC,iBAAAA;QAAgBC,yBAAAA;QAAwBC,yBAAAA;QAAwBC,aAAAA;QAAYC,cAAAA;QAAaC,YAAAA;QAAWC,iBAAAA;QAAgBC,aAAAA;QAAYC,oBAAAA;QAAmBC,eAAAA;QAAcC,gBAAAA;QAAeC,oBAAAA;QAAmBC,eAAAA;QAAcC,eAAAA;QAAcC,gBAAAA;QAAeC,oBAAAA;QAAmBC,sBAAAA;QAAqBC,wBAAAA;QAAuBC,oBAAAA;QAAmBC,YAAAA;QAAWC,wBAAAA;QAAuBC,wBAAAA;QAAuBC,mCAAAA;QAAkCC,mCAAAA;QAAkCC,6BAAAA;QAA4BC,0BAAAA;QAAyBC,0BAAAA;QAAyBC,iBAAAA;QAAgBC,sBAAAA;QAAqBC,yBAAAA;QAAwBC,gBAAAA;QAAeC,6BAAAA;QAA4BC,4BAAAA;QAA2BC,eAAAA;QAAcC,4BAAAA;QAA2BC,2BAAAA;QAA0BC,mBAAAA;QAAkBC,WAAAA;QAAUC,YAAAA;QAAWC,oBAAAA;QAAmBC,UAAAA;QAASC,kBAAAA;QAAiBC,YAAAA;QAAWC,gBAAAA;QAAeC,wBAAAA;QAAuBC,wBAAAA;QAAuBC,uBAAAA;QAAsBC,qBAAAA;QAAoBC,cAAAA;QAAaC,YAAAA;QAAWC,aAAAA;QAAYC,kBAAAA;QAAiBC,uBAAAA;QAAsBC,aAAAA;QAAYC,cAAAA;QAAaC,qBAAAA;QAAoBC,uBAAAA;QAAsBC,wBAAAA;QAAuBC,wBAAAA;QAAuBC,wBAAAA;QAAuBC,0BAAAA;QAAyBC,0BAAAA;QAAyBC,2BAAAA;QAA0BC,2BAAAA;QAA0BC,kBAAAA;QAAiBC,uBAAAA;QAAsBC,uBAAAA;QAAsBC,uBAAAA;QAAsBC,uBAAAA;QAAsBC,uBAAAA;QAAsBC,uBAAAA;QAAsBC,uBAAAA;QAAsBC,uBAAAA;QAAsBC,wBAAAA;QAAuBC,wBAAAA;QAAuBC,wBAAAA;QAAuBC,yBAAAA;QAAwBC,yBAAAA;QAAwBC,yBAAAA;QAAwBC,WAAAA;QAAUC,aAAAA;QAAYC,eAAAA;QAAcC,sBAAAA;QAAqBC,oBAAAA;QAAmBC,oBAAAA;QAAmBC,sBAAAA;QAAqBC,kBAAAA;QAAiBC,mBAAAA;QAAkBC,oBAAAA;QAAmBC,wBAAAA;QAAuBC,sBAAAA;QAAqBC,iBAAAA;QAAgBC,eAAAA;QAAcC,gBAAAA;QAAeC,eAAAA;QAAcC,iBAAAA;QAAgBC,gBAAAA;QAAeC,iBAAAA;QAAgBC,eAAAA;QAAcC,oBAAAA;QAAmBC,mBAAAA;QAAiCo4H,eAAflrF;QAA6BuiF,QAAAA;QAAOC,YAAAA;QAAWC,aAAAA;QAAYC,mBAAAA;QAAkBC,gBAAAA;QAAe3E,aAAAA;QAAY4E,WAAAA;QAAUC,iBAAAA;QAAgBC,qBAAAA;QAAoBC,wBAAAA;QAAuBC,yBAAAA;QAAwBC,SAAAA;QAAQC,yBAAAA;QAAwBC,gBAAAA;QAAeC,iBAAAA;QAAgBC,wBAAAA;QAAuBC,iBAAAA;QAAgBC,kBAAAA;QAAiBC,iBAAAA;QAAgBC,kBAAAA;QAAiBC,mBAAAA;QAAkBC,mBAAAA;QAAkBM,qBAAAA;QAAoBC,eAAAA;QAAcC,SAAAA;QAAQI,aAAAA;QAAYC,oBAAAA;QAAmBC,cAAAA;QAAaE,kBAAAA;QAAiBC,YAAAA;QAAWC,sBAAAA;QAAqBqF,gBAAAA;QAAeE,aAAAA;QAAYI,YAAAA;QAAWI,iBAAAA;QAAgBC,aAAAA;QAAYI,YAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClTf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"scene3.e967b451.map","sourceRoot":"..","sourcesContent":["// Polyfills\n\nif ( Number.EPSILON === undefined ) {\n\n\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n}\n\nif ( Number.isInteger === undefined ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\n\n\tNumber.isInteger = function ( value ) {\n\n\t\treturn typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value;\n\n\t};\n\n}\n\n//\n\nif ( Math.sign === undefined ) {\n\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\tMath.sign = function ( x ) {\n\n\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t};\n\n}\n\nif ( 'name' in Function.prototype === false ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\tget: function () {\n\n\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t}\n\n\t} );\n\n}\n\nif ( Object.assign === undefined ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t( function () {\n\n\t\tObject.assign = function ( target ) {\n\n\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t}\n\n\t\t\tvar output = Object( target );\n\n\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn output;\n\n\t\t};\n\n\t} )();\n\n}\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nfunction EventDispatcher() {}\n\nObject.assign( EventDispatcher.prototype, {\n\n\taddEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tvar listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t},\n\n\thasEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tvar listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t},\n\n\tremoveEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tvar listeners = this._listeners;\n\t\tvar listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tdispatchEvent: function ( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tvar listeners = this._listeners;\n\t\tvar listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\tvar array = listenerArray.slice( 0 );\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nvar REVISION = '93';\nvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\nvar CullFaceNone = 0;\nvar CullFaceBack = 1;\nvar CullFaceFront = 2;\nvar CullFaceFrontBack = 3;\nvar FrontFaceDirectionCW = 0;\nvar FrontFaceDirectionCCW = 1;\nvar BasicShadowMap = 0;\nvar PCFShadowMap = 1;\nvar PCFSoftShadowMap = 2;\nvar FrontSide = 0;\nvar BackSide = 1;\nvar DoubleSide = 2;\nvar FlatShading = 1;\nvar SmoothShading = 2;\nvar NoColors = 0;\nvar FaceColors = 1;\nvar VertexColors = 2;\nvar NoBlending = 0;\nvar NormalBlending = 1;\nvar AdditiveBlending = 2;\nvar SubtractiveBlending = 3;\nvar MultiplyBlending = 4;\nvar CustomBlending = 5;\nvar AddEquation = 100;\nvar SubtractEquation = 101;\nvar ReverseSubtractEquation = 102;\nvar MinEquation = 103;\nvar MaxEquation = 104;\nvar ZeroFactor = 200;\nvar OneFactor = 201;\nvar SrcColorFactor = 202;\nvar OneMinusSrcColorFactor = 203;\nvar SrcAlphaFactor = 204;\nvar OneMinusSrcAlphaFactor = 205;\nvar DstAlphaFactor = 206;\nvar OneMinusDstAlphaFactor = 207;\nvar DstColorFactor = 208;\nvar OneMinusDstColorFactor = 209;\nvar SrcAlphaSaturateFactor = 210;\nvar NeverDepth = 0;\nvar AlwaysDepth = 1;\nvar LessDepth = 2;\nvar LessEqualDepth = 3;\nvar EqualDepth = 4;\nvar GreaterEqualDepth = 5;\nvar GreaterDepth = 6;\nvar NotEqualDepth = 7;\nvar MultiplyOperation = 0;\nvar MixOperation = 1;\nvar AddOperation = 2;\nvar NoToneMapping = 0;\nvar LinearToneMapping = 1;\nvar ReinhardToneMapping = 2;\nvar Uncharted2ToneMapping = 3;\nvar CineonToneMapping = 4;\nvar UVMapping = 300;\nvar CubeReflectionMapping = 301;\nvar CubeRefractionMapping = 302;\nvar EquirectangularReflectionMapping = 303;\nvar EquirectangularRefractionMapping = 304;\nvar SphericalReflectionMapping = 305;\nvar CubeUVReflectionMapping = 306;\nvar CubeUVRefractionMapping = 307;\nvar RepeatWrapping = 1000;\nvar ClampToEdgeWrapping = 1001;\nvar MirroredRepeatWrapping = 1002;\nvar NearestFilter = 1003;\nvar NearestMipMapNearestFilter = 1004;\nvar NearestMipMapLinearFilter = 1005;\nvar LinearFilter = 1006;\nvar LinearMipMapNearestFilter = 1007;\nvar LinearMipMapLinearFilter = 1008;\nvar UnsignedByteType = 1009;\nvar ByteType = 1010;\nvar ShortType = 1011;\nvar UnsignedShortType = 1012;\nvar IntType = 1013;\nvar UnsignedIntType = 1014;\nvar FloatType = 1015;\nvar HalfFloatType = 1016;\nvar UnsignedShort4444Type = 1017;\nvar UnsignedShort5551Type = 1018;\nvar UnsignedShort565Type = 1019;\nvar UnsignedInt248Type = 1020;\nvar AlphaFormat = 1021;\nvar RGBFormat = 1022;\nvar RGBAFormat = 1023;\nvar LuminanceFormat = 1024;\nvar LuminanceAlphaFormat = 1025;\nvar RGBEFormat = RGBAFormat;\nvar DepthFormat = 1026;\nvar DepthStencilFormat = 1027;\nvar RGB_S3TC_DXT1_Format = 33776;\nvar RGBA_S3TC_DXT1_Format = 33777;\nvar RGBA_S3TC_DXT3_Format = 33778;\nvar RGBA_S3TC_DXT5_Format = 33779;\nvar RGB_PVRTC_4BPPV1_Format = 35840;\nvar RGB_PVRTC_2BPPV1_Format = 35841;\nvar RGBA_PVRTC_4BPPV1_Format = 35842;\nvar RGBA_PVRTC_2BPPV1_Format = 35843;\nvar RGB_ETC1_Format = 36196;\nvar RGBA_ASTC_4x4_Format = 37808;\nvar RGBA_ASTC_5x4_Format = 37809;\nvar RGBA_ASTC_5x5_Format = 37810;\nvar RGBA_ASTC_6x5_Format = 37811;\nvar RGBA_ASTC_6x6_Format = 37812;\nvar RGBA_ASTC_8x5_Format = 37813;\nvar RGBA_ASTC_8x6_Format = 37814;\nvar RGBA_ASTC_8x8_Format = 37815;\nvar RGBA_ASTC_10x5_Format = 37816;\nvar RGBA_ASTC_10x6_Format = 37817;\nvar RGBA_ASTC_10x8_Format = 37818;\nvar RGBA_ASTC_10x10_Format = 37819;\nvar RGBA_ASTC_12x10_Format = 37820;\nvar RGBA_ASTC_12x12_Format = 37821;\nvar LoopOnce = 2200;\nvar LoopRepeat = 2201;\nvar LoopPingPong = 2202;\nvar InterpolateDiscrete = 2300;\nvar InterpolateLinear = 2301;\nvar InterpolateSmooth = 2302;\nvar ZeroCurvatureEnding = 2400;\nvar ZeroSlopeEnding = 2401;\nvar WrapAroundEnding = 2402;\nvar TrianglesDrawMode = 0;\nvar TriangleStripDrawMode = 1;\nvar TriangleFanDrawMode = 2;\nvar LinearEncoding = 3000;\nvar sRGBEncoding = 3001;\nvar GammaEncoding = 3007;\nvar RGBEEncoding = 3002;\nvar LogLuvEncoding = 3003;\nvar RGBM7Encoding = 3004;\nvar RGBM16Encoding = 3005;\nvar RGBDEncoding = 3006;\nvar BasicDepthPacking = 3200;\nvar RGBADepthPacking = 3201;\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar _Math = {\n\n\tDEG2RAD: Math.PI / 180,\n\tRAD2DEG: 180 / Math.PI,\n\n\tgenerateUUID: ( function () {\n\n\t\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\t\tvar lut = [];\n\n\t\tfor ( var i = 0; i < 256; i ++ ) {\n\n\t\t\tlut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );\n\n\t\t}\n\n\t\treturn function generateUUID() {\n\n\t\t\tvar d0 = Math.random() * 0xffffffff | 0;\n\t\t\tvar d1 = Math.random() * 0xffffffff | 0;\n\t\t\tvar d2 = Math.random() * 0xffffffff | 0;\n\t\t\tvar d3 = Math.random() * 0xffffffff | 0;\n\t\t\tvar uuid = lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t\tlut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t\tlut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] +\n\t\t\t\tlut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ];\n\n\t\t\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\t\t\treturn uuid.toUpperCase();\n\n\t\t};\n\n\t} )(),\n\n\tclamp: function ( value, min, max ) {\n\n\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t},\n\n\t// compute euclidian modulo of m % n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\teuclideanModulo: function ( n, m ) {\n\n\t\treturn ( ( n % m ) + m ) % m;\n\n\t},\n\n\t// Linear mapping from range <a1, a2> to range <b1, b2>\n\n\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t},\n\n\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\tlerp: function ( x, y, t ) {\n\n\t\treturn ( 1 - t ) * x + t * y;\n\n\t},\n\n\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\tsmoothstep: function ( x, min, max ) {\n\n\t\tif ( x <= min ) return 0;\n\t\tif ( x >= max ) return 1;\n\n\t\tx = ( x - min ) / ( max - min );\n\n\t\treturn x * x * ( 3 - 2 * x );\n\n\t},\n\n\tsmootherstep: function ( x, min, max ) {\n\n\t\tif ( x <= min ) return 0;\n\t\tif ( x >= max ) return 1;\n\n\t\tx = ( x - min ) / ( max - min );\n\n\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t},\n\n\t// Random integer from <low, high> interval\n\n\trandInt: function ( low, high ) {\n\n\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t},\n\n\t// Random float from <low, high> interval\n\n\trandFloat: function ( low, high ) {\n\n\t\treturn low + Math.random() * ( high - low );\n\n\t},\n\n\t// Random float from <-range/2, range/2> interval\n\n\trandFloatSpread: function ( range ) {\n\n\t\treturn range * ( 0.5 - Math.random() );\n\n\t},\n\n\tdegToRad: function ( degrees ) {\n\n\t\treturn degrees * _Math.DEG2RAD;\n\n\t},\n\n\tradToDeg: function ( radians ) {\n\n\t\treturn radians * _Math.RAD2DEG;\n\n\t},\n\n\tisPowerOfTwo: function ( value ) {\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t},\n\n\tceilPowerOfTwo: function ( value ) {\n\n\t\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n\t},\n\n\tfloorPowerOfTwo: function ( value ) {\n\n\t\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author philogb / http://blog.thejit.org/\n * @author egraether / http://egraether.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n */\n\nfunction Vector2( x, y ) {\n\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\n}\n\nObject.defineProperties( Vector2.prototype, {\n\n\t\"width\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t}\n\n\t},\n\n\t\"height\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Vector2.prototype, {\n\n\tisVector2: true,\n\n\tset: function ( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tdivide: function ( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tapplyMatrix3: function ( m ) {\n\n\t\tvar x = this.x, y = this.y;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function () {\n\n\t\tvar min = new Vector2();\n\t\tvar max = new Vector2();\n\n\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\tmin.set( minVal, minVal );\n\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\treturn this.clamp( min, max );\n\n\t\t};\n\n\t}(),\n\n\tclampLength: function ( min, max ) {\n\n\t\tvar length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tangle: function () {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\treturn angle;\n\n\t},\n\n\tdistanceTo: function ( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t},\n\n\tdistanceToSquared: function ( v ) {\n\n\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t},\n\n\tmanhattanDistanceTo: function ( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t},\n\n\trotateAround: function ( center, angle ) {\n\n\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tvar x = this.x - center.x;\n\t\tvar y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author supereggbert / http://www.paulbrunt.co.uk/\n * @author philogb / http://blog.thejit.org/\n * @author jordi_ros / http://plattsoft.com\n * @author D1plo1d / http://github.com/D1plo1d\n * @author alteredq / http://alteredqualia.com/\n * @author mikael emtinger / http://gomo.se/\n * @author timknip / http://www.floorplanner.com/\n * @author bhouston / http://clara.io\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Matrix4() {\n\n\tthis.elements = [\n\n\t\t1, 0, 0, 0,\n\t\t0, 1, 0, 0,\n\t\t0, 0, 1, 0,\n\t\t0, 0, 0, 1\n\n\t];\n\n\tif ( arguments.length > 0 ) {\n\n\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t}\n\n}\n\nObject.assign( Matrix4.prototype, {\n\n\tisMatrix4: true,\n\n\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t},\n\n\tidentity: function () {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t},\n\n\tcopy: function ( m ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t},\n\n\tcopyPosition: function ( m ) {\n\n\t\tvar te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t},\n\n\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t},\n\n\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\textractRotation: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function extractRotation( m ) {\n\n\t\t\t// this method does not support reflection matrices\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\t\tte[ 3 ] = 0;\n\n\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\t\tte[ 7 ] = 0;\n\n\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tmakeRotationFromEuler: function ( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tvar te = this.elements;\n\n\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationFromQuaternion: function () {\n\n\t\tvar zero = new Vector3( 0, 0, 0 );\n\t\tvar one = new Vector3( 1, 1, 1 );\n\n\t\treturn function makeRotationFromQuaternion( q ) {\n\n\t\t\treturn this.compose( zero, q, one );\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\tvar x = new Vector3();\n\t\tvar y = new Vector3();\n\t\tvar z = new Vector3();\n\n\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tz.subVectors( eye, target );\n\n\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t// eye and target are in the same position\n\n\t\t\t\tz.z = 1;\n\n\t\t\t}\n\n\t\t\tz.normalize();\n\t\t\tx.crossVectors( up, z );\n\n\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t// up and z are parallel\n\n\t\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t\tz.x += 0.0001;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz.z += 0.0001;\n\n\t\t\t\t}\n\n\t\t\t\tz.normalize();\n\t\t\t\tx.crossVectors( up, z );\n\n\t\t\t}\n\n\t\t\tx.normalize();\n\t\t\ty.crossVectors( z, x );\n\n\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tmultiply: function ( m, n ) {\n\n\t\tif ( n !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t}\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t},\n\n\tpremultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t},\n\n\tmultiplyMatrices: function ( a, b ) {\n\n\t\tvar ae = a.elements;\n\t\tvar be = b.elements;\n\t\tvar te = this.elements;\n\n\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t},\n\n\tapplyToBufferAttribute: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t}\n\n\t\t\treturn attribute;\n\n\t\t};\n\n\t}(),\n\n\tdeterminant: function () {\n\n\t\tvar te = this.elements;\n\n\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t},\n\n\ttranspose: function () {\n\n\t\tvar te = this.elements;\n\t\tvar tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t},\n\n\tsetPosition: function ( v ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 12 ] = v.x;\n\t\tte[ 13 ] = v.y;\n\t\tte[ 14 ] = v.z;\n\n\t\treturn this;\n\n\t},\n\n\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tvar te = this.elements,\n\t\t\tme = m.elements,\n\n\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) {\n\n\t\t\tvar msg = \"THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0\";\n\n\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\tthrow new Error( msg );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( msg );\n\n\t\t\t}\n\n\t\t\treturn this.identity();\n\n\t\t}\n\n\t\tvar detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t},\n\n\tscale: function ( v ) {\n\n\t\tvar te = this.elements;\n\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t},\n\n\tgetMaxScaleOnAxis: function () {\n\n\t\tvar te = this.elements;\n\n\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t},\n\n\tmakeTranslation: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationX: function ( theta ) {\n\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationY: function ( theta ) {\n\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationZ: function ( theta ) {\n\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tvar c = Math.cos( angle );\n\t\tvar s = Math.sin( angle );\n\t\tvar t = 1 - c;\n\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\tvar tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\t return this;\n\n\t},\n\n\tmakeScale: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeShear: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, y, z, 0,\n\t\t\tx, 1, z, 0,\n\t\t\tx, y, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tcompose: function ( position, quaternion, scale ) {\n\n\t\tvar te = this.elements;\n\n\t\tvar x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tvar x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tvar sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t te[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t te[ 1 ] = ( xy + wz ) * sx;\n\t te[ 2 ] = ( xz - wy ) * sx;\n\t te[ 3 ] = 0;\n\n\t te[ 4 ] = ( xy - wz ) * sy;\n\t te[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t te[ 6 ] = ( yz + wx ) * sy;\n\t te[ 7 ] = 0;\n\n\t te[ 8 ] = ( xz + wy ) * sz;\n\t te[ 9 ] = ( yz - wx ) * sz;\n\t te[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t te[ 11 ] = 0;\n\n\t te[ 12 ] = position.x;\n\t te[ 13 ] = position.y;\n\t te[ 14 ] = position.z;\n\t te[ 15 ] = 1;\n\n\t return this;\n\n\t},\n\n\tdecompose: function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar matrix = new Matrix4();\n\n\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t// if determine is negative, we need to invert one scale\n\t\t\tvar det = this.determinant();\n\t\t\tif ( det < 0 ) sx = - sx;\n\n\t\t\tposition.x = te[ 12 ];\n\t\t\tposition.y = te[ 13 ];\n\t\t\tposition.z = te[ 14 ];\n\n\t\t\t// scale the rotation part\n\t\t\tmatrix.copy( this );\n\n\t\t\tvar invSX = 1 / sx;\n\t\t\tvar invSY = 1 / sy;\n\t\t\tvar invSZ = 1 / sz;\n\n\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\tscale.x = sx;\n\t\t\tscale.y = sy;\n\t\t\tscale.z = sz;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\tif ( far === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t}\n\n\t\tvar te = this.elements;\n\t\tvar x = 2 * near / ( right - left );\n\t\tvar y = 2 * near / ( top - bottom );\n\n\t\tvar a = ( right + left ) / ( right - left );\n\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\tvar c = - ( far + near ) / ( far - near );\n\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t},\n\n\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\tvar te = this.elements;\n\t\tvar w = 1.0 / ( right - left );\n\t\tvar h = 1.0 / ( top - bottom );\n\t\tvar p = 1.0 / ( far - near );\n\n\t\tvar x = ( right + left ) * w;\n\t\tvar y = ( top + bottom ) * h;\n\t\tvar z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( matrix ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = matrix.elements;\n\n\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tvar te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author bhouston / http://clara.io\n */\n\nfunction Quaternion( x, y, z, w ) {\n\n\tthis._x = x || 0;\n\tthis._y = y || 0;\n\tthis._z = z || 0;\n\tthis._w = ( w !== undefined ) ? w : 1;\n\n}\n\nObject.assign( Quaternion, {\n\n\tslerp: function ( qa, qb, qm, t ) {\n\n\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t},\n\n\tslerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tvar s = 1 - t,\n\n\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tvar tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n} );\n\nObject.defineProperties( Quaternion.prototype, {\n\n\tx: {\n\n\t\tget: function () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\ty: {\n\n\t\tget: function () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tz: {\n\n\t\tget: function () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tw: {\n\n\t\tget: function () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Quaternion.prototype, {\n\n\tset: function ( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t},\n\n\tcopy: function ( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromEuler: function ( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tvar x = euler._x, y = euler._y, z = euler._z, order = euler.order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tvar cos = Math.cos;\n\t\tvar sin = Math.sin;\n\n\t\tvar c1 = cos( x / 2 );\n\t\tvar c2 = cos( y / 2 );\n\t\tvar c3 = cos( z / 2 );\n\n\t\tvar s1 = sin( x / 2 );\n\t\tvar s2 = sin( y / 2 );\n\t\tvar s3 = sin( z / 2 );\n\n\t\tif ( order === 'XYZ' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t} else if ( order === 'YZX' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t} else if ( order === 'XZY' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t}\n\n\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromRotationMatrix: function ( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tvar te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33,\n\t\t\ts;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromUnitVectors: function () {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tvar v1 = new Vector3();\n\t\tvar r;\n\n\t\tvar EPS = 0.000001;\n\n\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\tif ( r < EPS ) {\n\n\t\t\t\tr = 0;\n\n\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t}\n\n\t\t\tthis._x = v1.x;\n\t\t\tthis._y = v1.y;\n\t\t\tthis._z = v1.z;\n\t\t\tthis._w = r;\n\n\t\t\treturn this.normalize();\n\n\t\t};\n\n\t}(),\n\n\tinverse: function () {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t},\n\n\tconjugate: function () {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t},\n\n\tnormalize: function () {\n\n\t\tvar l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( q, p ) {\n\n\t\tif ( p !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t}\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t},\n\n\tpremultiply: function ( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t},\n\n\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tslerp: function ( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t},\n\n\tonChange: function ( callback ) {\n\n\t\tthis.onChangeCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\tonChangeCallback: function () {}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author kile / http://kile.stravaganza.org/\n * @author philogb / http://blog.thejit.org/\n * @author mikael emtinger / http://gomo.se/\n * @author egraether / http://egraether.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Vector3( x, y, z ) {\n\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\tthis.z = z || 0;\n\n}\n\nObject.assign( Vector3.prototype, {\n\n\tisVector3: true,\n\n\tset: function ( x, y, z ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t}\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyVectors: function ( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t},\n\n\tapplyEuler: function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function applyEuler( euler ) {\n\n\t\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t};\n\n\t}(),\n\n\tapplyAxisAngle: function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t};\n\n\t}(),\n\n\tapplyMatrix3: function ( m ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\n\t\tvar w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t},\n\n\tapplyQuaternion: function ( q ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tvar ix = qw * x + qy * z - qz * y;\n\t\tvar iy = qw * y + qz * x - qx * z;\n\t\tvar iz = qw * z + qx * y - qy * x;\n\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t},\n\n\tproject: function () {\n\n\t\tvar matrix = new Matrix4();\n\n\t\treturn function project( camera ) {\n\n\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t};\n\n\t}(),\n\n\tunproject: function () {\n\n\t\tvar matrix = new Matrix4();\n\n\t\treturn function unproject( camera ) {\n\n\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t};\n\n\t}(),\n\n\ttransformDirection: function ( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t},\n\n\tdivide: function ( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function () {\n\n\t\tvar min = new Vector3();\n\t\tvar max = new Vector3();\n\n\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\treturn this.clamp( min, max );\n\n\t\t};\n\n\t}(),\n\n\tclampLength: function ( min, max ) {\n\n\t\tvar length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t},\n\n\t// TODO lengthSquared?\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t},\n\n\tcross: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\treturn this.crossVectors( v, w );\n\n\t\t}\n\n\t\treturn this.crossVectors( this, v );\n\n\t},\n\n\tcrossVectors: function ( a, b ) {\n\n\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t},\n\n\tprojectOnVector: function ( vector ) {\n\n\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t},\n\n\tprojectOnPlane: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\treturn this.sub( v1 );\n\n\t\t};\n\n\t}(),\n\n\treflect: function () {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function reflect( normal ) {\n\n\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t};\n\n\t}(),\n\n\tangleTo: function ( v ) {\n\n\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t},\n\n\tdistanceTo: function ( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t},\n\n\tdistanceToSquared: function ( v ) {\n\n\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t},\n\n\tmanhattanDistanceTo: function ( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t},\n\n\tsetFromSpherical: function ( s ) {\n\n\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCylindrical: function ( c ) {\n\n\t\tthis.x = c.radius * Math.sin( c.theta );\n\t\tthis.y = c.y;\n\t\tthis.z = c.radius * Math.cos( c.theta );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixPosition: function ( m ) {\n\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixScale: function ( m ) {\n\n\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author bhouston / http://clara.io\n * @author tschw\n */\n\nfunction Matrix3() {\n\n\tthis.elements = [\n\n\t\t1, 0, 0,\n\t\t0, 1, 0,\n\t\t0, 0, 1\n\n\t];\n\n\tif ( arguments.length > 0 ) {\n\n\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t}\n\n}\n\nObject.assign( Matrix3.prototype, {\n\n\tisMatrix3: true,\n\n\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t},\n\n\tidentity: function () {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t},\n\n\tcopy: function ( m ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrix4: function ( m ) {\n\n\t\tvar me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tapplyToBufferAttribute: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t}\n\n\t\t\treturn attribute;\n\n\t\t};\n\n\t}(),\n\n\tmultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t},\n\n\tpremultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t},\n\n\tmultiplyMatrices: function ( a, b ) {\n\n\t\tvar ae = a.elements;\n\t\tvar be = b.elements;\n\t\tvar te = this.elements;\n\n\t\tvar a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tvar a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tvar a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tvar b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tvar b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tvar b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t},\n\n\tdeterminant: function () {\n\n\t\tvar te = this.elements;\n\n\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t},\n\n\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\tconsole.error( \"THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.\" );\n\n\t\t}\n\n\t\tvar me = matrix.elements,\n\t\t\tte = this.elements,\n\n\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) {\n\n\t\t\tvar msg = \"THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0\";\n\n\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\tthrow new Error( msg );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( msg );\n\n\t\t\t}\n\n\t\t\treturn this.identity();\n\n\t\t}\n\n\t\tvar detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t},\n\n\ttranspose: function () {\n\n\t\tvar tmp, m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t},\n\n\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t},\n\n\ttransposeIntoArray: function ( r ) {\n\n\t\tvar m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tvar c = Math.cos( rotation );\n\t\tvar s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t},\n\n\tscale: function ( sx, sy ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t},\n\n\trotate: function ( theta ) {\n\n\t\tvar c = Math.cos( theta );\n\t\tvar s = Math.sin( theta );\n\n\t\tvar te = this.elements;\n\n\t\tvar a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tvar a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( tx, ty ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( matrix ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = matrix.elements;\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tvar te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author szimek / https://github.com/szimek/\n */\n\nvar textureId = 0;\n\nfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\n\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\tthis.mipmaps = [];\n\n\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\tthis.format = format !== undefined ? format : RGBAFormat;\n\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\tthis.offset = new Vector2( 0, 0 );\n\tthis.repeat = new Vector2( 1, 1 );\n\tthis.center = new Vector2( 0, 0 );\n\tthis.rotation = 0;\n\n\tthis.matrixAutoUpdate = true;\n\tthis.matrix = new Matrix3();\n\n\tthis.generateMipmaps = true;\n\tthis.premultiplyAlpha = false;\n\tthis.flipY = true;\n\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t//\n\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\tthis.version = 0;\n\tthis.onUpdate = null;\n\n}\n\nTexture.DEFAULT_IMAGE = undefined;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nTexture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Texture,\n\n\tisTexture: true,\n\n\tupdateMatrix: function () {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.image = source.image;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tfunction getDataURL( image ) {\n\n\t\t\tvar canvas;\n\n\t\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tcanvas = image;\n\n\t\t\t} else {\n\n\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = image.width;\n\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\n\t\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t} else {\n\n\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY\n\n\t\t};\n\n\t\tif ( this.image !== undefined ) {\n\n\t\t\t// TODO: Move to THREE.Image\n\n\t\t\tvar image = this.image;\n\n\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t}\n\n\t\t\tif ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\toutput.image = image.uuid;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t},\n\n\ttransformUv: function ( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.defineProperty( Texture.prototype, \"needsUpdate\", {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\n/**\n * @author supereggbert / http://www.paulbrunt.co.uk/\n * @author philogb / http://blog.thejit.org/\n * @author mikael emtinger / http://gomo.se/\n * @author egraether / http://egraether.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Vector4( x, y, z, w ) {\n\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\tthis.z = z || 0;\n\tthis.w = ( w !== undefined ) ? w : 1;\n\n}\n\nObject.assign( Vector4.prototype, {\n\n\tisVector4: true,\n\n\tset: function ( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetW: function ( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function () {\n\n\t\tvar min, max;\n\n\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\tif ( min === undefined ) {\n\n\t\t\t\tmin = new Vector4();\n\t\t\t\tmax = new Vector4();\n\n\t\t\t}\n\n\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\treturn this.clamp( min, max );\n\n\t\t};\n\n\t}(),\n\n\tclampLength: function ( min, max ) {\n\n\t\tvar length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author szimek / https://github.com/szimek/\n * @author alteredq / http://alteredqualia.com/\n * @author Marius Kintel / https://github.com/kintel\n */\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nfunction WebGLRenderTarget( width, height, options ) {\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.scissor = new Vector4( 0, 0, width, height );\n\tthis.scissorTest = false;\n\n\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\toptions = options || {};\n\n\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : true;\n\n\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n}\n\nWebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: WebGLRenderTarget,\n\n\tisWebGLRenderTarget: true,\n\n\tsetSize: function ( width, height ) {\n\n\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\tthis.depthTexture = source.depthTexture;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com\n */\n\nfunction WebGLRenderTargetCube( width, height, options ) {\n\n\tWebGLRenderTarget.call( this, width, height, options );\n\n\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\tthis.activeMipMapLevel = 0;\n\n}\n\nWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\nWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\nWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.image = { data: data, width: width, height: height };\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\tthis.unpackAlignment = 1;\n\n}\n\nDataTexture.prototype = Object.create( Texture.prototype );\nDataTexture.prototype.constructor = DataTexture;\n\nDataTexture.prototype.isDataTexture = true;\n\n/**\n * @author bhouston / http://clara.io\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Box3( min, max ) {\n\n\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n}\n\nObject.assign( Box3.prototype, {\n\n\tisBox3: true,\n\n\tset: function ( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromArray: function ( array ) {\n\n\t\tvar minX = + Infinity;\n\t\tvar minY = + Infinity;\n\t\tvar minZ = + Infinity;\n\n\t\tvar maxX = - Infinity;\n\t\tvar maxY = - Infinity;\n\t\tvar maxZ = - Infinity;\n\n\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tvar x = array[ i ];\n\t\t\tvar y = array[ i + 1 ];\n\t\t\tvar z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\tvar minX = + Infinity;\n\t\tvar minY = + Infinity;\n\t\tvar minZ = + Infinity;\n\n\t\tvar maxX = - Infinity;\n\t\tvar maxY = - Infinity;\n\t\tvar maxZ = - Infinity;\n\n\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tvar x = attribute.getX( i );\n\t\t\tvar y = attribute.getY( i );\n\t\t\tvar z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCenterAndSize: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tsetFromObject: function ( object ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tmakeEmpty: function () {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t},\n\n\tisEmpty: function () {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getCenter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t},\n\n\tgetSize: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getSize() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t},\n\n\texpandByPoint: function ( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t},\n\n\texpandByVector: function ( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t},\n\n\texpandByScalar: function ( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t},\n\n\texpandByObject: function () {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tvar scope, i, l;\n\n\t\tvar v1 = new Vector3();\n\n\t\tfunction traverse( node ) {\n\n\t\t\tvar geometry = node.geometry;\n\n\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function expandByObject( object ) {\n\n\t\t\tscope = this;\n\n\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\tobject.traverse( traverse );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t},\n\n\tcontainsBox: function ( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t},\n\n\tgetParameter: function ( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getParameter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t},\n\n\tintersectsSphere: ( function () {\n\n\t\tvar closestPoint = new Vector3();\n\n\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t};\n\n\t} )(),\n\n\tintersectsPlane: function ( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tvar min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t},\n\n\tintersectsTriangle: ( function () {\n\n\t\t// triangle centered vertices\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\t// triangle edge vectors\n\t\tvar f0 = new Vector3();\n\t\tvar f1 = new Vector3();\n\t\tvar f2 = new Vector3();\n\n\t\tvar testAxis = new Vector3();\n\n\t\tvar center = new Vector3();\n\t\tvar extents = new Vector3();\n\n\t\tvar triangleNormal = new Vector3();\n\n\t\tfunction satForAxes( axes ) {\n\n\t\t\tvar i, j;\n\n\t\t\tfor ( i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t\t\ttestAxis.fromArray( axes, i );\n\t\t\t\t// project the aabb onto the seperating axis\n\t\t\t\tvar r = extents.x * Math.abs( testAxis.x ) + extents.y * Math.abs( testAxis.y ) + extents.z * Math.abs( testAxis.z );\n\t\t\t\t// project all 3 vertices of the triangle onto the seperating axis\n\t\t\t\tvar p0 = v0.dot( testAxis );\n\t\t\t\tvar p1 = v1.dot( testAxis );\n\t\t\t\tvar p2 = v2.dot( testAxis );\n\t\t\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\t\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t\t\t// the axis is seperating and we can exit\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn function intersectsTriangle( triangle ) {\n\n\t\t\tif ( this.isEmpty() ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// compute box center and extents\n\t\t\tthis.getCenter( center );\n\t\t\textents.subVectors( this.max, center );\n\n\t\t\t// translate triangle to aabb origin\n\t\t\tv0.subVectors( triangle.a, center );\n\t\t\tv1.subVectors( triangle.b, center );\n\t\t\tv2.subVectors( triangle.c, center );\n\n\t\t\t// compute edge vectors for triangle\n\t\t\tf0.subVectors( v1, v0 );\n\t\t\tf1.subVectors( v2, v1 );\n\t\t\tf2.subVectors( v0, v2 );\n\n\t\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\t\tvar axes = [\n\t\t\t\t0, - f0.z, f0.y, 0, - f1.z, f1.y, 0, - f2.z, f2.y,\n\t\t\t\tf0.z, 0, - f0.x, f1.z, 0, - f1.x, f2.z, 0, - f2.x,\n\t\t\t\t- f0.y, f0.x, 0, - f1.y, f1.x, 0, - f2.y, f2.x, 0\n\t\t\t];\n\t\t\tif ( ! satForAxes( axes ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// test 3 face normals from the aabb\n\t\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\t\tif ( ! satForAxes( axes ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// finally testing the face normal of the triangle\n\t\t\t// use already existing triangle edge vectors here\n\t\t\ttriangleNormal.crossVectors( f0, f1 );\n\t\t\taxes = [ triangleNormal.x, triangleNormal.y, triangleNormal.z ];\n\t\t\treturn satForAxes( axes );\n\n\t\t};\n\n\t} )(),\n\n\tclampPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t},\n\n\tdistanceToPoint: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function distanceToPoint( point ) {\n\n\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t};\n\n\t}(),\n\n\tgetBoundingSphere: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function getBoundingSphere( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Box3: .getBoundingSphere() target is now required' );\n\t\t\t\ttarget = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tintersect: function ( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t},\n\n\tunion: function ( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty( ) ) return this;\n\n\t\tvar m = matrix.elements;\n\n\t\tvar xax = m[ 0 ] * this.min.x, xay = m[ 1 ] * this.min.x, xaz = m[ 2 ] * this.min.x;\n\t\tvar xbx = m[ 0 ] * this.max.x, xby = m[ 1 ] * this.max.x, xbz = m[ 2 ] * this.max.x;\n\t\tvar yax = m[ 4 ] * this.min.y, yay = m[ 5 ] * this.min.y, yaz = m[ 6 ] * this.min.y;\n\t\tvar ybx = m[ 4 ] * this.max.y, yby = m[ 5 ] * this.max.y, ybz = m[ 6 ] * this.max.y;\n\t\tvar zax = m[ 8 ] * this.min.z, zay = m[ 9 ] * this.min.z, zaz = m[ 10 ] * this.min.z;\n\t\tvar zbx = m[ 8 ] * this.max.z, zby = m[ 9 ] * this.max.z, zbz = m[ 10 ] * this.max.z;\n\n\t\tthis.min.x = Math.min( xax, xbx ) + Math.min( yax, ybx ) + Math.min( zax, zbx ) + m[ 12 ];\n\t\tthis.min.y = Math.min( xay, xby ) + Math.min( yay, yby ) + Math.min( zay, zby ) + m[ 13 ];\n\t\tthis.min.z = Math.min( xaz, xbz ) + Math.min( yaz, ybz ) + Math.min( zaz, zbz ) + m[ 14 ];\n\t\tthis.max.x = Math.max( xax, xbx ) + Math.max( yax, ybx ) + Math.max( zax, zbx ) + m[ 12 ];\n\t\tthis.max.y = Math.max( xay, xby ) + Math.max( yay, yby ) + Math.max( zay, zby ) + m[ 13 ];\n\t\tthis.max.z = Math.max( xaz, xbz ) + Math.max( yaz, ybz ) + Math.max( zaz, zbz ) + m[ 14 ];\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Sphere( center, radius ) {\n\n\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n}\n\nObject.assign( Sphere.prototype, {\n\n\tset: function ( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\tvar center = this.center;\n\n\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t}\n\n\t\t\tvar maxRadiusSq = 0;\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t}\n\n\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t},\n\n\tempty: function () {\n\n\t\treturn ( this.radius <= 0 );\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t},\n\n\tintersectsPlane: function ( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t},\n\n\tclampPoint: function ( point, target ) {\n\n\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Sphere: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t},\n\n\tgetBoundingBox: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Sphere: .getBoundingBox() target is now required' );\n\t\t\ttarget = new Box3();\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Plane( normal, constant ) {\n\n\t// normal is assumed to be normalized\n\n\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n}\n\nObject.assign( Plane.prototype, {\n\n\tset: function ( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponents: function ( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCoplanarPoints: function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t},\n\n\tnormalize: function () {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t},\n\n\tdistanceToSphere: function ( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t},\n\n\tprojectPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .projectPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t},\n\n\tintersectLine: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function intersectLine( line, target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Plane: .intersectLine() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tvar direction = line.delta( v1 );\n\n\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\treturn target.copy( line.start );\n\n\t\t\t\t}\n\n\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t};\n\n\t}(),\n\n\tintersectsLine: function ( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tvar startSign = this.distanceToPoint( line.start );\n\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t},\n\n\tcoplanarPoint: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .coplanarPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t},\n\n\tapplyMatrix4: function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar m1 = new Matrix3();\n\n\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\n\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author bhouston / http://clara.io\n */\n\nfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\tthis.planes = [\n\n\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t];\n\n}\n\nObject.assign( Frustum.prototype, {\n\n\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tvar planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( frustum ) {\n\n\t\tvar planes = this.planes;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrix: function ( m ) {\n\n\t\tvar planes = this.planes;\n\t\tvar me = m.elements;\n\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t},\n\n\tintersectsObject: function () {\n\n\t\tvar sphere = new Sphere();\n\n\t\treturn function intersectsObject( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t};\n\n\t}(),\n\n\tintersectsSprite: function () {\n\n\t\tvar sphere = new Sphere();\n\n\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t};\n\n\t}(),\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\tvar planes = this.planes;\n\t\tvar center = sphere.center;\n\t\tvar negRadius = - sphere.radius;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tintersectsBox: function () {\n\n\t\tvar p1 = new Vector3(),\n\t\t\tp2 = new Vector3();\n\n\t\treturn function intersectsBox( box ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t};\n\n\t}(),\n\n\tcontainsPoint: function ( point ) {\n\n\t\tvar planes = this.planes;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n} );\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\nvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\nvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\nvar bsdfs = \"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t}\\n\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\\n\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\tplane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\t#pragma unroll_loop\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t#endif\\n#endif\\n\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\nvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\nvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat linearToRelativeLuminance( const in vec3 color ) {\\n\\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\\n\\treturn dot( weights, color.rgb );\\n}\\n\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = normalMatrix * objectNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\nvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\nvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\nvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\tuniform int maxMipLevel;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\";\n\nvar fog_vertex = \"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n varying float fogDepth;\\n#endif\\n\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\";\n\nvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\nvar lights_pars_begin = \"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t\\tfloat shadowCameraNear;\\n\\t\\tfloat shadowCameraFar;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n\";\n\nvar lights_pars_maps = \"#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\nvar lights_fragment_begin = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n#endif\\n\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\\n\\t#ifndef STANDARD\\n\\t\\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\\n\\t#endif\\n#endif\\n\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\tgl_Position.z *= gl_Position.w;\\n\\t#endif\\n#endif\\n\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\nvar map_particle_fragment = \"#ifdef USE_MAP\\n\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\tvec4 mapTexel = texture2D( map, uv );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\";\n\nvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform mat3 uvTransform;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\\n\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\";\n\nvar normal_fragment_begin = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t#endif\\n#endif\\n\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\\n\\t\\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\\n\\t\\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\\n\\t\\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy *= normalScale;\\n\\t\\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\nvar project_vertex = \"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\ngl_Position = projectionMatrix * mvPosition;\\n\";\n\nvar dithering_fragment = \"#if defined( DITHERING )\\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\\n\";\n\nvar dithering_pars_fragment = \"#if defined( DITHERING )\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\\n\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\\n\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\nvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\";\n\nvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureSize;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\\n\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n\\t#define saturate(a) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\nvar uv_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\n\";\n\nvar uv_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n#endif\";\n\nvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\\n\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n#endif\\n\";\n\nvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\nvar cube_vert = \"varying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\\n\";\n\nvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\";\n\nvar depth_vert = \"#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n}\\n\";\n\nvar distanceRGBA_frag = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\\n\";\n\nvar distanceRGBA_vert = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition.xyz;\\n}\\n\";\n\nvar equirect_frag = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\";\n\nvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\\n\";\n\nvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\";\n\nvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <color_vertex>\\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\nvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\";\n\nvar meshbasic_vert = \"#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_ENVMAP\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\nvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <lights_pars_maps>\\n#include <fog_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <emissivemap_fragment>\\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include <lightmap_fragment>\\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\";\n\nvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <lights_pars_maps>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <lights_lambert_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\nvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <lights_pars_maps>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\";\n\nvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\nvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <cube_uv_reflection_fragment>\\n#include <lights_pars_begin>\\n#include <lights_pars_maps>\\n#include <lights_physical_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\";\n\nvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\nvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\nvoid main() {\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\";\n\nvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\";\n\nvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\";\n\nvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <color_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\nvar shadow_frag = \"uniform vec3 color;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include <fog_fragment>\\n}\\n\";\n\nvar shadow_vert = \"#include <fog_pars_vertex>\\n#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\nvar ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_pars_maps: lights_pars_maps,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tcube_frag: cube_frag,\n\tcube_vert: cube_vert,\n\tdepth_frag: depth_frag,\n\tdepth_vert: depth_vert,\n\tdistanceRGBA_frag: distanceRGBA_frag,\n\tdistanceRGBA_vert: distanceRGBA_vert,\n\tequirect_frag: equirect_frag,\n\tequirect_vert: equirect_vert,\n\tlinedashed_frag: linedashed_frag,\n\tlinedashed_vert: linedashed_vert,\n\tmeshbasic_frag: meshbasic_frag,\n\tmeshbasic_vert: meshbasic_vert,\n\tmeshlambert_frag: meshlambert_frag,\n\tmeshlambert_vert: meshlambert_vert,\n\tmeshphong_frag: meshphong_frag,\n\tmeshphong_vert: meshphong_vert,\n\tmeshphysical_frag: meshphysical_frag,\n\tmeshphysical_vert: meshphysical_vert,\n\tnormal_frag: normal_frag,\n\tnormal_vert: normal_vert,\n\tpoints_frag: points_frag,\n\tpoints_vert: points_vert,\n\tshadow_frag: shadow_frag,\n\tshadow_vert: shadow_vert\n};\n\n/**\n * Uniform Utilities\n */\n\nvar UniformsUtils = {\n\n\tmerge: function ( uniforms ) {\n\n\t\tvar merged = {};\n\n\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn merged;\n\n\t},\n\n\tclone: function ( uniforms_src ) {\n\n\t\tvar uniforms_dst = {};\n\n\t\tfor ( var u in uniforms_src ) {\n\n\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn uniforms_dst;\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nfunction Color( r, g, b ) {\n\n\tif ( g === undefined && b === undefined ) {\n\n\t\t// r is THREE.Color, hex or string\n\t\treturn this.set( r );\n\n\t}\n\n\treturn this.setRGB( r, g, b );\n\n}\n\nObject.assign( Color.prototype, {\n\n\tisColor: true,\n\n\tr: 1, g: 1, b: 1,\n\n\tset: function ( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetHex: function ( hex ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\treturn this;\n\n\t},\n\n\tsetRGB: function ( r, g, b ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\n\t},\n\n\tsetHSL: function () {\n\n\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\tif ( t < 0 ) t += 1;\n\t\t\tif ( t > 1 ) t -= 1;\n\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\treturn p;\n\n\t\t}\n\n\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\tif ( s === 0 ) {\n\n\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t} else {\n\n\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tsetStyle: function ( style ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tvar m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tvar color;\n\t\t\tvar name = m[ 1 ];\n\t\t\tvar components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tvar hex = m[ 1 ];\n\t\t\tvar size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\t// color keywords\n\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t// red\n\t\t\t\tthis.setHex( hex );\n\n\t\t\t} else {\n\n\t\t\t\t// unknown color\n\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t},\n\n\tcopy: function ( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t},\n\n\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\treturn this;\n\n\t},\n\n\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\treturn this;\n\n\t},\n\n\tconvertGammaToLinear: function ( gammaFactor ) {\n\n\t\tthis.copyGammaToLinear( this, gammaFactor );\n\n\t\treturn this;\n\n\t},\n\n\tconvertLinearToGamma: function ( gammaFactor ) {\n\n\t\tthis.copyLinearToGamma( this, gammaFactor );\n\n\t\treturn this;\n\n\t},\n\n\tgetHex: function () {\n\n\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t},\n\n\tgetHexString: function () {\n\n\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t},\n\n\tgetHSL: function ( target ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Color: .getHSL() target is now required' );\n\t\t\ttarget = { h: 0, s: 0, l: 0 };\n\n\t\t}\n\n\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\tvar max = Math.max( r, g, b );\n\t\tvar min = Math.min( r, g, b );\n\n\t\tvar hue, saturation;\n\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tvar delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t},\n\n\tgetStyle: function () {\n\n\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t},\n\n\toffsetHSL: function () {\n\n\t\tvar hsl = {};\n\n\t\treturn function ( h, s, l ) {\n\n\t\t\tthis.getHSL( hsl );\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tadd: function ( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t},\n\n\taddColors: function ( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t},\n\n\tlerp: function ( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\treturn this.getHex();\n\n\t}\n\n} );\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nvar UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() },\n\n\t\talphaMap: { value: null },\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 },\n\t\trefractionRatio: { value: 0.98 },\n\t\tmaxMipLevel: { value: 0 }\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {},\n\n\t\t\tshadow: {},\n\t\t\tshadowBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {},\n\n\t\t\tshadow: {},\n\t\t\tshadowBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {},\n\n\t\t\tshadow: {},\n\t\t\tshadowBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t}\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author mikael emtinger / http://gomo.se/\n */\n\nvar ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 0.5 },\n\t\t\t\tmetalness: { value: 0.5 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.normal_vert,\n\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tCube map shader\n\t ------------------------------------------------------------------------- */\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: - 1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: UniformsUtils.merge( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearCoat: { value: 0 },\n\t\t\tclearCoatRoughness: { value: 0 }\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLAnimation() {\n\n\tvar context = null;\n\tvar isAnimating = false;\n\tvar animationLoop = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tif ( isAnimating === false ) return;\n\n\t\tanimationLoop( time, frame );\n\n\t\tcontext.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\tcontext.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLAttributes( gl ) {\n\n\tvar buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tvar array = attribute.array;\n\t\tvar usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tvar type = gl.FLOAT;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tvar array = attribute.array;\n\t\tvar updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( attribute.dynamic === false ) {\n\n\t\t\tgl.bufferData( bufferType, array, gl.STATIC_DRAW );\n\n\t\t} else if ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else if ( updateRange.count === 0 ) {\n\n\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\n\n\t\t} else {\n\n\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tvar data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tvar data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author bhouston / http://clara.io\n */\n\nfunction Euler( x, y, z, order ) {\n\n\tthis._x = x || 0;\n\tthis._y = y || 0;\n\tthis._z = z || 0;\n\tthis._order = order || Euler.DefaultOrder;\n\n}\n\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nEuler.DefaultOrder = 'XYZ';\n\nObject.defineProperties( Euler.prototype, {\n\n\tx: {\n\n\t\tget: function () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\ty: {\n\n\t\tget: function () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tz: {\n\n\t\tget: function () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\torder: {\n\n\t\tget: function () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Euler.prototype, {\n\n\tisEuler: true,\n\n\tset: function ( x, y, z, order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order || this._order;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t},\n\n\tcopy: function ( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\tvar clamp = _Math.clamp;\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tvar te = m.elements;\n\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\torder = order || this._order;\n\n\t\tif ( order === 'XYZ' ) {\n\n\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\tthis._z = 0;\n\n\t\t\t}\n\n\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\tthis._z = 0;\n\n\t\t\t}\n\n\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t}\n\n\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t}\n\n\t\t} else if ( order === 'YZX' ) {\n\n\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t}\n\n\t\t} else if ( order === 'XZY' ) {\n\n\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\tthis._y = 0;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromQuaternion: function () {\n\n\t\tvar matrix = new Matrix4();\n\n\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t};\n\n\t}(),\n\n\tsetFromVector3: function ( v, order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t},\n\n\treorder: function () {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\tvar q = new Quaternion();\n\n\t\treturn function reorder( newOrder ) {\n\n\t\t\tq.setFromEuler( this );\n\n\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t};\n\n\t}(),\n\n\tequals: function ( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t},\n\n\tfromArray: function ( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t},\n\n\ttoVector3: function ( optionalResult ) {\n\n\t\tif ( optionalResult ) {\n\n\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t} else {\n\n\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t}\n\n\t},\n\n\tonChange: function ( callback ) {\n\n\t\tthis.onChangeCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\tonChangeCallback: function () {}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Layers() {\n\n\tthis.mask = 1 | 0;\n\n}\n\nObject.assign( Layers.prototype, {\n\n\tset: function ( channel ) {\n\n\t\tthis.mask = 1 << channel | 0;\n\n\t},\n\n\tenable: function ( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t},\n\n\ttoggle: function ( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t},\n\n\tdisable: function ( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t},\n\n\ttest: function ( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author elephantatwork / www.elephantatwork.ch\n */\n\nvar object3DId = 0;\n\nfunction Object3D() {\n\n\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Object3D';\n\n\tthis.parent = null;\n\tthis.children = [];\n\n\tthis.up = Object3D.DefaultUp.clone();\n\n\tvar position = new Vector3();\n\tvar rotation = new Euler();\n\tvar quaternion = new Quaternion();\n\tvar scale = new Vector3( 1, 1, 1 );\n\n\tfunction onRotationChange() {\n\n\t\tquaternion.setFromEuler( rotation, false );\n\n\t}\n\n\tfunction onQuaternionChange() {\n\n\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t}\n\n\trotation.onChange( onRotationChange );\n\tquaternion.onChange( onQuaternionChange );\n\n\tObject.defineProperties( this, {\n\t\tposition: {\n\t\t\tenumerable: true,\n\t\t\tvalue: position\n\t\t},\n\t\trotation: {\n\t\t\tenumerable: true,\n\t\t\tvalue: rotation\n\t\t},\n\t\tquaternion: {\n\t\t\tenumerable: true,\n\t\t\tvalue: quaternion\n\t\t},\n\t\tscale: {\n\t\t\tenumerable: true,\n\t\t\tvalue: scale\n\t\t},\n\t\tmodelViewMatrix: {\n\t\t\tvalue: new Matrix4()\n\t\t},\n\t\tnormalMatrix: {\n\t\t\tvalue: new Matrix3()\n\t\t}\n\t} );\n\n\tthis.matrix = new Matrix4();\n\tthis.matrixWorld = new Matrix4();\n\n\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\tthis.matrixWorldNeedsUpdate = false;\n\n\tthis.layers = new Layers();\n\tthis.visible = true;\n\n\tthis.castShadow = false;\n\tthis.receiveShadow = false;\n\n\tthis.frustumCulled = true;\n\tthis.renderOrder = 0;\n\n\tthis.userData = {};\n\n}\n\nObject3D.DefaultUp = new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nObject3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Object3D,\n\n\tisObject3D: true,\n\n\tonBeforeRender: function () {},\n\tonAfterRender: function () {},\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t},\n\n\tapplyQuaternion: function ( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t},\n\n\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t},\n\n\tsetRotationFromEuler: function ( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t},\n\n\tsetRotationFromMatrix: function ( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t},\n\n\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t},\n\n\trotateOnAxis: function () {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\tvar q1 = new Quaternion();\n\n\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateOnWorldAxis: function () {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\tvar q1 = new Quaternion();\n\n\t\treturn function rotateOnWorldAxis( axis, angle ) {\n\n\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\tthis.quaternion.premultiply( q1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateX: function () {\n\n\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\treturn function rotateX( angle ) {\n\n\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t};\n\n\t}(),\n\n\trotateY: function () {\n\n\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\treturn function rotateY( angle ) {\n\n\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t};\n\n\t}(),\n\n\trotateZ: function () {\n\n\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\treturn function rotateZ( angle ) {\n\n\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t};\n\n\t}(),\n\n\ttranslateOnAxis: function () {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslateX: function () {\n\n\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\treturn function translateX( distance ) {\n\n\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t};\n\n\t}(),\n\n\ttranslateY: function () {\n\n\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\treturn function translateY( distance ) {\n\n\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t};\n\n\t}(),\n\n\ttranslateZ: function () {\n\n\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\treturn function translateZ( distance ) {\n\n\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t};\n\n\t}(),\n\n\tlocalToWorld: function ( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t},\n\n\tworldToLocal: function () {\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function worldToLocal( vector ) {\n\n\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\t// This method does not support objects with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\t\tvar vector = new Vector3();\n\n\t\treturn function lookAt( x, y, z ) {\n\n\t\t\tif ( x.isVector3 ) {\n\n\t\t\t\tvector.copy( x );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( x, y, z );\n\n\t\t\t}\n\n\t\t\tif ( this.isCamera ) {\n\n\t\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\t} else {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t}\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}(),\n\n\tadd: function ( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\tthis.children.push( object );\n\n\t\t} else {\n\n\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tremove: function ( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\n\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetObjectById: function ( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t},\n\n\tgetObjectByName: function ( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t},\n\n\tgetObjectByProperty: function ( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tvar child = this.children[ i ];\n\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t},\n\n\tgetWorldPosition: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldPosition() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t},\n\n\tgetWorldQuaternion: function () {\n\n\t\tvar position = new Vector3();\n\t\tvar scale = new Vector3();\n\n\t\treturn function getWorldQuaternion( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' );\n\t\t\t\ttarget = new Quaternion();\n\n\t\t\t}\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.matrixWorld.decompose( position, target, scale );\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tgetWorldScale: function () {\n\n\t\tvar position = new Vector3();\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldScale( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .getWorldScale() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.matrixWorld.decompose( position, quaternion, target );\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tgetWorldDirection: function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .getWorldDirection() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn target.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}(),\n\n\traycast: function () {},\n\n\ttraverse: function ( callback ) {\n\n\t\tcallback( this );\n\n\t\tvar children = this.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t},\n\n\ttraverseVisible: function ( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tvar children = this.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t},\n\n\ttraverseAncestors: function ( callback ) {\n\n\t\tvar parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t},\n\n\tupdateMatrix: function () {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tvar children = this.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tvar isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tvar output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tvar object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.geometry !== undefined ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tvar parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tvar shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tvar shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tvar uuids = [];\n\n\t\t\t\tfor ( var i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\tvar images = extractFromCache( meta.images );\n\t\t\tvar shapes = extractFromCache( meta.shapes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tvar values = [];\n\t\t\tfor ( var key in cache ) {\n\n\t\t\t\tvar data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\t\t\treturn values;\n\n\t\t}\n\n\t},\n\n\tclone: function ( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t},\n\n\tcopy: function ( source, recursive ) {\n\n\t\tif ( recursive === undefined ) recursive = true;\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tvar child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author mikael emtinger / http://gomo.se/\n * @author WestLangley / http://github.com/WestLangley\n*/\n\nfunction Camera() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Camera';\n\n\tthis.matrixWorldInverse = new Matrix4();\n\tthis.projectionMatrix = new Matrix4();\n\n}\n\nCamera.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Camera,\n\n\tisCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t},\n\n\tgetWorldDirection: function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Camera: .getWorldDirection() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn target.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}(),\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\tthis.matrixWorldInverse.getInverse( this.matrixWorld );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author arose / http://github.com/arose\n */\n\nfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\tCamera.call( this );\n\n\tthis.type = 'OrthographicCamera';\n\n\tthis.zoom = 1;\n\tthis.view = null;\n\n\tthis.left = left;\n\tthis.right = right;\n\tthis.top = top;\n\tthis.bottom = bottom;\n\n\tthis.near = ( near !== undefined ) ? near : 0.1;\n\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\tthis.updateProjectionMatrix();\n\n}\n\nOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\tconstructor: OrthographicCamera,\n\n\tisOrthographicCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t},\n\n\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tclearViewOffset: function () {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tupdateProjectionMatrix: function () {\n\n\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tvar cx = ( this.right + this.left ) / 2;\n\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\tvar left = cx - dx;\n\t\tvar right = cx + dx;\n\t\tvar top = cy + dy;\n\t\tvar bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\tthis.a = a;\n\tthis.b = b;\n\tthis.c = c;\n\n\tthis.normal = ( normal && normal.isVector3 ) ? normal : new Vector3();\n\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\tthis.color = ( color && color.isColor ) ? color : new Color();\n\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n}\n\nObject.assign( Face3.prototype, {\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.a = source.a;\n\t\tthis.b = source.b;\n\t\tthis.c = source.c;\n\n\t\tthis.normal.copy( source.normal );\n\t\tthis.color.copy( source.color );\n\n\t\tthis.materialIndex = source.materialIndex;\n\n\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t}\n\n\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author kile / http://kile.stravaganza.org/\n * @author alteredq / http://alteredqualia.com/\n * @author mikael emtinger / http://gomo.se/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author bhouston / http://clara.io\n */\n\nvar geometryId = 0; // Geometry uses even numbers as Id\n\nfunction Geometry() {\n\n\tObject.defineProperty( this, 'id', { value: geometryId += 2 } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Geometry';\n\n\tthis.vertices = [];\n\tthis.colors = [];\n\tthis.faces = [];\n\tthis.faceVertexUvs = [[]];\n\n\tthis.morphTargets = [];\n\tthis.morphNormals = [];\n\n\tthis.skinWeights = [];\n\tthis.skinIndices = [];\n\n\tthis.lineDistances = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\t// update flags\n\n\tthis.elementsNeedUpdate = false;\n\tthis.verticesNeedUpdate = false;\n\tthis.uvsNeedUpdate = false;\n\tthis.normalsNeedUpdate = false;\n\tthis.colorsNeedUpdate = false;\n\tthis.lineDistancesNeedUpdate = false;\n\tthis.groupsNeedUpdate = false;\n\n}\n\nGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Geometry,\n\n\tisGeometry: true,\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\tvar vertex = this.vertices[ i ];\n\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t}\n\n\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\tvar face = this.faces[ i ];\n\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.verticesNeedUpdate = true;\n\t\tthis.normalsNeedUpdate = true;\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function () {\n\n\t\t// rotate geometry around world x-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateX( angle ) {\n\n\t\t\tm1.makeRotationX( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateY: function () {\n\n\t\t// rotate geometry around world y-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateY( angle ) {\n\n\t\t\tm1.makeRotationY( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateZ: function () {\n\n\t\t// rotate geometry around world z-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateZ( angle ) {\n\n\t\t\tm1.makeRotationZ( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function () {\n\n\t\t// translate geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function translate( x, y, z ) {\n\n\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tscale: function () {\n\n\t\t// scale geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function scale( x, y, z ) {\n\n\t\t\tm1.makeScale( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\tvar obj = new Object3D();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tobj.lookAt( vector );\n\n\t\t\tobj.updateMatrix();\n\n\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t};\n\n\t}(),\n\n\tfromBufferGeometry: function ( geometry ) {\n\n\t\tvar scope = this;\n\n\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\tvar attributes = geometry.attributes;\n\n\t\tvar positions = attributes.position.array;\n\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\tvar tempNormals = [];\n\t\tvar tempUVs = [];\n\t\tvar tempUVs2 = [];\n\n\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t}\n\n\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t}\n\n\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t}\n\n\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\tscope.faces.push( face );\n\n\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t}\n\n\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar groups = geometry.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\tvar start = group.start;\n\t\t\t\tvar count = group.count;\n\n\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\taddFace( j, j + 1, j + 2, group.materialIndex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.computeFaceNormals();\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcenter: function () {\n\n\t\tvar offset = new Vector3();\n\n\t\treturn function center() {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tthis.boundingBox.getCenter( offset ).negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tnormalize: function () {\n\n\t\tthis.computeBoundingSphere();\n\n\t\tvar center = this.boundingSphere.center;\n\t\tvar radius = this.boundingSphere.radius;\n\n\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\tvar matrix = new Matrix4();\n\t\tmatrix.set(\n\t\t\ts, 0, 0, - s * center.x,\n\t\t\t0, s, 0, - s * center.y,\n\t\t\t0, 0, s, - s * center.z,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\tthis.applyMatrix( matrix );\n\n\t\treturn this;\n\n\t},\n\n\tcomputeFaceNormals: function () {\n\n\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tvar face = this.faces[ f ];\n\n\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\tcb.subVectors( vC, vB );\n\t\t\tab.subVectors( vA, vB );\n\t\t\tcb.cross( ab );\n\n\t\t\tcb.normalize();\n\n\t\t\tface.normal.copy( cb );\n\n\t\t}\n\n\t},\n\n\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\tvar v, vl, f, fl, face, vertices;\n\n\t\tvertices = new Array( this.vertices.length );\n\n\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\tvertices[ v ] = new Vector3();\n\n\t\t}\n\n\t\tif ( areaWeighted ) {\n\n\t\t\t// vertex normals weighted by triangle areas\n\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\tvar vA, vB, vC;\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\tvertices[ v ].normalize();\n\n\t\t}\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t} else {\n\n\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.faces.length > 0 ) {\n\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t}\n\n\t},\n\n\tcomputeFlatVertexNormals: function () {\n\n\t\tvar f, fl, face;\n\n\t\tthis.computeFaceNormals();\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t} else {\n\n\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.faces.length > 0 ) {\n\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t}\n\n\t},\n\n\tcomputeMorphNormals: function () {\n\n\t\tvar i, il, f, fl, face;\n\n\t\t// save original normals\n\t\t// - create temp variables on first access\n\t\t// otherwise just copy (for faster repeated calls)\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t} else {\n\n\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t}\n\n\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\tvar tmpGeo = new Geometry();\n\t\ttmpGeo.faces = this.faces;\n\n\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t// create on first access\n\n\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t// set vertices to morph target\n\n\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t// compute morph normals\n\n\t\t\ttmpGeo.computeFaceNormals();\n\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t// store morph normals\n\n\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// restore original normals\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t}\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t},\n\n\tcomputeBoundingSphere: function () {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t},\n\n\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\tif ( ! ( geometry && geometry.isGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\tif ( matrix !== undefined ) {\n\n\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t}\n\n\t\t// vertices\n\n\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\tvertices1.push( vertexCopy );\n\n\t\t}\n\n\t\t// colors\n\n\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t}\n\n\t\t// faces\n\n\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t}\n\n\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t}\n\n\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t}\n\n\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\tfaces1.push( faceCopy );\n\n\t\t}\n\n\t\t// uvs\n\n\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\tif ( uv === undefined ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t}\n\n\t\t\tuvs1.push( uvCopy );\n\n\t\t}\n\n\t},\n\n\tmergeMesh: function ( mesh ) {\n\n\t\tif ( ! ( mesh && mesh.isMesh ) ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( mesh.matrixAutoUpdate ) mesh.updateMatrix();\n\n\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t},\n\n\t/*\n\t * Checks for duplicate vertices with hashmap.\n\t * Duplicated vertices are removed\n\t * and faces' vertices are updated.\n\t */\n\n\tmergeVertices: function () {\n\n\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\tvar unique = [], changes = [];\n\n\t\tvar v, key;\n\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\tvar i, il, face;\n\t\tvar indices, j, jl;\n\n\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\tv = this.vertices[ i ];\n\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// if faces are completely degenerate after merging vertices, we\n\t\t// have to remove them from the geometry.\n\t\tvar faceIndicesToRemove = [];\n\n\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\tface = this.faces[ i ];\n\n\t\t\tface.a = changes[ face.a ];\n\t\t\tface.b = changes[ face.b ];\n\t\t\tface.c = changes[ face.c ];\n\n\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t// we have to remove the face as nothing can be saved\n\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Use unique set of vertices\n\n\t\tvar diff = this.vertices.length - unique.length;\n\t\tthis.vertices = unique;\n\t\treturn diff;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.vertices = [];\n\n\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tvar point = points[ i ];\n\t\t\tthis.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsortFacesByMaterialIndex: function () {\n\n\t\tvar faces = this.faces;\n\t\tvar length = faces.length;\n\n\t\t// tag faces\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tfaces[ i ]._id = i;\n\n\t\t}\n\n\t\t// sort faces\n\n\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t}\n\n\t\tfaces.sort( materialIndexSort );\n\n\t\t// sort uvs\n\n\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\tvar newUvs1, newUvs2;\n\n\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tvar id = faces[ i ]._id;\n\n\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t}\n\n\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Geometry',\n\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Geometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tvar vertices = [];\n\n\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\tvar vertex = this.vertices[ i ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tvar faces = [];\n\t\tvar normals = [];\n\t\tvar normalsHash = {};\n\t\tvar colors = [];\n\t\tvar colorsHash = {};\n\t\tvar uvs = [];\n\t\tvar uvsHash = {};\n\n\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\tvar face = this.faces[ i ];\n\n\t\t\tvar hasMaterial = true;\n\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\tvar faceType = 0;\n\n\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\tfaces.push( faceType );\n\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\tfaces.push( face.materialIndex );\n\n\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t}\n\n\t\tfunction getNormalIndex( normal ) {\n\n\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\treturn normalsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getColorIndex( color ) {\n\n\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\tcolors.push( color.getHex() );\n\n\t\t\treturn colorsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getUvIndex( uv ) {\n\n\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\treturn uvsHash[ hash ];\n\n\t\t}\n\n\t\tdata.data = {};\n\n\t\tdata.data.vertices = vertices;\n\t\tdata.data.normals = normals;\n\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\tdata.data.faces = faces;\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\t/*\n\t\t // Handle primitives\n\n\t\t var parameters = this.parameters;\n\n\t\t if ( parameters !== undefined ) {\n\n\t\t var values = [];\n\n\t\t for ( var key in parameters ) {\n\n\t\t values.push( parameters[ key ] );\n\n\t\t }\n\n\t\t var geometry = Object.create( this.constructor.prototype );\n\t\t this.constructor.apply( geometry, values );\n\t\t return geometry;\n\n\t\t }\n\n\t\t return new this.constructor().copy( this );\n\t\t */\n\n\t\treturn new Geometry().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tvar i, il, j, jl, k, kl;\n\n\t\t// reset\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\t\tthis.lineDistances = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// vertices\n\n\t\tvar vertices = source.vertices;\n\n\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t}\n\n\t\t// colors\n\n\t\tvar colors = source.colors;\n\n\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t}\n\n\t\t// faces\n\n\t\tvar faces = source.faces;\n\n\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t}\n\n\t\t// face vertex uvs\n\n\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tvar morphTargets = source.morphTargets;\n\n\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tvar morphTarget = {};\n\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t// vertices\n\n\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// normals\n\n\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t}\n\n\t\t// morph normals\n\n\t\tvar morphNormals = source.morphNormals;\n\n\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\tvar morphNormal = {};\n\n\t\t\t// vertex normals\n\n\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// face normals\n\n\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t}\n\n\t\t// skin weights\n\n\t\tvar skinWeights = source.skinWeights;\n\n\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t}\n\n\t\t// skin indices\n\n\t\tvar skinIndices = source.skinIndices;\n\n\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t}\n\n\t\t// line distances\n\n\t\tvar lineDistances = source.lineDistances;\n\n\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tvar boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tvar boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction BufferAttribute( array, itemSize, normalized ) {\n\n\tif ( Array.isArray( array ) ) {\n\n\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t}\n\n\tthis.name = '';\n\n\tthis.array = array;\n\tthis.itemSize = itemSize;\n\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\tthis.normalized = normalized === true;\n\n\tthis.dynamic = false;\n\tthis.updateRange = { offset: 0, count: - 1 };\n\n\tthis.version = 0;\n\n}\n\nObject.defineProperty( BufferAttribute.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( BufferAttribute.prototype, {\n\n\tisBufferAttribute: true,\n\n\tonUploadCallback: function () {},\n\n\tsetArray: function ( array ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\tthis.array = array;\n\n\t\treturn this;\n\n\t},\n\n\tsetDynamic: function ( value ) {\n\n\t\tthis.dynamic = value;\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.dynamic = source.dynamic;\n\n\t\treturn this;\n\n\t},\n\n\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyArray: function ( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t},\n\n\tcopyColorsArray: function ( colors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tvar color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector2sArray: function ( vectors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tvar vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector3sArray: function ( vectors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tvar vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector4sArray: function ( vectors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tvar vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tset: function ( value, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t},\n\n\tgetX: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t},\n\n\tsetX: function ( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t},\n\n\tgetY: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t},\n\n\tsetY: function ( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tgetZ: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t},\n\n\tsetZ: function ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tgetW: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t},\n\n\tsetW: function ( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetXY: function ( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZ: function ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tonUpload: function ( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n} );\n\n//\n\nfunction Int8BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int8Array( array ), itemSize, normalized );\n\n}\n\nInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\nfunction Uint8BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized );\n\n}\n\nUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\nfunction Uint8ClampedBufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized );\n\n}\n\nUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\nfunction Int16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int16Array( array ), itemSize, normalized );\n\n}\n\nInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\nfunction Uint16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized );\n\n}\n\nUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\nfunction Int32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int32Array( array ), itemSize, normalized );\n\n}\n\nInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\nfunction Uint32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized );\n\n}\n\nUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\nfunction Float32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Float32Array( array ), itemSize, normalized );\n\n}\n\nFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\nfunction Float64BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Float64Array( array ), itemSize, normalized );\n\n}\n\nFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction DirectGeometry() {\n\n\tthis.vertices = [];\n\tthis.normals = [];\n\tthis.colors = [];\n\tthis.uvs = [];\n\tthis.uvs2 = [];\n\n\tthis.groups = [];\n\n\tthis.morphTargets = {};\n\n\tthis.skinWeights = [];\n\tthis.skinIndices = [];\n\n\t// this.lineDistances = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\t// update flags\n\n\tthis.verticesNeedUpdate = false;\n\tthis.normalsNeedUpdate = false;\n\tthis.colorsNeedUpdate = false;\n\tthis.uvsNeedUpdate = false;\n\tthis.groupsNeedUpdate = false;\n\n}\n\nObject.assign( DirectGeometry.prototype, {\n\n\tcomputeGroups: function ( geometry ) {\n\n\t\tvar group;\n\t\tvar groups = [];\n\t\tvar materialIndex = undefined;\n\n\t\tvar faces = geometry.faces;\n\n\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\t// materials\n\n\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t}\n\n\t\t\t\tgroup = {\n\t\t\t\t\tstart: i * 3,\n\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( group !== undefined ) {\n\n\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\tgroups.push( group );\n\n\t\t}\n\n\t\tthis.groups = groups;\n\n\t},\n\n\tfromGeometry: function ( geometry ) {\n\n\t\tvar faces = geometry.faces;\n\t\tvar vertices = geometry.vertices;\n\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t// morphs\n\n\t\tvar morphTargets = geometry.morphTargets;\n\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\tvar morphTargetsPosition;\n\n\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\tmorphTargetsPosition = [];\n\n\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t}\n\n\t\tvar morphNormals = geometry.morphNormals;\n\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\tvar morphTargetsNormal;\n\n\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\tmorphTargetsNormal = [];\n\n\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t}\n\n\t\t// skins\n\n\t\tvar skinIndices = geometry.skinIndices;\n\t\tvar skinWeights = geometry.skinWeights;\n\n\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t//\n\n\t\tif ( faces.length === 0 ) {\n\n\t\t\tconsole.error( 'THREE.DirectGeometry: Faceless geometries are not supported.' );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t}\n\n\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\tvar color = face.color;\n\n\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morphs\n\n\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t}\n\n\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t}\n\n\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.computeGroups( geometry );\n\n\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction arrayMax( array ) {\n\n\tif ( array.length === 0 ) return - Infinity;\n\n\tvar max = array[ 0 ];\n\n\tfor ( var i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] > max ) max = array[ i ];\n\n\t}\n\n\treturn max;\n\n}\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id\n\nfunction BufferGeometry() {\n\n\tObject.defineProperty( this, 'id', { value: bufferGeometryId += 2 } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'BufferGeometry';\n\n\tthis.index = null;\n\tthis.attributes = {};\n\n\tthis.morphAttributes = {};\n\n\tthis.groups = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\tthis.drawRange = { start: 0, count: Infinity };\n\n\tthis.userData = {};\n\n}\n\nBufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: BufferGeometry,\n\n\tisBufferGeometry: true,\n\n\tgetIndex: function () {\n\n\t\treturn this.index;\n\n\t},\n\n\tsetIndex: function ( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t},\n\n\taddAttribute: function ( name, attribute ) {\n\n\t\tif ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\treturn this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t}\n\n\t\tif ( name === 'index' ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\tthis.setIndex( attribute );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t},\n\n\tgetAttribute: function ( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t},\n\n\tremoveAttribute: function ( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t},\n\n\taddGroup: function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t} );\n\n\t},\n\n\tclearGroups: function () {\n\n\t\tthis.groups = [];\n\n\t},\n\n\tsetDrawRange: function ( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t},\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tvar position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tvar normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function () {\n\n\t\t// rotate geometry around world x-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateX( angle ) {\n\n\t\t\tm1.makeRotationX( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateY: function () {\n\n\t\t// rotate geometry around world y-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateY( angle ) {\n\n\t\t\tm1.makeRotationY( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateZ: function () {\n\n\t\t// rotate geometry around world z-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateZ( angle ) {\n\n\t\t\tm1.makeRotationZ( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function () {\n\n\t\t// translate geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function translate( x, y, z ) {\n\n\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tscale: function () {\n\n\t\t// scale geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function scale( x, y, z ) {\n\n\t\t\tm1.makeScale( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\tvar obj = new Object3D();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tobj.lookAt( vector );\n\n\t\t\tobj.updateMatrix();\n\n\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t};\n\n\t}(),\n\n\tcenter: function () {\n\n\t\tvar offset = new Vector3();\n\n\t\treturn function center() {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tthis.boundingBox.getCenter( offset ).negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tsetFromObject: function ( object ) {\n\n\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\tvar geometry = object.geometry;\n\n\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t} else if ( object.isMesh ) {\n\n\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tvar position = [];\n\n\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tvar point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t},\n\n\tupdateFromObject: function ( object ) {\n\n\t\tvar geometry = object.geometry;\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\tdirect = undefined;\n\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( direct === undefined ) {\n\n\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t}\n\n\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\tgeometry = direct;\n\n\t\t}\n\n\t\tvar attribute;\n\n\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\tattribute = this.attributes.position;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\tattribute = this.attributes.normal;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\tattribute = this.attributes.color;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\tattribute = this.attributes.uv;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tfromGeometry: function ( geometry ) {\n\n\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t},\n\n\tfromDirectGeometry: function ( geometry ) {\n\n\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t}\n\n\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t}\n\n\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t}\n\n\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t}\n\n\t\t// groups\n\n\t\tthis.groups = geometry.groups;\n\n\t\t// morphs\n\n\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\tvar array = [];\n\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );\n\n\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\t// skinning\n\n\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t}\n\n\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tvar position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t},\n\n\tcomputeBoundingSphere: function () {\n\n\t\tvar box = new Box3();\n\t\tvar vector = new Vector3();\n\n\t\treturn function computeBoundingSphere() {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position ) {\n\n\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\tbox.setFromBufferAttribute( position );\n\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\tvector.x = position.getX( i );\n\t\t\t\t\tvector.y = position.getY( i );\n\t\t\t\t\tvector.z = position.getZ( i );\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\tcomputeFaceNormals: function () {\n\n\t\t// backwards compatibility\n\n\t},\n\n\tcomputeVertexNormals: function () {\n\n\t\tvar index = this.index;\n\t\tvar attributes = this.attributes;\n\t\tvar groups = this.groups;\n\n\t\tif ( attributes.position ) {\n\n\t\t\tvar positions = attributes.position.array;\n\n\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar normals = attributes.normal.array;\n\n\t\t\tvar vA, vB, vC;\n\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tvar indices = index.array;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\tvar start = group.start;\n\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t}\n\n\t},\n\n\tmerge: function ( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tvar attributes = this.attributes;\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tvar attribute1 = attributes[ key ];\n\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tnormalizeNormals: function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function normalizeNormals() {\n\n\t\t\tvar normals = this.attributes.normal;\n\n\t\t\tfor ( var i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t\tvector.x = normals.getX( i );\n\t\t\t\tvector.y = normals.getY( i );\n\t\t\t\tvector.z = normals.getZ( i );\n\n\t\t\t\tvector.normalize();\n\n\t\t\t\tnormals.setXYZ( i, vector.x, vector.y, vector.z );\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\ttoNonIndexed: function () {\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar geometry2 = new BufferGeometry();\n\n\t\tvar indices = this.index.array;\n\t\tvar attributes = this.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\n\t\t\tvar array = attribute.array;\n\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tvar index = 0, index2 = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t}\n\n\t\tvar groups = this.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tdata.data = { attributes: {} };\n\n\t\tvar index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: array\n\t\t\t};\n\n\t\t}\n\n\t\tvar attributes = this.attributes;\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tvar attribute = attributes[ key ];\n\n\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: attribute.normalized\n\t\t\t};\n\n\t\t}\n\n\t\tvar groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tvar boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\t/*\n\t\t // Handle primitives\n\n\t\t var parameters = this.parameters;\n\n\t\t if ( parameters !== undefined ) {\n\n\t\t var values = [];\n\n\t\t for ( var key in parameters ) {\n\n\t\t values.push( parameters[ key ] );\n\n\t\t }\n\n\t\t var geometry = Object.create( this.constructor.prototype );\n\t\t this.constructor.apply( geometry, values );\n\t\t return geometry;\n\n\t\t }\n\n\t\t return new this.constructor().copy( this );\n\t\t */\n\n\t\treturn new BufferGeometry().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tvar name, i, l;\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tvar morphAttributes = source.morphAttributes;\n\n\t\tfor ( name in morphAttributes ) {\n\n\t\t\tvar array = [];\n\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\t// groups\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tvar boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tvar boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// BoxGeometry\n\nfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'BoxGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\tdepth: depth,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tdepthSegments: depthSegments\n\t};\n\n\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\tthis.mergeVertices();\n\n}\n\nBoxGeometry.prototype = Object.create( Geometry.prototype );\nBoxGeometry.prototype.constructor = BoxGeometry;\n\n// BoxBufferGeometry\n\nfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'BoxBufferGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\tdepth: depth,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tdepthSegments: depthSegments\n\t};\n\n\tvar scope = this;\n\n\twidth = width || 1;\n\theight = height || 1;\n\tdepth = depth || 1;\n\n\t// segments\n\n\twidthSegments = Math.floor( widthSegments ) || 1;\n\theightSegments = Math.floor( heightSegments ) || 1;\n\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar numberOfVertices = 0;\n\tvar groupStart = 0;\n\n\t// build each side of the box geometry\n\n\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\tvar segmentWidth = width / gridX;\n\t\tvar segmentHeight = height / gridY;\n\n\t\tvar widthHalf = width / 2;\n\t\tvar heightHalf = height / 2;\n\t\tvar depthHalf = depth / 2;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar vertexCounter = 0;\n\t\tvar groupCount = 0;\n\n\t\tvar ix, iy;\n\n\t\tvar vector = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t// set values to correct vector component\n\n\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t// set values to correct vector component\n\n\t\t\t\tvector[ u ] = 0;\n\t\t\t\tvector[ v ] = 0;\n\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t// uvs\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t// counters\n\n\t\t\t\tvertexCounter += 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\t// 1. you need three indices to draw a single face\n\t\t// 2. a single segment consists of two faces\n\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t// increase counter\n\n\t\t\t\tgroupCount += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t\t// update total number of vertices\n\n\t\tnumberOfVertices += vertexCounter;\n\n\t}\n\n}\n\nBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// PlaneGeometry\n\nfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'PlaneGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\tthis.mergeVertices();\n\n}\n\nPlaneGeometry.prototype = Object.create( Geometry.prototype );\nPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n// PlaneBufferGeometry\n\nfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'PlaneBufferGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\twidth = width || 1;\n\theight = height || 1;\n\n\tvar width_half = width / 2;\n\tvar height_half = height / 2;\n\n\tvar gridX = Math.floor( widthSegments ) || 1;\n\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\tvar gridX1 = gridX + 1;\n\tvar gridY1 = gridY + 1;\n\n\tvar segment_width = width / gridX;\n\tvar segment_height = height / gridY;\n\n\tvar ix, iy;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// generate vertices, normals and uvs\n\n\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\tvar y = iy * segment_height - height_half;\n\n\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\tuvs.push( ix / gridX );\n\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar a = ix + gridX1 * iy;\n\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nvar materialId = 0;\n\nfunction Material() {\n\n\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Material';\n\n\tthis.fog = true;\n\tthis.lights = true;\n\n\tthis.blending = NormalBlending;\n\tthis.side = FrontSide;\n\tthis.flatShading = false;\n\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\tthis.opacity = 1;\n\tthis.transparent = false;\n\n\tthis.blendSrc = SrcAlphaFactor;\n\tthis.blendDst = OneMinusSrcAlphaFactor;\n\tthis.blendEquation = AddEquation;\n\tthis.blendSrcAlpha = null;\n\tthis.blendDstAlpha = null;\n\tthis.blendEquationAlpha = null;\n\n\tthis.depthFunc = LessEqualDepth;\n\tthis.depthTest = true;\n\tthis.depthWrite = true;\n\n\tthis.clippingPlanes = null;\n\tthis.clipIntersection = false;\n\tthis.clipShadows = false;\n\n\tthis.shadowSide = null;\n\n\tthis.colorWrite = true;\n\n\tthis.precision = null; // override the renderer's default precision for this material\n\n\tthis.polygonOffset = false;\n\tthis.polygonOffsetFactor = 0;\n\tthis.polygonOffsetUnits = 0;\n\n\tthis.dithering = false;\n\n\tthis.alphaTest = 0;\n\tthis.premultipliedAlpha = false;\n\n\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\tthis.visible = true;\n\n\tthis.userData = {};\n\n\tthis.needsUpdate = true;\n\n}\n\nMaterial.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Material,\n\n\tisMaterial: true,\n\n\tonBeforeCompile: function () {},\n\n\tsetValues: function ( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( var key in values ) {\n\n\t\t\tvar newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatability if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar isRoot = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRoot ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t}\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.morphTargets === true ) data.morphTargets = true;\n\t\tif ( this.skinning === true ) data.skinning = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tvar values = [];\n\n\t\t\tfor ( var key in cache ) {\n\n\t\t\t\tvar data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRoot ) {\n\n\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.flatShading = source.flatShading;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.overdraw = source.overdraw;\n\n\t\tthis.visible = source.visible;\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.clipShadows = source.clipShadows;\n\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\tdstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tvar n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: <hex>,\n * opacity: <float>,\n * map: new THREE.Texture( <Image> ),\n *\n * lightMap: new THREE.Texture( <Image> ),\n * lightMapIntensity: <float>\n *\n * aoMap: new THREE.Texture( <Image> ),\n * aoMapIntensity: <float>\n *\n * specularMap: new THREE.Texture( <Image> ),\n *\n * alphaMap: new THREE.Texture( <Image> ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: <float>,\n * refractionRatio: <float>,\n *\n * depthTest: <bool>,\n * depthWrite: <bool>,\n *\n * wireframe: <boolean>,\n * wireframeLinewidth: <float>,\n *\n * skinning: <bool>,\n * morphTargets: <bool>\n * }\n */\n\nfunction MeshBasicMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshBasicMaterial';\n\n\tthis.color = new Color( 0xffffff ); // emissive\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshBasicMaterial.prototype = Object.create( Material.prototype );\nMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\nMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\nMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * defines: { \"label\" : \"value\" },\n * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n *\n * fragmentShader: <string>,\n * vertexShader: <string>,\n *\n * wireframe: <boolean>,\n * wireframeLinewidth: <float>,\n *\n * lights: <bool>,\n *\n * skinning: <bool>,\n * morphTargets: <bool>,\n * morphNormals: <bool>\n * }\n */\n\nfunction ShaderMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'ShaderMaterial';\n\n\tthis.defines = {};\n\tthis.uniforms = {};\n\n\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\tthis.linewidth = 1;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false; // set to use scene fog\n\tthis.lights = false; // set to use scene lights\n\tthis.clipping = false; // set to use user-defined clipping planes\n\n\tthis.skinning = false; // set to use skinning attribute streams\n\tthis.morphTargets = false; // set to use morph targets\n\tthis.morphNormals = false; // set to use morph normals\n\n\tthis.extensions = {\n\t\tderivatives: false, // set to use derivatives\n\t\tfragDepth: false, // set to use fragment depth values\n\t\tdrawBuffers: false, // set to use draw buffers\n\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t};\n\n\t// When rendered geometry doesn't include these attributes but the material does,\n\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\tthis.defaultAttributeValues = {\n\t\t'color': [ 1, 1, 1 ],\n\t\t'uv': [ 0, 0 ],\n\t\t'uv2': [ 0, 0 ]\n\t};\n\n\tthis.index0AttributeName = undefined;\n\tthis.uniformsNeedUpdate = false;\n\n\tif ( parameters !== undefined ) {\n\n\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n\nShaderMaterial.prototype = Object.create( Material.prototype );\nShaderMaterial.prototype.constructor = ShaderMaterial;\n\nShaderMaterial.prototype.isShaderMaterial = true;\n\nShaderMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.fragmentShader = source.fragmentShader;\n\tthis.vertexShader = source.vertexShader;\n\n\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\tthis.defines = Object.assign( {}, source.defines );\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\tthis.lights = source.lights;\n\tthis.clipping = source.clipping;\n\n\tthis.skinning = source.skinning;\n\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\tthis.extensions = source.extensions;\n\n\treturn this;\n\n};\n\nShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\tdata.uniforms = this.uniforms;\n\tdata.vertexShader = this.vertexShader;\n\tdata.fragmentShader = this.fragmentShader;\n\n\treturn data;\n\n};\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Ray( origin, direction ) {\n\n\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n}\n\nObject.assign( Ray.prototype, {\n\n\tset: function ( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t},\n\n\tat: function ( t, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .at() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t},\n\n\tlookAt: function ( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t},\n\n\trecast: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function recast( t ) {\n\n\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclosestPointToPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tvar directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t},\n\n\tdistanceSqToPoint: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t// point behind the ray\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t}\n\n\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\treturn v1.distanceToSquared( point );\n\n\t\t};\n\n\t}(),\n\n\tdistanceSqToSegment: function () {\n\n\t\tvar segCenter = new Vector3();\n\t\tvar segDir = new Vector3();\n\t\tvar diff = new Vector3();\n\n\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t// defined by v0 and v1\n\t\t\t// It can also set two optional targets :\n\t\t\t// - The closest point on the ray\n\t\t\t// - The closest point on the segment\n\n\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\tvar c = diff.lengthSq();\n\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\tif ( det > 0 ) {\n\n\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\textDet = segExtent * det;\n\n\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t}\n\n\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t}\n\n\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t}\n\n\t\t\treturn sqrDist;\n\n\t\t};\n\n\t}(),\n\n\tintersectSphere: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function intersectSphere( sphere, target ) {\n\n\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\tvar tca = v1.dot( this.direction );\n\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\tvar t0 = tca - thc;\n\n\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\tvar t1 = tca + thc;\n\n\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t// test to see if t0 is behind the ray:\n\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\treturn this.at( t0, target );\n\n\t\t};\n\n\t}(),\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t},\n\n\tdistanceToPlane: function ( plane ) {\n\n\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t},\n\n\tintersectPlane: function ( plane, target ) {\n\n\t\tvar t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t},\n\n\tintersectsPlane: function ( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t},\n\n\tintersectBox: function ( box, target ) {\n\n\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tvar invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tvar origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t},\n\n\tintersectsBox: ( function () {\n\n\t\tvar v = new Vector3();\n\n\t\treturn function intersectsBox( box ) {\n\n\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t};\n\n\t} )(),\n\n\tintersectTriangle: function () {\n\n\t\t// Compute the offset origin, edges, and normal.\n\t\tvar diff = new Vector3();\n\t\tvar edge1 = new Vector3();\n\t\tvar edge2 = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\treturn function intersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\tedge1.subVectors( b, a );\n\t\t\tedge2.subVectors( c, a );\n\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\tvar sign;\n\n\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\tsign = 1;\n\n\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\tsign = - 1;\n\t\t\t\tDdN = - DdN;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tdiff.subVectors( this.origin, a );\n\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t// b1 < 0, no intersection\n\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t// b2 < 0, no intersection\n\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\t// b1+b2 > 1, no intersection\n\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\t// Line intersects triangle, check if ray does.\n\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t// t < 0, no intersection\n\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\t// Ray intersects triangle.\n\t\t\treturn this.at( QdN / DdN, target );\n\n\t\t};\n\n\t}(),\n\n\tapplyMatrix4: function ( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Line3( start, end ) {\n\n\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n}\n\nObject.assign( Line3.prototype, {\n\n\tset: function ( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .getCenter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t},\n\n\tdelta: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .delta() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t},\n\n\tdistanceSq: function () {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t},\n\n\tdistance: function () {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t},\n\n\tat: function ( t, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .at() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t},\n\n\tclosestPointToPointParameter: function () {\n\n\t\tvar startP = new Vector3();\n\t\tvar startEnd = new Vector3();\n\n\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\tstartP.subVectors( point, this.start );\n\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\tif ( clampToLine ) {\n\n\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t}\n\n\t\t\treturn t;\n\n\t\t};\n\n\t}(),\n\n\tclosestPointToPoint: function ( point, clampToLine, target ) {\n\n\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Triangle( a, b, c ) {\n\n\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n}\n\nObject.assign( Triangle, {\n\n\tgetNormal: function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function getNormal( a, b, c, target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Triangle: .getNormal() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\ttarget.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\ttarget.cross( v0 );\n\n\t\t\tvar targetLengthSq = target.lengthSq();\n\t\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn target.set( 0, 0, 0 );\n\n\t\t};\n\n\t}(),\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tgetBarycoord: function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function getBarycoord( point, a, b, c, target ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Triangle: .getBarycoord() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn target.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}(),\n\n\tcontainsPoint: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tTriangle.getBarycoord( point, a, b, c, v1 );\n\n\t\t\treturn ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 );\n\n\t\t};\n\n\t}()\n\n} );\n\nObject.assign( Triangle.prototype, {\n\n\tset: function ( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t},\n\n\tgetArea: function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\n\t\treturn function getArea() {\n\n\t\t\tv0.subVectors( this.c, this.b );\n\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t};\n\n\t}(),\n\n\tgetMidpoint: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getMidpoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t},\n\n\tgetNormal: function ( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t},\n\n\tgetPlane: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getPlane() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t},\n\n\tgetBarycoord: function ( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t},\n\n\tclosestPointToPoint: function () {\n\n\t\tvar plane = new Plane();\n\t\tvar edgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\tvar projectedPoint = new Vector3();\n\t\tvar closestPoint = new Vector3();\n\n\t\treturn function closestPointToPoint( point, target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tvar minDistance = Infinity;\n\n\t\t\t// project the point onto the plane of the triangle\n\n\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t// check if the projection lies within the triangle\n\n\t\t\tif ( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t// if so, this is the closest point\n\n\t\t\t\ttarget.copy( projectedPoint );\n\n\t\t\t} else {\n\n\t\t\t\t// if not, the point falls outside the triangle. the target is the closest point to the triangle's edges or vertices\n\n\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\tfor ( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\tif ( distance < minDistance ) {\n\n\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\ttarget.copy( closestPoint );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tequals: function ( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author mikael emtinger / http://gomo.se/\n * @author jonobr1 / http://jonobr1.com/\n */\n\nfunction Mesh( geometry, material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Mesh';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\tthis.drawMode = TrianglesDrawMode;\n\n\tthis.updateMorphTargets();\n\n}\n\nMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Mesh,\n\n\tisMesh: true,\n\n\tsetDrawMode: function ( value ) {\n\n\t\tthis.drawMode = value;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.drawMode = source.drawMode;\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t\tvar geometry = this.geometry;\n\t\tvar m, ml, name;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\t\t\tvar keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tvar morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tname = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tname = morphTargets[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\traycast: ( function () {\n\n\t\tvar inverseMatrix = new Matrix4();\n\t\tvar ray = new Ray();\n\t\tvar sphere = new Sphere();\n\n\t\tvar vA = new Vector3();\n\t\tvar vB = new Vector3();\n\t\tvar vC = new Vector3();\n\n\t\tvar tempA = new Vector3();\n\t\tvar tempB = new Vector3();\n\t\tvar tempC = new Vector3();\n\n\t\tvar uvA = new Vector2();\n\t\tvar uvB = new Vector2();\n\t\tvar uvC = new Vector2();\n\n\t\tvar barycoord = new Vector3();\n\n\t\tvar intersectionPoint = new Vector3();\n\t\tvar intersectionPointWorld = new Vector3();\n\n\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\tTriangle.getBarycoord( point, p1, p2, p3, barycoord );\n\n\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\treturn uv1.clone();\n\n\t\t}\n\n\t\tfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\tvar intersect;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t} else {\n\n\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t}\n\n\t\t\tif ( intersect === null ) return null;\n\n\t\t\tintersectionPointWorld.copy( point );\n\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\treturn {\n\t\t\t\tdistance: distance,\n\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\tobject: object\n\t\t\t};\n\n\t\t}\n\n\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\tvar intersection = checkIntersection( object, object.material, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\tif ( intersection ) {\n\n\t\t\t\tif ( uv ) {\n\n\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t}\n\n\t\t\t\tvar face = new Face3( a, b, c );\n\t\t\t\tTriangle.getNormal( vA, vB, vC, face.normal );\n\n\t\t\t\tintersection.face = face;\n\n\t\t\t}\n\n\t\t\treturn intersection;\n\n\t\t}\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar material = this.material;\n\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\tif ( material === undefined ) return;\n\n\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t//\n\n\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t// Check boundingBox before continuing\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t}\n\n\t\t\tvar intersection;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tvar a, b, c;\n\t\t\t\tvar index = geometry.index;\n\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\tvar i, l;\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\tfor ( i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\tfor ( i = 0, l = position.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\ta = i;\n\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\tvar isMultiMaterial = Array.isArray( material );\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar faces = geometry.faces;\n\t\t\t\tvar uvs;\n\n\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\tvar faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material;\n\n\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tif ( uvs && uvs[ f ] ) {\n\n\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLBackground( renderer, state, objects, premultipliedAlpha ) {\n\n\tvar clearColor = new Color( 0x000000 );\n\tvar clearAlpha = 0;\n\n\tvar planeCamera, planeMesh;\n\tvar boxMesh;\n\n\tfunction render( renderList, scene, camera, forceClear ) {\n\n\t\tvar background = scene.background;\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxBufferGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tuniforms: ShaderLib.cube.uniforms,\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: true,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.removeAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.removeAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.tCube.value = background;\n\n\t\t\trenderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeCamera === undefined ) {\n\n\t\t\t\tplaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t\t\t);\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.map = background;\n\n\t\t\t// TODO Push this to renderList\n\n\t\t\trenderer.renderBufferDirect( planeCamera, null, planeMesh.geometry, planeMesh.material, planeMesh, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha !== undefined ? alpha : 1;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tvar mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode );\n\n\t}\n\n\tfunction renderInstances( geometry, start, count ) {\n\n\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\textension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount );\n\n\t\tinfo.update( count, mode, geometry.maxInstancedCount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tvar maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tvar maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tvar vertexTextures = maxVertexTextures > 0;\n\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\treturn {\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures\n\n\t};\n\n}\n\n/**\n * @author tschw\n */\n\nfunction WebGLClipping() {\n\n\tvar scope = this,\n\n\t\tglobalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false,\n\n\t\tplane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tvar enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tcache.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\tdstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLExtensions( gl ) {\n\n\tvar extensions = {};\n\n\treturn {\n\n\t\tget: function ( name ) {\n\n\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\treturn extensions[ name ];\n\n\t\t\t}\n\n\t\t\tvar extension;\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t}\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\textensions[ name ] = extension;\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLGeometries( gl, attributes, info ) {\n\n\tvar geometries = {};\n\tvar wireframeAttributes = {};\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tvar geometry = event.target;\n\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\tattributes.remove( buffergeometry.index );\n\n\t\t}\n\n\t\tfor ( var name in buffergeometry.attributes ) {\n\n\t\t\tattributes.remove( buffergeometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\t// TODO Remove duplicate code\n\n\t\tvar attribute = wireframeAttributes[ geometry.id ];\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\tdelete wireframeAttributes[ geometry.id ];\n\n\t\t}\n\n\t\tattribute = wireframeAttributes[ buffergeometry.id ];\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\tdelete wireframeAttributes[ buffergeometry.id ];\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\tif ( buffergeometry ) return buffergeometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tbuffergeometry = geometry;\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t}\n\n\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t}\n\n\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tvar index = geometry.index;\n\t\tvar geometryAttributes = geometry.attributes;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tfor ( var name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( var name in morphAttributes ) {\n\n\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tvar attribute = wireframeAttributes[ geometry.id ];\n\n\t\tif ( attribute ) return attribute;\n\n\t\tvar indices = [];\n\n\t\tvar geometryIndex = geometry.index;\n\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t// console.time( 'wireframe' );\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tvar array = geometryIndex.array;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar array = geometryAttributes.position.array;\n\n\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tvar a = i + 0;\n\t\t\t\tvar b = i + 1;\n\t\t\t\tvar c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// console.timeEnd( 'wireframe' );\n\n\t\tattribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\tattributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\twireframeAttributes[ geometry.id ] = attribute;\n\n\t\treturn attribute;\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tvar mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tvar type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode );\n\n\t}\n\n\tfunction renderInstances( geometry, start, count ) {\n\n\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\textension.drawElementsInstancedANGLE( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount );\n\n\t\tinfo.update( count, mode, geometry.maxInstancedCount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction WebGLInfo( gl ) {\n\n\tvar memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tvar render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\tinstanceCount = instanceCount || 1;\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.TRIANGLE_STRIP:\n\t\t\tcase gl.TRIANGLE_FAN:\n\t\t\t\trender.triangles += instanceCount * ( count - 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction WebGLMorphtargets( gl ) {\n\n\tvar influencesList = {};\n\tvar morphInfluences = new Float32Array( 8 );\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tvar objectInfluences = object.morphTargetInfluences;\n\n\t\tvar length = objectInfluences.length;\n\n\t\tvar influences = influencesList[ geometry.id ];\n\n\t\tif ( influences === undefined ) {\n\n\t\t\t// initialise list\n\n\t\t\tinfluences = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t}\n\n\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t}\n\n\t\tvar morphTargets = material.morphTargets && geometry.morphAttributes.position;\n\t\tvar morphNormals = material.morphNormals && geometry.morphAttributes.normal;\n\n\t\t// Remove current morphAttributes\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tvar influence = influences[ i ];\n\n\t\t\tif ( influence[ 1 ] !== 0 ) {\n\n\t\t\t\tif ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\tif ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Collect influences\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tvar influence = influences[ i ];\n\n\t\t\tinfluence[ 0 ] = i;\n\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t}\n\n\t\tinfluences.sort( absNumericalSort );\n\n\t\t// Add morphAttributes\n\n\t\tfor ( var i = 0; i < 8; i ++ ) {\n\n\t\t\tvar influence = influences[ i ];\n\n\t\t\tif ( influence ) {\n\n\t\t\t\tvar index = influence[ 0 ];\n\t\t\t\tvar value = influence[ 1 ];\n\n\t\t\t\tif ( value ) {\n\n\t\t\t\t\tif ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\t\t\t\t\tif ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLObjects( geometries, info ) {\n\n\tvar updateList = {};\n\n\tfunction update( object ) {\n\n\t\tvar frame = info.render.frame;\n\n\t\tvar geometry = object.geometry;\n\t\tvar buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateList[ buffergeometry.id ] !== frame ) {\n\n\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\tbuffergeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateList[ buffergeometry.id ] = frame;\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\timages = images !== undefined ? images : [];\n\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.flipY = false;\n\n}\n\nCubeTexture.prototype = Object.create( Texture.prototype );\nCubeTexture.prototype.constructor = CubeTexture;\n\nCubeTexture.prototype.isCubeTexture = true;\n\nObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\tget: function () {\n\n\t\treturn this.image;\n\n\t},\n\n\tset: function ( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n} );\n\n/**\n * @author tschw\n *\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [renderer] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'renderer' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (renderer factorizations):\n *\n * .upload( gl, seq, values, renderer )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (renderer factorizations):\n *\n * .setValue( gl, name, value )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .set( gl, obj, prop )\n *\n * \t\tsets uniform from object and property with same name than uniform\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nvar emptyTexture = new Texture();\nvar emptyCubeTexture = new CubeTexture();\n\n// --- Base for inner nodes (including the root) ---\n\nfunction UniformContainer() {\n\n\tthis.seq = [];\n\tthis.map = {};\n\n}\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nvar arrayCacheF32 = [];\nvar arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nvar mat4array = new Float32Array( 16 );\nvar mat3array = new Float32Array( 9 );\nvar mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tvar firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tvar n = nBlocks * blockSize,\n\t\tr = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( var i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( var i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( renderer, n ) {\n\n\tvar r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( var i = 0; i !== n; ++ i )\n\t\tr[ i ] = renderer.allocTextureUnit();\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValue1f( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\nfunction setValue1i( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValue2fv( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValue3fv( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValue4fv( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or MatrixN)\n\nfunction setValue2fm( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValue3fm( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValue4fm( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, renderer ) {\n\n\tvar cache = this.cache;\n\tvar unit = renderer.allocTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\trenderer.setTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, renderer ) {\n\n\tvar cache = this.cache;\n\tvar unit = renderer.allocTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\n// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\nfunction setValue2iv( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValue3iv( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValue4iv( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\tcase 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES\n\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t}\n\n}\n\n// Array of scalars\n\nfunction setValue1fv( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform1fv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\nfunction setValue1iv( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform1iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// Array of vectors (flat or from THREE classes)\n\nfunction setValueV2a( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar data = flatten( v, this.size, 2 );\n\n\tif ( arraysEqual( cache, data ) ) return;\n\n\tgl.uniform2fv( this.addr, data );\n\n\tthis.updateCache( data );\n\n}\n\nfunction setValueV3a( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar data = flatten( v, this.size, 3 );\n\n\tif ( arraysEqual( cache, data ) ) return;\n\n\tgl.uniform3fv( this.addr, data );\n\n\tthis.updateCache( data );\n\n}\n\nfunction setValueV4a( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar data = flatten( v, this.size, 4 );\n\n\tif ( arraysEqual( cache, data ) ) return;\n\n\tgl.uniform4fv( this.addr, data );\n\n\tthis.updateCache( data );\n\n}\n\n// Array of matrices (flat or from THREE clases)\n\nfunction setValueM2a( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar data = flatten( v, this.size, 4 );\n\n\tif ( arraysEqual( cache, data ) ) return;\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n\tthis.updateCache( data );\n\n}\n\nfunction setValueM3a( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar data = flatten( v, this.size, 9 );\n\n\tif ( arraysEqual( cache, data ) ) return;\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n\tthis.updateCache( data );\n\n}\n\nfunction setValueM4a( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar data = flatten( v, this.size, 16 );\n\n\tif ( arraysEqual( cache, data ) ) return;\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n\tthis.updateCache( data );\n\n}\n\n// Array of textures (2D / Cube)\n\nfunction setValueT1a( gl, v, renderer ) {\n\n\tvar cache = this.cache;\n\tvar n = v.length;\n\n\tvar units = allocTexUnits( renderer, n );\n\n\tif ( arraysEqual( cache, units ) === false ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6a( gl, v, renderer ) {\n\n\tvar cache = this.cache;\n\tvar n = v.length;\n\n\tvar units = allocTexUnits( renderer, n );\n\n\tif ( arraysEqual( cache, units ) === false ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nfunction SingleUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nPureArrayUniform.prototype.updateCache = function ( data ) {\n\n\tvar cache = this.cache;\n\n\tif ( data instanceof Float32Array && cache.length !== data.length ) {\n\n\t\tthis.cache = new Float32Array( data.length );\n\n\t}\n\n\tcopyArray( cache, data );\n\n};\n\nfunction StructuredUniform( id ) {\n\n\tthis.id = id;\n\n\tUniformContainer.call( this ); // mix-in\n\n}\n\nStructuredUniform.prototype.setValue = function ( gl, value ) {\n\n\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t// are not allowed in structured uniforms.\n\n\tvar seq = this.seq;\n\n\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tvar u = seq[ i ];\n\t\tu.setValue( gl, value[ u.id ] );\n\n\t}\n\n};\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tvar path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tvar match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\tid = match[ 1 ],\n\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tvar map = container.map, next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nfunction WebGLUniforms( gl, program, renderer ) {\n\n\tUniformContainer.call( this );\n\n\tthis.renderer = renderer;\n\n\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\tparseUniform( info, addr, this );\n\n\t}\n\n}\n\nWebGLUniforms.prototype.setValue = function ( gl, name, value ) {\n\n\tvar u = this.map[ name ];\n\n\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n};\n\nWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\tvar v = object[ name ];\n\n\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n};\n\n\n// Static interface\n\nWebGLUniforms.upload = function ( gl, seq, values, renderer ) {\n\n\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tvar u = seq[ i ],\n\t\t\tv = values[ u.id ];\n\n\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t}\n\n\t}\n\n};\n\nWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\tvar r = [];\n\n\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tvar u = seq[ i ];\n\t\tif ( u.id in values ) r.push( u );\n\n\t}\n\n\treturn r;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction addLineNumbers( string ) {\n\n\tvar lines = string.split( '\\n' );\n\n\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t}\n\n\treturn lines.join( '\\n' );\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tvar shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t}\n\n\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t}\n\n\t// --enable-privileged-webgl-extension\n\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\treturn shader;\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar programIdCount = 0;\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tcase RGBEEncoding:\n\t\t\treturn [ 'RGBE', '( value )' ];\n\t\tcase RGBM7Encoding:\n\t\t\treturn [ 'RGBM', '( value, 7.0 )' ];\n\t\tcase RGBM16Encoding:\n\t\t\treturn [ 'RGBM', '( value, 16.0 )' ];\n\t\tcase RGBDEncoding:\n\t\t\treturn [ 'RGBD', '( value, 256.0 )' ];\n\t\tcase GammaEncoding:\n\t\t\treturn [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ];\n\t\tdefault:\n\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t}\n\n}\n\nfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\tvar components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }';\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tvar components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tvar toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase Uncharted2ToneMapping:\n\t\t\ttoneMappingName = 'Uncharted2';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\textensions = extensions || {};\n\n\tvar chunks = [\n\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tvar chunks = [];\n\n\tfor ( var name in defines ) {\n\n\t\tvar value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tvar attributes = {};\n\n\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\tvar info = gl.getActiveAttrib( program, i );\n\t\tvar name = info.name;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\nfunction parseIncludes( string ) {\n\n\tvar pattern = /^[ \\t]*#include +<([\\w\\d.]+)>/gm;\n\n\tfunction replace( match, include ) {\n\n\t\tvar replace = ShaderChunk[ include ];\n\n\t\tif ( replace === undefined ) {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t\treturn parseIncludes( replace );\n\n\t}\n\n\treturn string.replace( pattern, replace );\n\n}\n\nfunction unrollLoops( string ) {\n\n\tvar pattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\tfunction replace( match, start, end, snippet ) {\n\n\t\tvar unroll = '';\n\n\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t}\n\n\t\treturn unroll;\n\n\t}\n\n\treturn string.replace( pattern, replace );\n\n}\n\nfunction WebGLProgram( renderer, extensions, code, material, shader, parameters ) {\n\n\tvar gl = renderer.context;\n\n\tvar defines = material.defines;\n\n\tvar vertexShader = shader.vertexShader;\n\tvar fragmentShader = shader.fragmentShader;\n\n\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t}\n\n\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t\tcase EquirectangularReflectionMapping:\n\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\tbreak;\n\n\t\t\tcase SphericalReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\tcase CubeRefractionMapping:\n\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tswitch ( material.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t// console.log( 'building new program ' );\n\n\t//\n\n\tvar customExtensions = generateExtensions( material.extensions, parameters, extensions );\n\n\tvar customDefines = generateDefines( defines );\n\n\t//\n\n\tvar program = gl.createProgram();\n\n\tvar prefixVertex, prefixFragment;\n\n\tif ( material.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t'#define SHADER_NAME ' + shader.name,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\tparameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t'#define SHADER_NAME ' + shader.name,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + ( parameters.alphaTest % 1 ? '' : '.0' ) : '', // add '.0' if integer\n\n\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\tparameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\tparameters.envMap && extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\n\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '',\n\n\t\t\tparameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = parseIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = parseIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tvar vertexGlsl = prefixVertex + vertexShader;\n\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( material.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tvar programLog = gl.getProgramInfoLog( program ).trim();\n\tvar vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\tvar runnable = true;\n\tvar haveDiagnostics = true;\n\n\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\trunnable = false;\n\n\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );\n\n\t} else if ( programLog !== '' ) {\n\n\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\thaveDiagnostics = false;\n\n\t}\n\n\tif ( haveDiagnostics ) {\n\n\t\tthis.diagnostics = {\n\n\t\t\trunnable: runnable,\n\t\t\tmaterial: material,\n\n\t\t\tprogramLog: programLog,\n\n\t\t\tvertexShader: {\n\n\t\t\t\tlog: vertexLog,\n\t\t\t\tprefix: prefixVertex\n\n\t\t\t},\n\n\t\t\tfragmentShader: {\n\n\t\t\t\tlog: fragmentLog,\n\t\t\t\tprefix: prefixFragment\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// clean up\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tvar cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program, renderer );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tvar cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t// DEPRECATED\n\n\tObject.defineProperties( this, {\n\n\t\tuniforms: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\treturn this.getUniforms();\n\n\t\t\t}\n\t\t},\n\n\t\tattributes: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\treturn this.getAttributes();\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\n\t//\n\n\tthis.name = shader.name;\n\tthis.id = programIdCount ++;\n\tthis.code = code;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLPrograms( renderer, extensions, capabilities ) {\n\n\tvar programs = [];\n\n\tvar shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'phong',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow'\n\t};\n\n\tvar parameterNames = [\n\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\", \"dithering\"\n\t];\n\n\n\tfunction allocateBones( object ) {\n\n\t\tvar skeleton = object.skeleton;\n\t\tvar bones = skeleton.bones;\n\n\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\treturn 1024;\n\n\t\t} else {\n\n\t\t\t// default for when object is not specified\n\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t//\n\t\t\t// - leave some extra space for other uniforms\n\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t// (up to 54 should be safe)\n\n\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\tvar maxBones = Math.min( nVertexMatrices, bones.length );\n\n\t\t\tif ( maxBones < bones.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\treturn maxBones;\n\n\t\t}\n\n\t}\n\n\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\tvar encoding;\n\n\t\tif ( ! map ) {\n\n\t\t\tencoding = LinearEncoding;\n\n\t\t} else if ( map.isTexture ) {\n\n\t\t\tencoding = map.encoding;\n\n\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\tencoding = map.texture.encoding;\n\n\t\t}\n\n\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\tencoding = GammaEncoding;\n\n\t\t}\n\n\t\treturn encoding;\n\n\t}\n\n\tthis.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tvar maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0;\n\t\tvar precision = capabilities.precision;\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar currentRenderTarget = renderer.getRenderTarget();\n\n\t\tvar parameters = {\n\n\t\t\tshaderID: shaderID,\n\n\t\t\tprecision: precision,\n\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\tmap: !! material.map,\n\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\tenvMap: !! material.envMap,\n\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\tlightMap: !! material.lightMap,\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexColors: material.vertexColors,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog,\n\t\t\tfogExp: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\tskinning: material.skinning && maxBones > 0,\n\t\t\tmaxBones: maxBones,\n\t\t\tuseVertexTexture: capabilities.floatVertexTextures,\n\n\t\t\tmorphTargets: material.morphTargets,\n\t\t\tmorphNormals: material.morphNormals,\n\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\talphaTest: material.alphaTest,\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t};\n\n\t\treturn parameters;\n\n\t};\n\n\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\tvar array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( material.fragmentShader );\n\t\t\tarray.push( material.vertexShader );\n\n\t\t}\n\n\t\tif ( material.defines !== undefined ) {\n\n\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t}\n\n\t\tarray.push( material.onBeforeCompile.toString() );\n\n\t\tarray.push( renderer.gammaOutput );\n\n\t\treturn array.join();\n\n\t};\n\n\tthis.acquireProgram = function ( material, shader, parameters, code ) {\n\n\t\tvar program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tvar programInfo = programs[ p ];\n\n\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\tprogram = programInfo;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, extensions, code, material, shader, parameters );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t};\n\n\tthis.releaseProgram = function ( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tvar i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t};\n\n\t// Exposed for resource monitoring & error feedback via renderer.info:\n\tthis.programs = programs;\n\n}\n\n/**\n * @author fordacious / fordacious.github.io\n */\n\nfunction WebGLProperties() {\n\n\tvar properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tvar map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.program && b.program && a.program !== b.program ) {\n\n\t\treturn a.program.id - b.program.id;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction WebGLRenderList() {\n\n\tvar renderItems = [];\n\tvar renderItemsIndex = 0;\n\n\tvar opaque = [];\n\tvar transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction push( object, geometry, material, z, group ) {\n\n\t\tvar renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tprogram: material.program,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.program = material.program;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\t( material.transparent === true ? transparent : opaque ).push( renderItem );\n\n\t\trenderItemsIndex ++;\n\n\t}\n\n\tfunction sort() {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( painterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( reversePainterSortStable );\n\n\t}\n\n\treturn {\n\t\topaque: opaque,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tvar lists = {};\n\n\tfunction get( scene, camera ) {\n\n\t\tvar hash = scene.id + ',' + camera.id;\n\t\tvar list = lists[ hash ];\n\n\t\tif ( list === undefined ) {\n\n\t\t\t// console.log( 'THREE.WebGLRenderLists:', hash );\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists[ hash ] = list;\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = {};\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction UniformsCache() {\n\n\tvar lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tvar uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nvar count = 0;\n\nfunction WebGLLights() {\n\n\tvar cache = new UniformsCache();\n\n\tvar state = {\n\n\t\tid: count ++,\n\n\t\thash: '',\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tdirectional: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\tpoint: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tvar vector3 = new Vector3();\n\tvar matrix4 = new Matrix4();\n\tvar matrix42 = new Matrix4();\n\n\tfunction setup( lights, shadows, camera ) {\n\n\t\tvar r = 0, g = 0, b = 0;\n\n\t\tvar directionalLength = 0;\n\t\tvar pointLength = 0;\n\t\tvar spotLength = 0;\n\t\tvar rectAreaLength = 0;\n\t\tvar hemiLength = 0;\n\n\t\tvar viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tvar light = lights[ i ];\n\n\t\t\tvar color = light.color;\n\t\t\tvar intensity = light.intensity;\n\t\t\tvar distance = light.distance;\n\n\t\t\tvar shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tuniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tuniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t}\n\n\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tstate.directional.length = directionalLength;\n\t\tstate.spot.length = spotLength;\n\t\tstate.rectArea.length = rectAreaLength;\n\t\tstate.point.length = pointLength;\n\t\tstate.hemi.length = hemiLength;\n\n\t\tstate.hash = state.id + ',' + directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + shadows.length;\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tstate: state\n\t};\n\n}\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction WebGLRenderState() {\n\n\tvar lights = new WebGLLights();\n\n\tvar lightsArray = [];\n\tvar shadowsArray = [];\n\tvar spritesArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\t\tspritesArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction pushSprite( shadowLight ) {\n\n\t\tspritesArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( camera ) {\n\n\t\tlights.setup( lightsArray, shadowsArray, camera );\n\n\t}\n\n\tvar state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\t\tspritesArray: spritesArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow,\n\t\tpushSprite: pushSprite\n\t};\n\n}\n\nfunction WebGLRenderStates() {\n\n\tvar renderStates = {};\n\n\tfunction get( scene, camera ) {\n\n\t\tvar hash = scene.id + ',' + camera.id;\n\n\t\tvar renderState = renderStates[ hash ];\n\n\t\tif ( renderState === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState();\n\t\t\trenderStates[ hash ] = renderState;\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = {};\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author bhouston / https://clara.io\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n *\n * opacity: <float>,\n *\n * map: new THREE.Texture( <Image> ),\n *\n * alphaMap: new THREE.Texture( <Image> ),\n *\n * displacementMap: new THREE.Texture( <Image> ),\n * displacementScale: <float>,\n * displacementBias: <float>,\n *\n * wireframe: <boolean>,\n * wireframeLinewidth: <float>\n * }\n */\n\nfunction MeshDepthMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshDepthMaterial';\n\n\tthis.depthPacking = BasicDepthPacking;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshDepthMaterial.prototype = Object.create( Material.prototype );\nMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\nMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\nMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.depthPacking = source.depthPacking;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\treturn this;\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n *\n * referencePosition: <float>,\n * nearDistance: <float>,\n * farDistance: <float>,\n *\n * skinning: <bool>,\n * morphTargets: <bool>,\n *\n * map: new THREE.Texture( <Image> ),\n *\n * alphaMap: new THREE.Texture( <Image> ),\n *\n * displacementMap: new THREE.Texture( <Image> ),\n * displacementScale: <float>,\n * displacementBias: <float>\n *\n * }\n */\n\nfunction MeshDistanceMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshDistanceMaterial';\n\n\tthis.referencePosition = new Vector3();\n\tthis.nearDistance = 1;\n\tthis.farDistance = 1000;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshDistanceMaterial.prototype = Object.create( Material.prototype );\nMeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial;\n\nMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\nMeshDistanceMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.referencePosition.copy( source.referencePosition );\n\tthis.nearDistance = source.nearDistance;\n\tthis.farDistance = source.farDistance;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLShadowMap( _renderer, _objects, maxTextureSize ) {\n\n\tvar _frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\tvar shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tvar cubeDirections = [\n\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t];\n\n\tvar cubeUps = [\n\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t];\n\n\tvar cube2DViewPorts = [\n\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\tnew Vector4(), new Vector4(), new Vector4()\n\t];\n\n\t// init\n\n\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\tvar depthMaterial = new MeshDepthMaterial( {\n\n\t\t\tdepthPacking: RGBADepthPacking,\n\n\t\t\tmorphTargets: useMorphing,\n\t\t\tskinning: useSkinning\n\n\t\t} );\n\n\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t//\n\n\t\tvar distanceMaterial = new MeshDistanceMaterial( {\n\n\t\t\tmorphTargets: useMorphing,\n\t\t\tskinning: useSkinning\n\n\t\t} );\n\n\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t}\n\n\t//\n\n\tvar scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\t// TODO Clean up (needed in case of contextlost)\n\t\tvar _gl = _renderer.context;\n\t\tvar _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.disable( _gl.BLEND );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tvar faceCount;\n\n\t\tfor ( var i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tvar light = lights[ i ];\n\t\t\tvar shadow = light.shadow;\n\t\t\tvar isPointLight = light && light.isPointLight;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t// following orientation:\n\t\t\t\t//\n\t\t\t\t// xzXZ\n\t\t\t\t// y Y\n\t\t\t\t//\n\t\t\t\t// X - Positive x direction\n\t\t\t\t// x - Negative x direction\n\t\t\t\t// Y - Positive y direction\n\t\t\t\t// y - Negative y direction\n\t\t\t\t// Z - Positive z direction\n\t\t\t\t// z - Negative z direction\n\n\t\t\t\t// positive X\n\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// negative X\n\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// positive Z\n\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// negative Z\n\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// positive Y\n\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t// negative Y\n\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + \".shadowMap\";\n\n\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\tshadow.update( light );\n\n\t\t\t}\n\n\t\t\tvar shadowMap = shadow.map;\n\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tfaceCount = 6;\n\n\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t// equal to inverse of the light's position\n\n\t\t\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t\t} else {\n\n\t\t\t\tfaceCount = 1;\n\n\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\t\t\t\tshadowCamera.updateMatrixWorld();\n\n\t\t\t\t// compute shadow matrix\n\n\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t);\n\n\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t_renderer.clear();\n\n\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t// run a single pass if not\n\n\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\n\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t}\n\n\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\trenderObject( scene, camera, shadowCamera, isPointLight );\n\n\t\t\t}\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t};\n\n\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) {\n\n\t\tvar geometry = object.geometry;\n\n\t\tvar result = null;\n\n\t\tvar materialVariants = _depthMaterials;\n\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\tif ( isPointLight ) {\n\n\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t}\n\n\t\tif ( ! customMaterial ) {\n\n\t\t\tvar useMorphing = false;\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isSkinnedMesh && material.skinning === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object );\n\n\t\t\t}\n\n\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\tvar variantIndex = 0;\n\n\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t} else {\n\n\t\t\tresult = customMaterial;\n\n\t\t}\n\n\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\tmaterial.clipShadows === true &&\n\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tresult.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( isPointLight && result.isMeshDistanceMaterial ) {\n\n\t\t\tresult.referencePosition.copy( lightPositionWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, isPointLight ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tvar visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\tvar groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar children = object.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, isPointLight );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.needsUpdate = true;\n\n}\n\nCanvasTexture.prototype = Object.create( Texture.prototype );\nCanvasTexture.prototype.constructor = CanvasTexture;\nCanvasTexture.prototype.isCanvasTexture = true;\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) {\n\n\tvar vertexBuffer, elementBuffer;\n\tvar program, attributes, uniforms;\n\n\tvar texture;\n\n\t// decompose matrixWorld\n\n\tvar spritePosition = new Vector3();\n\tvar spriteRotation = new Quaternion();\n\tvar spriteScale = new Vector3();\n\n\tfunction init() {\n\n\t\tvar vertices = new Float32Array( [\n\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t- 0.5, 0.5, 0, 1\n\t\t] );\n\n\t\tvar faces = new Uint16Array( [\n\t\t\t0, 1, 2,\n\t\t\t0, 2, 3\n\t\t] );\n\n\t\tvertexBuffer = gl.createBuffer();\n\t\telementBuffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\tprogram = createProgram();\n\n\t\tattributes = {\n\t\t\tposition: gl.getAttribLocation( program, 'position' ),\n\t\t\tuv: gl.getAttribLocation( program, 'uv' )\n\t\t};\n\n\t\tuniforms = {\n\t\t\tuvOffset: gl.getUniformLocation( program, 'uvOffset' ),\n\t\t\tuvScale: gl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\trotation: gl.getUniformLocation( program, 'rotation' ),\n\t\t\tcenter: gl.getUniformLocation( program, 'center' ),\n\t\t\tscale: gl.getUniformLocation( program, 'scale' ),\n\n\t\t\tcolor: gl.getUniformLocation( program, 'color' ),\n\t\t\tmap: gl.getUniformLocation( program, 'map' ),\n\t\t\topacity: gl.getUniformLocation( program, 'opacity' ),\n\n\t\t\tmodelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\tprojectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\tfogType: gl.getUniformLocation( program, 'fogType' ),\n\t\t\tfogDensity: gl.getUniformLocation( program, 'fogDensity' ),\n\t\t\tfogNear: gl.getUniformLocation( program, 'fogNear' ),\n\t\t\tfogFar: gl.getUniformLocation( program, 'fogFar' ),\n\t\t\tfogColor: gl.getUniformLocation( program, 'fogColor' ),\n\t\t\tfogDepth: gl.getUniformLocation( program, 'fogDepth' ),\n\n\t\t\talphaTest: gl.getUniformLocation( program, 'alphaTest' )\n\t\t};\n\n\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tcanvas.width = 8;\n\t\tcanvas.height = 8;\n\n\t\tvar context = canvas.getContext( '2d' );\n\t\tcontext.fillStyle = 'white';\n\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\ttexture = new CanvasTexture( canvas );\n\n\t}\n\n\tthis.render = function ( sprites, scene, camera ) {\n\n\t\tif ( sprites.length === 0 ) return;\n\n\t\t// setup gl\n\n\t\tif ( program === undefined ) {\n\n\t\t\tinit();\n\n\t\t}\n\n\t\tstate.useProgram( program );\n\n\t\tstate.initAttributes();\n\t\tstate.enableAttribute( attributes.position );\n\t\tstate.enableAttribute( attributes.uv );\n\t\tstate.disableUnusedAttributes();\n\n\t\tstate.disable( gl.CULL_FACE );\n\t\tstate.enable( gl.BLEND );\n\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\tvar oldFogType = 0;\n\t\tvar sceneFogType = 0;\n\t\tvar fog = scene.fog;\n\n\t\tif ( fog ) {\n\n\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\toldFogType = 1;\n\t\t\t\tsceneFogType = 1;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\toldFogType = 2;\n\t\t\t\tsceneFogType = 2;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\toldFogType = 0;\n\t\t\tsceneFogType = 0;\n\n\t\t}\n\n\n\t\t// update positions and sort\n\n\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\tvar sprite = sprites[ i ];\n\n\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t}\n\n\t\tsprites.sort( painterSortStable );\n\n\t\t// render all sprites\n\n\t\tvar scale = [];\n\t\tvar center = [];\n\n\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\tvar sprite = sprites[ i ];\n\t\t\tvar material = sprite.material;\n\n\t\t\tif ( material.visible === false ) continue;\n\n\t\t\tsprite.onBeforeRender( renderer, scene, camera, undefined, material, undefined );\n\n\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\tcenter[ 0 ] = sprite.center.x - 0.5;\n\t\t\tcenter[ 1 ] = sprite.center.y - 0.5;\n\n\t\t\tvar fogType = 0;\n\n\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\tfogType = sceneFogType;\n\n\t\t\t}\n\n\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\toldFogType = fogType;\n\n\t\t\t}\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t}\n\n\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\tgl.uniform2fv( uniforms.center, center );\n\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\t\t\tstate.buffers.depth.setTest( material.depthTest );\n\t\t\tstate.buffers.depth.setMask( material.depthWrite );\n\t\t\tstate.buffers.color.setMask( material.colorWrite );\n\n\t\t\ttextures.setTexture2D( material.map || texture, 0 );\n\n\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\tsprite.onAfterRender( renderer, scene, camera, undefined, material, undefined );\n\n\t\t}\n\n\t\t// restore gl\n\n\t\tstate.enable( gl.CULL_FACE );\n\n\t\tstate.reset();\n\n\t};\n\n\tfunction createProgram() {\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t'precision ' + capabilities.precision + ' float;',\n\n\t\t\t'#define SHADER_NAME ' + 'SpriteMaterial',\n\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform float rotation;',\n\t\t\t'uniform vec2 center;',\n\t\t\t'uniform vec2 scale;',\n\t\t\t'uniform vec2 uvOffset;',\n\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t'attribute vec2 position;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'varying vec2 vUV;',\n\t\t\t'varying float fogDepth;',\n\n\t\t\t'void main() {',\n\n\t\t\t'\tvUV = uvOffset + uv * uvScale;',\n\n\t\t\t'\tvec2 alignedPosition = ( position - center ) * scale;',\n\n\t\t\t'\tvec2 rotatedPosition;',\n\t\t\t'\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t'\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t'\tvec4 mvPosition;',\n\n\t\t\t'\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t'\tmvPosition.xy += rotatedPosition;',\n\n\t\t\t'\tgl_Position = projectionMatrix * mvPosition;',\n\n\t\t\t'\tfogDepth = - mvPosition.z;',\n\n\t\t\t'}'\n\n\t\t].join( '\\n' ) );\n\n\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t'precision ' + capabilities.precision + ' float;',\n\n\t\t\t'#define SHADER_NAME ' + 'SpriteMaterial',\n\n\t\t\t'uniform vec3 color;',\n\t\t\t'uniform sampler2D map;',\n\t\t\t'uniform float opacity;',\n\n\t\t\t'uniform int fogType;',\n\t\t\t'uniform vec3 fogColor;',\n\t\t\t'uniform float fogDensity;',\n\t\t\t'uniform float fogNear;',\n\t\t\t'uniform float fogFar;',\n\t\t\t'uniform float alphaTest;',\n\n\t\t\t'varying vec2 vUV;',\n\t\t\t'varying float fogDepth;',\n\n\t\t\t'void main() {',\n\n\t\t\t'\tvec4 texture = texture2D( map, vUV );',\n\n\t\t\t'\tgl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t'\tif ( gl_FragColor.a < alphaTest ) discard;',\n\n\t\t\t'\tif ( fogType > 0 ) {',\n\n\t\t\t'\t\tfloat fogFactor = 0.0;',\n\n\t\t\t'\t\tif ( fogType == 1 ) {',\n\n\t\t\t'\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );',\n\n\t\t\t'\t\t} else {',\n\n\t\t\t'\t\t\tconst float LOG2 = 1.442695;',\n\t\t\t'\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );',\n\t\t\t'\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t'\t\t}',\n\n\t\t\t'\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );',\n\n\t\t\t'\t}',\n\n\t\t\t'}'\n\n\t\t].join( '\\n' ) );\n\n\t\tgl.compileShader( vertexShader );\n\t\tgl.compileShader( fragmentShader );\n\n\t\tgl.attachShader( program, vertexShader );\n\t\tgl.attachShader( program, fragmentShader );\n\n\t\tgl.linkProgram( program );\n\n\t\treturn program;\n\n\t}\n\n\tfunction painterSortStable( a, b ) {\n\n\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t} else if ( a.z !== b.z ) {\n\n\t\t\treturn b.z - a.z;\n\n\t\t} else {\n\n\t\t\treturn b.id - a.id;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLState( gl, extensions, utils ) {\n\n\tfunction ColorBuffer() {\n\n\t\tvar locked = false;\n\n\t\tvar color = new Vector4();\n\t\tvar currentColorMask = null;\n\t\tvar currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tvar locked = false;\n\n\t\tvar currentDepthMask = null;\n\t\tvar currentDepthFunc = null;\n\t\tvar currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tvar locked = false;\n\n\t\tvar currentStencilMask = null;\n\t\tvar currentStencilFunc = null;\n\t\tvar currentStencilRef = null;\n\t\tvar currentStencilFuncMask = null;\n\t\tvar currentStencilFail = null;\n\t\tvar currentStencilZFail = null;\n\t\tvar currentStencilZPass = null;\n\t\tvar currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar colorBuffer = new ColorBuffer();\n\tvar depthBuffer = new DepthBuffer();\n\tvar stencilBuffer = new StencilBuffer();\n\n\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\tvar capabilities = {};\n\n\tvar compressedTextureFormats = null;\n\n\tvar currentProgram = null;\n\n\tvar currentBlending = null;\n\tvar currentBlendEquation = null;\n\tvar currentBlendSrc = null;\n\tvar currentBlendDst = null;\n\tvar currentBlendEquationAlpha = null;\n\tvar currentBlendSrcAlpha = null;\n\tvar currentBlendDstAlpha = null;\n\tvar currentPremultipledAlpha = false;\n\n\tvar currentFlipSided = null;\n\tvar currentCullFace = null;\n\n\tvar currentLineWidth = null;\n\n\tvar currentPolygonOffsetFactor = null;\n\tvar currentPolygonOffsetUnits = null;\n\n\tvar maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tvar lineWidthAvailable = false;\n\tvar version = 0;\n\tvar glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL\\ ([0-9])/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL\\ ES\\ ([0-9])/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tvar currentTextureSlot = null;\n\tvar currentBoundTextures = {};\n\n\tvar currentScissor = new Vector4();\n\tvar currentViewport = new Vector4();\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tvar emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tenable( gl.BLEND );\n\tsetBlending( NormalBlending );\n\n\t//\n\n\tfunction initAttributes() {\n\n\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction enable( id ) {\n\n\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tcapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tcapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction getCompressedTextureFormats() {\n\n\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\tcompressedTextureFormats = [];\n\n\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ||\n\t\t\t extensions.get( 'WEBGL_compressed_texture_astc' ) ) {\n\n\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn compressedTextureFormats;\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending !== NoBlending ) {\n\n\t\t\tenable( gl.BLEND );\n\n\t\t} else {\n\n\t\t\tdisable( gl.BLEND );\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\tcase AdditiveBlending:\n\n\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase SubtractiveBlending:\n\n\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MultiplyBlending:\n\n\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcurrentBlendEquation = null;\n\t\t\tcurrentBlendSrc = null;\n\t\t\tcurrentBlendDst = null;\n\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t} else {\n\n\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\tgl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) );\n\n\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\tgl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) );\n\n\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tvar flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\tmaterial.transparent === true\n\t\t\t? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t: setBlending( NoBlending );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcapabilities = {};\n\n\t\tcompressedTextureFormats = null;\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlending = null;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\tenable: enable,\n\t\tdisable: disable,\n\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); /* global WebGL2RenderingContext */\n\tvar _videoTextures = {};\n\tvar _canvas;\n\n\t//\n\n\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tif ( 'data' in image ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t// premultiplied alpha.\n\n\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\treturn canvas;\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo( image ) {\n\n\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction makePowerOfTwo( image ) {\n\n\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof ImageBitmap ) {\n\n\t\t\tif ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\n\t\t\t_canvas.width = _Math.floorPowerOfTwo( image.width );\n\t\t\t_canvas.height = _Math.floorPowerOfTwo( image.height );\n\n\t\t\tvar context = _canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, _canvas.width, _canvas.height );\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image );\n\n\t\t\treturn _canvas;\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) {\n\n\t\treturn texture.generateMipmaps && isPowerOfTwo &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target, texture, width, height ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\t// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11\n\t\ttextureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E;\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\treturn _gl.NEAREST;\n\n\t\t}\n\n\t\treturn _gl.LINEAR;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tvar texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\tdelete _videoTextures[ texture.id ];\n\n\t\t}\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tvar renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t// cube texture\n\n\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t} else {\n\n\t\t\t// 2D texture\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t}\n\n\t\t// remove all webgl properties\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\tif ( ! renderTarget ) return;\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget.texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tvar image = texture.image;\n\n\t\t\tif ( image === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( texture.image.length === 6 ) {\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\tvar cubeImage = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = utils.convert( texture.format ),\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) {\n\n\t\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t} else {\n\n\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t}\n\n\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\tvar extension;\n\n\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, utils.convert( texture.wrapS ) );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, utils.convert( texture.wrapT ) );\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, utils.convert( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, utils.convert( texture.minFilter ) );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );\n\n\t\t\t}\n\n\t\t}\n\n\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\tif ( extension ) {\n\n\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\timage = makePowerOfTwo( image );\n\n\t\t}\n\n\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = utils.convert( texture.format ),\n\t\t\tglType = utils.convert( texture.type );\n\n\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t// populate depth texture with dummy data\n\n\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\tif ( ! _isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' );\n\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t\tif ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t}\n\n\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t} else {\n\n\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) {\n\n\t\t\tgenerateMipmap( _gl.TEXTURE_2D, texture, image.width, image.height );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\tvar glFormat = utils.convert( renderTarget.texture.format );\n\t\tvar glType = utils.convert( renderTarget.texture.type );\n\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\tinfo.memory.textures ++;\n\n\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t} else {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_2D, renderTarget.texture, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tvar texture = renderTarget.texture;\n\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) {\n\n\t\t\tvar target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\tgenerateMipmap( target, texture, renderTarget.width, renderTarget.height );\n\t\t\tstate.bindTexture( target, null );\n\n\t\t}\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tvar id = texture.id;\n\t\tvar frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures[ id ] !== frame ) {\n\n\t\t\t_videoTextures[ id ] = frame;\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n}\n\n/**\n * @author thespite / http://www.twitter.com/thespite\n */\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p ) {\n\n\t\tvar extension;\n\n\t\tif ( p === RepeatWrapping ) return gl.REPEAT;\n\t\tif ( p === ClampToEdgeWrapping ) return gl.CLAMP_TO_EDGE;\n\t\tif ( p === MirroredRepeatWrapping ) return gl.MIRRORED_REPEAT;\n\n\t\tif ( p === NearestFilter ) return gl.NEAREST;\n\t\tif ( p === NearestMipMapNearestFilter ) return gl.NEAREST_MIPMAP_NEAREST;\n\t\tif ( p === NearestMipMapLinearFilter ) return gl.NEAREST_MIPMAP_LINEAR;\n\n\t\tif ( p === LinearFilter ) return gl.LINEAR;\n\t\tif ( p === LinearMipMapNearestFilter ) return gl.LINEAR_MIPMAP_NEAREST;\n\t\tif ( p === LinearMipMapLinearFilter ) return gl.LINEAR_MIPMAP_LINEAR;\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedShort565Type ) return gl.UNSIGNED_SHORT_5_6_5;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === LuminanceFormat ) return gl.LUMINANCE;\n\t\tif ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\tif ( p === AddEquation ) return gl.FUNC_ADD;\n\t\tif ( p === SubtractEquation ) return gl.FUNC_SUBTRACT;\n\t\tif ( p === ReverseSubtractEquation ) return gl.FUNC_REVERSE_SUBTRACT;\n\n\t\tif ( p === ZeroFactor ) return gl.ZERO;\n\t\tif ( p === OneFactor ) return gl.ONE;\n\t\tif ( p === SrcColorFactor ) return gl.SRC_COLOR;\n\t\tif ( p === OneMinusSrcColorFactor ) return gl.ONE_MINUS_SRC_COLOR;\n\t\tif ( p === SrcAlphaFactor ) return gl.SRC_ALPHA;\n\t\tif ( p === OneMinusSrcAlphaFactor ) return gl.ONE_MINUS_SRC_ALPHA;\n\t\tif ( p === DstAlphaFactor ) return gl.DST_ALPHA;\n\t\tif ( p === OneMinusDstAlphaFactor ) return gl.ONE_MINUS_DST_ALPHA;\n\n\t\tif ( p === DstColorFactor ) return gl.DST_COLOR;\n\t\tif ( p === OneMinusDstColorFactor ) return gl.ONE_MINUS_DST_COLOR;\n\t\tif ( p === SrcAlphaSaturateFactor ) return gl.SRC_ALPHA_SATURATE;\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t}\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author greggman / http://games.greggman.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author tschw\n */\n\nfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\tCamera.call( this );\n\n\tthis.type = 'PerspectiveCamera';\n\n\tthis.fov = fov !== undefined ? fov : 50;\n\tthis.zoom = 1;\n\n\tthis.near = near !== undefined ? near : 0.1;\n\tthis.far = far !== undefined ? far : 2000;\n\tthis.focus = 10;\n\n\tthis.aspect = aspect !== undefined ? aspect : 1;\n\tthis.view = null;\n\n\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\tthis.updateProjectionMatrix();\n\n}\n\nPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\tconstructor: PerspectiveCamera,\n\n\tisPerspectiveCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t},\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength: function ( focalLength ) {\n\n\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength: function () {\n\n\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t},\n\n\tgetEffectiveFOV: function () {\n\n\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t},\n\n\tgetFilmWidth: function () {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t},\n\n\tgetFilmHeight: function () {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t},\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * var w = 1920;\n\t * var h = 1080;\n\t * var fullWidth = w * 3;\n\t * var fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tclearViewOffset: function () {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tupdateProjectionMatrix: function () {\n\n\t\tvar near = this.near,\n\t\t\ttop = near * Math.tan(\n\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\theight = 2 * top,\n\t\t\twidth = this.aspect * height,\n\t\t\tleft = - 0.5 * width,\n\t\t\tview = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tvar skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction ArrayCamera( array ) {\n\n\tPerspectiveCamera.call( this );\n\n\tthis.cameras = array || [];\n\n}\n\nArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), {\n\n\tconstructor: ArrayCamera,\n\n\tisArrayCamera: true\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebVRManager( renderer ) {\n\n\tvar scope = this;\n\n\tvar device = null;\n\tvar frameData = null;\n\n\tvar poseTarget = null;\n\n\tvar standingMatrix = new Matrix4();\n\tvar standingMatrixInverse = new Matrix4();\n\n\tif ( typeof window !== 'undefined' && 'VRFrameData' in window ) {\n\n\t\tframeData = new window.VRFrameData();\n\t\twindow.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );\n\n\t}\n\n\tvar matrixWorldInverse = new Matrix4();\n\tvar tempQuaternion = new Quaternion();\n\tvar tempPosition = new Vector3();\n\n\tvar cameraL = new PerspectiveCamera();\n\tcameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 );\n\tcameraL.layers.enable( 1 );\n\n\tvar cameraR = new PerspectiveCamera();\n\tcameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 );\n\tcameraR.layers.enable( 2 );\n\n\tvar cameraVR = new ArrayCamera( [ cameraL, cameraR ] );\n\tcameraVR.layers.enable( 1 );\n\tcameraVR.layers.enable( 2 );\n\n\t//\n\n\tfunction isPresenting() {\n\n\t\treturn device !== null && device.isPresenting === true;\n\n\t}\n\n\tvar currentSize, currentPixelRatio;\n\n\tfunction onVRDisplayPresentChange() {\n\n\t\tif ( isPresenting() ) {\n\n\t\t\tvar eyeParameters = device.getEyeParameters( 'left' );\n\t\t\tvar renderWidth = eyeParameters.renderWidth;\n\t\t\tvar renderHeight = eyeParameters.renderHeight;\n\n\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\tcurrentSize = renderer.getSize();\n\n\t\t\trenderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 );\n\n\t\t\tanimation.start();\n\n\t\t} else if ( scope.enabled ) {\n\n\t\t\trenderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio );\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.enabled = false;\n\tthis.userHeight = 1.6;\n\n\tthis.getDevice = function () {\n\n\t\treturn device;\n\n\t};\n\n\tthis.setDevice = function ( value ) {\n\n\t\tif ( value !== undefined ) device = value;\n\n\t\tanimation.setContext( value );\n\n\t};\n\n\tthis.setPoseTarget = function ( object ) {\n\n\t\tif ( object !== undefined ) poseTarget = object;\n\n\t};\n\n\tthis.getCamera = function ( camera ) {\n\n\t\tif ( device === null ) return camera;\n\n\t\tdevice.depthNear = camera.near;\n\t\tdevice.depthFar = camera.far;\n\n\t\tdevice.getFrameData( frameData );\n\n\t\t//\n\n\t\tvar stageParameters = device.stageParameters;\n\n\t\tif ( stageParameters ) {\n\n\t\t\tstandingMatrix.fromArray( stageParameters.sittingToStandingTransform );\n\n\t\t} else {\n\n\t\t\tstandingMatrix.makeTranslation( 0, scope.userHeight, 0 );\n\n\t\t}\n\n\n\t\tvar pose = frameData.pose;\n\t\tvar poseObject = poseTarget !== null ? poseTarget : camera;\n\n\t\t// We want to manipulate poseObject by its position and quaternion components since users may rely on them.\n\t\tposeObject.matrix.copy( standingMatrix );\n\t\tposeObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale );\n\n\t\tif ( pose.orientation !== null ) {\n\n\t\t\ttempQuaternion.fromArray( pose.orientation );\n\t\t\tposeObject.quaternion.multiply( tempQuaternion );\n\n\t\t}\n\n\t\tif ( pose.position !== null ) {\n\n\t\t\ttempQuaternion.setFromRotationMatrix( standingMatrix );\n\t\t\ttempPosition.fromArray( pose.position );\n\t\t\ttempPosition.applyQuaternion( tempQuaternion );\n\t\t\tposeObject.position.add( tempPosition );\n\n\t\t}\n\n\t\tposeObject.updateMatrixWorld();\n\n\t\tif ( device.isPresenting === false ) return camera;\n\n\t\t//\n\n\t\tcameraL.near = camera.near;\n\t\tcameraR.near = camera.near;\n\n\t\tcameraL.far = camera.far;\n\t\tcameraR.far = camera.far;\n\n\t\tcameraVR.matrixWorld.copy( camera.matrixWorld );\n\t\tcameraVR.matrixWorldInverse.copy( camera.matrixWorldInverse );\n\n\t\tcameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );\n\t\tcameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );\n\n\t\t// TODO (mrdoob) Double check this code\n\n\t\tstandingMatrixInverse.getInverse( standingMatrix );\n\n\t\tcameraL.matrixWorldInverse.multiply( standingMatrixInverse );\n\t\tcameraR.matrixWorldInverse.multiply( standingMatrixInverse );\n\n\t\tvar parent = poseObject.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\n\t\t\tcameraL.matrixWorldInverse.multiply( matrixWorldInverse );\n\t\t\tcameraR.matrixWorldInverse.multiply( matrixWorldInverse );\n\n\t\t}\n\n\t\t// envMap and Mirror needs camera.matrixWorld\n\n\t\tcameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse );\n\t\tcameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse );\n\n\t\tcameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix );\n\t\tcameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix );\n\n\t\t// HACK (mrdoob)\n\t\t// https://github.com/w3c/webvr/issues/203\n\n\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t//\n\n\t\tvar layers = device.getLayers();\n\n\t\tif ( layers.length ) {\n\n\t\t\tvar layer = layers[ 0 ];\n\n\t\t\tif ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) {\n\n\t\t\t\tcameraL.bounds.fromArray( layer.leftBounds );\n\n\t\t\t}\n\n\t\t\tif ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) {\n\n\t\t\t\tcameraR.bounds.fromArray( layer.rightBounds );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn cameraVR;\n\n\t};\n\n\tthis.getStandingMatrix = function () {\n\n\t\treturn standingMatrix;\n\n\t};\n\n\tthis.isPresenting = isPresenting;\n\n\t// Animation Loop\n\n\tvar animation = new WebGLAnimation();\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tanimation.setAnimationLoop( callback );\n\n\t};\n\n\tthis.submitFrame = function () {\n\n\t\tif ( isPresenting() ) device.submitFrame();\n\n\t};\n\n\tthis.dispose = function () {\n\n\t\tif ( typeof window !== 'undefined' ) {\n\n\t\t\twindow.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange );\n\n\t\t}\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebXRManager( renderer ) {\n\n\tvar gl = renderer.context;\n\n\tvar device = null;\n\tvar session = null;\n\n\tvar frameOfRef = null;\n\n\tvar pose = null;\n\n\tfunction isPresenting() {\n\n\t\treturn session !== null && frameOfRef !== null;\n\n\t}\n\n\t//\n\n\tvar cameraL = new PerspectiveCamera();\n\tcameraL.layers.enable( 1 );\n\tcameraL.viewport = new Vector4();\n\n\tvar cameraR = new PerspectiveCamera();\n\tcameraR.layers.enable( 2 );\n\tcameraR.viewport = new Vector4();\n\n\tvar cameraVR = new ArrayCamera( [ cameraL, cameraR ] );\n\tcameraVR.layers.enable( 1 );\n\tcameraVR.layers.enable( 2 );\n\n\t//\n\n\tthis.enabled = false;\n\n\tthis.getDevice = function () {\n\n\t\treturn device;\n\n\t};\n\n\tthis.setDevice = function ( value ) {\n\n\t\tif ( value !== undefined ) device = value;\n\n\t\tgl.setCompatibleXRDevice( value );\n\n\t};\n\n\t//\n\n\tthis.setSession = function ( value, options ) {\n\n\t\tsession = value;\n\n\t\tif ( session !== null ) {\n\n\t\t\tsession.addEventListener( 'end', function () {\n\n\t\t\t\trenderer.setFramebuffer( null );\n\t\t\t\tanimation.stop();\n\n\t\t\t} );\n\n\t\t\tsession.baseLayer = new XRWebGLLayer( session, gl );\n\t\t\tsession.requestFrameOfReference( options.frameOfReferenceType ).then( function ( value ) {\n\n\t\t\t\tframeOfRef = value;\n\n\t\t\t\trenderer.setFramebuffer( session.baseLayer.framebuffer );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t} );\n\n\t\t}\n\n\t};\n\n\tfunction updateCamera( camera, parent ) {\n\n\t\tif ( parent === null ) {\n\n\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t} else {\n\n\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t}\n\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t}\n\n\tthis.getCamera = function ( camera ) {\n\n\t\tif ( isPresenting() ) {\n\n\t\t\tvar parent = camera.parent;\n\t\t\tvar cameras = cameraVR.cameras;\n\n\t\t\t// apply camera.parent to cameraVR\n\n\t\t\tupdateCamera( cameraVR, parent );\n\n\t\t\tfor ( var i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update camera and its children\n\n\t\t\tcamera.matrixWorld.copy( cameraVR.matrixWorld );\n\n\t\t\tvar children = camera.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t\treturn cameraVR;\n\n\t\t}\n\n\t\treturn camera;\n\n\t};\n\n\tthis.isPresenting = isPresenting;\n\n\t// Animation Loop\n\n\tvar onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tpose = frame.getDevicePose( frameOfRef );\n\n\t\tvar layer = session.baseLayer;\n\t\tvar views = frame.views;\n\n\t\tfor ( var i = 0; i < views.length; i ++ ) {\n\n\t\t\tvar view = views[ i ];\n\t\t\tvar viewport = layer.getViewport( view );\n\t\t\tvar viewMatrix = pose.getViewMatrix( view );\n\n\t\t\tvar camera = cameraVR.cameras[ i ];\n\t\t\tcamera.matrix.fromArray( viewMatrix ).getInverse( camera.matrix );\n\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t// HACK (mrdoob)\n\t\t\t\t// https://github.com/w3c/webvr/issues/203\n\n\t\t\t\tcameraVR.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback();\n\n\t}\n\n\tvar animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\n\t};\n\n\t// DEPRECATED\n\n\tthis.getStandingMatrix = function () {\n\n\t\tconsole.warn( 'THREE.WebXRManager: getStandingMatrix() is no longer needed.' );\n\t\treturn new THREE.Matrix4();\n\n\t};\n\n\tthis.submitFrame = function () {};\n\n}\n\n/**\n * @author supereggbert / http://www.paulbrunt.co.uk/\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author szimek / https://github.com/szimek/\n * @author tschw\n */\n\nfunction WebGLRenderer( parameters ) {\n\n\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\tparameters = parameters || {};\n\n\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';\n\n\tvar currentRenderList = null;\n\tvar currentRenderState = null;\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\tthis.context = null;\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\tthis.gammaInput = false;\n\tthis.gammaOutput = false;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = LinearToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\tthis.toneMappingWhitePoint = 1.0;\n\n\t// morphs\n\n\tthis.maxMorphTargets = 8;\n\tthis.maxMorphNormals = 4;\n\n\t// internal properties\n\n\tvar _this = this,\n\n\t\t_isContextLost = false,\n\n\t\t// internal state cache\n\n\t\t_framebuffer = null,\n\n\t\t_currentRenderTarget = null,\n\t\t_currentFramebuffer = null,\n\t\t_currentMaterialId = - 1,\n\t\t_currentGeometryProgram = '',\n\n\t\t_currentCamera = null,\n\t\t_currentArrayCamera = null,\n\n\t\t_currentViewport = new Vector4(),\n\t\t_currentScissor = new Vector4(),\n\t\t_currentScissorTest = null,\n\n\t\t//\n\n\t\t_usedTextureUnits = 0,\n\n\t\t//\n\n\t\t_width = _canvas.width,\n\t\t_height = _canvas.height,\n\n\t\t_pixelRatio = 1,\n\n\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t_scissorTest = false,\n\n\t\t// frustum\n\n\t\t_frustum = new Frustum(),\n\n\t\t// clipping\n\n\t\t_clipping = new WebGLClipping(),\n\t\t_clippingEnabled = false,\n\t\t_localClippingEnabled = false,\n\n\t\t// camera matrices cache\n\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_vector3 = new Vector3();\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tvar _gl;\n\n\ttry {\n\n\t\tvar contextAttributes = {\n\t\t\talpha: _alpha,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference\n\t\t};\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\t_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\n\t}\n\n\tvar extensions, capabilities, state, info;\n\tvar properties, textures, attributes, geometries, objects;\n\tvar programCache, renderLists, renderStates;\n\n\tvar background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\tvar spriteRenderer;\n\n\tvar utils;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'OES_element_index_uint' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tstate = new WebGLState( _gl, extensions, utils );\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\tinfo = new WebGLInfo( _gl );\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tattributes = new WebGLAttributes( _gl );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info );\n\t\tobjects = new WebGLObjects( geometries, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl );\n\t\tprogramCache = new WebGLPrograms( _this, extensions, capabilities );\n\t\trenderLists = new WebGLRenderLists();\n\t\trenderStates = new WebGLRenderStates();\n\n\t\tbackground = new WebGLBackground( _this, state, objects, _premultipliedAlpha );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\tspriteRenderer = new WebGLSpriteRenderer( _this, _gl, state, textures, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.context = _gl;\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// vr\n\n\tvar vr = ( 'xr' in navigator ) ? new WebXRManager( _this ) : new WebVRManager( _this );\n\n\tthis.vr = vr;\n\n\t// shadow map\n\n\tvar shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize );\n\n\tthis.shadowMap = shadowMap;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tvar extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tvar extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function () {\n\n\t\treturn {\n\t\t\twidth: _width,\n\t\t\theight: _height\n\t\t};\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( vr.isPresenting() ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = width * _pixelRatio;\n\t\t_canvas.height = height * _pixelRatio;\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function () {\n\n\t\treturn {\n\t\t\twidth: _width * _pixelRatio,\n\t\t\theight: _height * _pixelRatio\n\t\t};\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = width * pixelRatio;\n\t\t_canvas.height = height * pixelRatio;\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function () {\n\n\t\treturn _currentViewport;\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t_viewport.set( x, _height - y - height, width, height );\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t_scissor.set( x, _height - y - height, width, height );\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function () {\n\n\t\treturn background.getClearColor();\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color, depth, stencil ) {\n\n\t\tvar bits = 0;\n\n\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\tthis.setRenderTarget( renderTarget );\n\t\tthis.clear( color, depth, stencil );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tobjects.dispose();\n\n\t\tvr.dispose();\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tinitGLContext();\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tvar material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReference( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReference( material ) {\n\n\t\tvar programInfo = properties.get( material ).program;\n\n\t\tmaterial.program = undefined;\n\n\t\tif ( programInfo !== undefined ) {\n\n\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tfunction renderObjectImmediate( object, program, material ) {\n\n\t\tobject.render( function ( object ) {\n\n\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t} );\n\n\t}\n\n\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\tstate.initAttributes();\n\n\t\tvar buffers = properties.get( object );\n\n\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\tvar programAttributes = program.getAttributes();\n\n\t\tif ( object.hasPositions ) {\n\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\tstate.enableAttribute( programAttributes.position );\n\t\t\t_gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasNormals ) {\n\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t! material.isMeshStandardMaterial &&\n\t\t\t\t! material.isMeshNormalMaterial &&\n\t\t\t\tmaterial.flatShading === true ) {\n\n\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\tstate.enableAttribute( programAttributes.normal );\n\n\t\t\t_gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\tstate.enableAttribute( programAttributes.uv );\n\n\t\t\t_gl.vertexAttribPointer( programAttributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\tstate.enableAttribute( programAttributes.color );\n\n\t\t\t_gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t}\n\n\t\tstate.disableUnusedAttributes();\n\n\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\tobject.count = 0;\n\n\t};\n\n\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\tvar frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\tvar program = setProgram( camera, fog, material, object );\n\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true );\n\n\t\tvar updateBuffers = false;\n\n\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\t//\n\n\t\tvar index = geometry.index;\n\t\tvar position = geometry.attributes.position;\n\t\tvar rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tvar attribute;\n\t\tvar renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\tif ( updateBuffers ) {\n\n\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tvar dataCount = Infinity;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdataCount = index.count;\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\tdataCount = position.count;\n\n\t\t}\n\n\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t} else {\n\n\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t}\n\n\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\tfunction setupVertexAttributes( material, program, geometry ) {\n\n\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.initAttributes();\n\n\t\tvar geometryAttributes = geometry.attributes;\n\n\t\tvar programAttributes = program.getAttributes();\n\n\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( var name in programAttributes ) {\n\n\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\tvar attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tvar buffer = attribute.buffer;\n\t\t\t\t\tvar type = attribute.type;\n\t\t\t\t\tvar bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute );\n\n\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.disableUnusedAttributes();\n\n\t}\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene, camera );\n\t\tcurrentRenderState.init();\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( camera );\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( object.material ) {\n\n\t\t\t\tif ( Array.isArray( object.material ) ) {\n\n\t\t\t\t\tfor ( var i = 0; i < object.material.length; i ++ ) {\n\n\t\t\t\t\t\tinitMaterial( object.material[ i ], scene.fog, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tinitMaterial( object.material, scene.fog, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t};\n\n\t// Animation Loop\n\n\tvar onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame() {\n\n\t\tif ( vr.isPresenting() ) return;\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback();\n\n\t}\n\n\tvar animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\tanimation.setContext( window );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\tvr.setAnimationLoop( callback );\n\n\t\tanimation.start();\n\n\t};\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\tif ( ! ( camera && camera.isCamera ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost ) return;\n\n\t\t// reset caching for this frame\n\n\t\t_currentGeometryProgram = '';\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( vr.enabled ) {\n\n\t\t\tcamera = vr.getCamera( camera );\n\n\t\t}\n\n\t\t//\n\n\t\tcurrentRenderState = renderStates.get( scene, camera );\n\t\tcurrentRenderState.init();\n\n\t\tscene.onBeforeRender( _this, scene, camera, renderTarget );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, camera );\n\t\tcurrentRenderList.init();\n\n\t\tprojectObject( scene, camera, _this.sortObjects );\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort();\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\tvar shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tcurrentRenderState.setupLights( camera );\n\n\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset ) this.info.reset();\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\trenderTarget = null;\n\n\t\t}\n\n\t\tthis.setRenderTarget( renderTarget );\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene, camera, forceClear );\n\n\t\t// render scene\n\n\t\tvar opaqueObjects = currentRenderList.opaque;\n\t\tvar transparentObjects = currentRenderList.transparent;\n\n\t\tif ( scene.overrideMaterial ) {\n\n\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\tif ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\tif ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t} else {\n\n\t\t\t// opaque pass (front-to-back order)\n\n\t\t\tif ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera );\n\n\t\t\t// transparent pass (back-to-front order)\n\n\t\t\tif ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera );\n\n\t\t}\n\n\t\t// custom renderers\n\n\t\tvar spritesArray = currentRenderState.state.spritesArray;\n\n\t\tspriteRenderer.render( spritesArray, scene, camera );\n\n\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\tif ( renderTarget ) {\n\n\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t}\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t\tscene.onAfterRender( _this, scene, camera );\n\n\t\tif ( vr.enabled ) {\n\n\t\t\tvr.submitFrame();\n\n\t\t}\n\n\t\t// _gl.finish();\n\n\t\tcurrentRenderList = null;\n\t\tcurrentRenderState = null;\n\n\t};\n\n\t/*\n\t// TODO Duplicated code (Frustum)\n\n\tvar _sphere = new Sphere();\n\n\tfunction isObjectViewable( object ) {\n\n\t\tvar geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null )\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere ).\n\t\tapplyMatrix4( object.matrixWorld );\n\n\t\treturn isSphereViewable( _sphere );\n\n\t}\n\n\tfunction isSpriteViewable( sprite ) {\n\n\t\t_sphere.center.set( 0, 0, 0 );\n\t\t_sphere.radius = 0.7071067811865476;\n\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn isSphereViewable( _sphere );\n\n\t}\n\n\tfunction isSphereViewable( sphere ) {\n\n\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\tif ( numPlanes === 0 ) return true;\n\n\t\tvar planes = _this.clippingPlanes,\n\n\t\t\tcenter = sphere.center,\n\t\t\tnegRad = - sphere.radius,\n\t\t\ti = 0;\n\n\t\tdo {\n\n\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t} while ( ++ i !== numPlanes );\n\n\t\treturn true;\n\n\t}\n\t*/\n\n\tfunction projectObject( object, camera, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tvar visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushSprite( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentRenderList.push( object, null, object.material, _vector3.z, null );\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar geometry = objects.update( object );\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\tvar groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar children = object.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\tvar object = renderItem.object;\n\t\t\tvar geometry = renderItem.geometry;\n\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\tvar group = renderItem.group;\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\t_currentArrayCamera = camera;\n\n\t\t\t\tvar cameras = camera.cameras;\n\n\t\t\t\tfor ( var j = 0, jl = cameras.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar camera2 = cameras[ j ];\n\n\t\t\t\t\tif ( object.layers.test( camera2.layers ) ) {\n\n\t\t\t\t\t\tif ( 'viewport' in camera2 ) { // XR\n\n\t\t\t\t\t\t\tstate.viewport( _currentViewport.copy( camera2.viewport ) );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar bounds = camera2.bounds;\n\n\t\t\t\t\t\t\tvar x = bounds.x * _width;\n\t\t\t\t\t\t\tvar y = bounds.y * _height;\n\t\t\t\t\t\t\tvar width = bounds.z * _width;\n\t\t\t\t\t\t\tvar height = bounds.w * _height;\n\n\t\t\t\t\t\t\tstate.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trenderObject( object, scene, camera2, geometry, material, group );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_currentArrayCamera = null;\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\t\tcurrentRenderState = renderStates.get( scene, _currentArrayCamera || camera );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\tvar frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t_currentGeometryProgram = '';\n\n\t\t\trenderObjectImmediate( object, program, material );\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\t\tcurrentRenderState = renderStates.get( scene, _currentArrayCamera || camera );\n\n\t}\n\n\tfunction initMaterial( material, fog, object ) {\n\n\t\tvar materialProperties = properties.get( material );\n\n\t\tvar lights = currentRenderState.state.lights;\n\t\tvar shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tvar parameters = programCache.getParameters(\n\t\t\tmaterial, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\tvar program = materialProperties.program;\n\t\tvar programChange = true;\n\n\t\tif ( program === undefined ) {\n\n\t\t\t// new material\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t} else if ( program.code !== code ) {\n\n\t\t\t// changed glsl or parameters\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t} else if ( materialProperties.lightsHash !== lights.state.hash ) {\n\n\t\t\tproperties.update( material, 'lightsHash', lights.state.hash );\n\t\t\tprogramChange = false;\n\n\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t// same glsl and uniform list\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// only rebuild uniform list\n\t\t\tprogramChange = false;\n\n\t\t}\n\n\t\tif ( programChange ) {\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\tmaterialProperties.shader = {\n\t\t\t\t\tname: material.type,\n\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tmaterialProperties.shader = {\n\t\t\t\t\tname: material.type,\n\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tmaterial.onBeforeCompile( materialProperties.shader, _this );\n\n\t\t\tprogram = programCache.acquireProgram( material, materialProperties.shader, parameters, code );\n\n\t\t\tmaterialProperties.program = program;\n\t\t\tmaterial.program = program;\n\n\t\t}\n\n\t\tvar programAttributes = program.getAttributes();\n\n\t\tif ( material.morphTargets ) {\n\n\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\tif ( programAttributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.morphNormals ) {\n\n\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\tif ( programAttributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar uniforms = materialProperties.shader.uniforms;\n\n\t\tif ( ! material.isShaderMaterial &&\n\t\t\t! material.isRawShaderMaterial ||\n\t\t\tmaterial.clipping === true ) {\n\n\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t}\n\n\t\tmaterialProperties.fog = fog;\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.lightsHash = lights.state.hash;\n\n\t\tif ( material.lights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\tuniformsList =\n\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t}\n\n\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t_usedTextureUnits = 0;\n\n\t\tvar materialProperties = properties.get( material );\n\t\tvar lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled ) {\n\n\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\tvar useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\t_clipping.setState(\n\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.needsUpdate === false ) {\n\n\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t} else if ( material.lights && materialProperties.lightsHash !== lights.state.hash ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.needsUpdate ) {\n\n\t\t\tinitMaterial( material, fog, object );\n\t\t\tmaterial.needsUpdate = false;\n\n\t\t}\n\n\t\tvar refreshProgram = false;\n\t\tvar refreshMaterial = false;\n\t\tvar refreshLights = false;\n\n\t\tvar program = materialProperties.program,\n\t\t\tp_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.shader.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\t// Avoid unneeded uniform updates per ArrayCamera's sub-camera\n\n\t\t\tif ( _currentCamera !== ( _currentArrayCamera || camera ) ) {\n\n\t\t\t\t_currentCamera = ( _currentArrayCamera || camera );\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t// not sure why, but otherwise weird things happen\n\n\t\tif ( material.skinning ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tvar skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tvar bones = skeleton.bones;\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === undefined ) {\n\n\t\t\t\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\t\t\t\tvar size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\t\t\t\tsize = _Math.ceilPowerOfTwo( size );\n\t\t\t\t\t\tsize = Math.max( size, 4 );\n\n\t\t\t\t\t\tvar boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\t\t\t\t\tboneMatrices.set( skeleton.boneMatrices ); // copy current values\n\n\t\t\t\t\t\tvar boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\t\t\t\t\tboneTexture.needsUpdate = true;\n\n\t\t\t\t\t\tskeleton.boneMatrices = boneMatrices;\n\t\t\t\t\t\tskeleton.boneTexture = boneTexture;\n\t\t\t\t\t\tskeleton.boneTextureSize = size;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint );\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\tif ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsDepth( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsDistance( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\t\tm_uniforms.color.value = material.color;\n\t\t\t\tm_uniforms.opacity.value = material.opacity;\n\n\t\t\t}\n\n\t\t\t// RectAreaLight Texture\n\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\tif ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1;\n\t\t\tif ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2;\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\treturn program;\n\n\t}\n\n\t// Uniforms (refresh uniforms objects)\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t\tuniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. normal map\n\t\t// 4. bump map\n\t\t// 5. alpha map\n\t\t// 6. emissive map\n\n\t\tvar uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value = material.color;\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\tuniforms.diffuse.value = material.color;\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\tuniforms.scale.value = _height * 0.5;\n\n\t\tuniforms.map.value = material.map;\n\n\t\tif ( material.map !== null ) {\n\n\t\t\tif ( material.map.matrixAutoUpdate === true ) {\n\n\t\t\t\tmaterial.map.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( material.map.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value = fog.color;\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value = material.specular;\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\trefreshUniformsPhong( uniforms, material );\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\trefreshUniformsStandard( uniforms, material );\n\n\t}\n\n\tfunction refreshUniformsDepth( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\t// Textures\n\n\tfunction allocTextureUnit() {\n\n\t\tvar textureUnit = _usedTextureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\t_usedTextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tthis.allocTextureUnit = allocTextureUnit;\n\n\t// this.setTexture2D = setTexture2D;\n\tthis.setTexture2D = ( function () {\n\n\t\tvar warned = false;\n\n\t\t// backwards compatibility: peel texture.texture\n\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttexture = texture.texture;\n\n\t\t\t}\n\n\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t};\n\n\t}() );\n\n\tthis.setTexture = ( function () {\n\n\t\tvar warned = false;\n\n\t\treturn function setTexture( texture, slot ) {\n\n\t\t\tif ( ! warned ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\twarned = true;\n\n\t\t\t}\n\n\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t};\n\n\t}() );\n\n\tthis.setTextureCube = ( function () {\n\n\t\tvar warned = false;\n\n\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttexture = texture.texture;\n\n\t\t\t}\n\n\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t// TODO: unify these code paths\n\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t} else {\n\n\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\t//\n\n\tthis.setFramebuffer = function ( value ) {\n\n\t\t_framebuffer = value;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\n\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t}\n\n\t\tvar framebuffer = _framebuffer;\n\t\tvar isCube = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tvar __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t}\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( framebuffer ) {\n\n\t\t\tvar restore = false;\n\n\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\trestore = true;\n\n\t\t\t}\n\n\t\t\ttry {\n\n\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level ) {\n\n\t\tvar width = texture.image.width;\n\t\tvar height = texture.image.height;\n\t\tvar glFormat = utils.convert( texture.format );\n\n\t\tthis.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexImage2D( _gl.TEXTURE_2D, level || 0, glFormat, position.x, position.y, width, height, 0 );\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) {\n\n\t\tvar width = srcTexture.image.width;\n\t\tvar height = srcTexture.image.height;\n\t\tvar glFormat = utils.convert( dstTexture.format );\n\t\tvar glType = utils.convert( dstTexture.type );\n\n\t\tthis.setTexture2D( dstTexture, 0 );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t}\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction FogExp2( color, density ) {\n\n\tthis.name = '';\n\n\tthis.color = new Color( color );\n\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n}\n\nFogExp2.prototype.isFogExp2 = true;\n\nFogExp2.prototype.clone = function () {\n\n\treturn new FogExp2( this.color, this.density );\n\n};\n\nFogExp2.prototype.toJSON = function ( /* meta */ ) {\n\n\treturn {\n\t\ttype: 'FogExp2',\n\t\tcolor: this.color.getHex(),\n\t\tdensity: this.density\n\t};\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Fog( color, near, far ) {\n\n\tthis.name = '';\n\n\tthis.color = new Color( color );\n\n\tthis.near = ( near !== undefined ) ? near : 1;\n\tthis.far = ( far !== undefined ) ? far : 1000;\n\n}\n\nFog.prototype.isFog = true;\n\nFog.prototype.clone = function () {\n\n\treturn new Fog( this.color, this.near, this.far );\n\n};\n\nFog.prototype.toJSON = function ( /* meta */ ) {\n\n\treturn {\n\t\ttype: 'Fog',\n\t\tcolor: this.color.getHex(),\n\t\tnear: this.near,\n\t\tfar: this.far\n\t};\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Scene() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Scene';\n\n\tthis.background = null;\n\tthis.fog = null;\n\tthis.overrideMaterial = null;\n\n\tthis.autoUpdate = true; // checked by the renderer\n\n}\n\nScene.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Scene,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: <hex>,\n * opacity: <float>,\n * map: new THREE.Texture( <Image> ),\n *\n *\tuvOffset: new THREE.Vector2(),\n *\tuvScale: new THREE.Vector2()\n * }\n */\n\nfunction SpriteMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'SpriteMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\tthis.map = null;\n\n\tthis.rotation = 0;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nSpriteMaterial.prototype = Object.create( Material.prototype );\nSpriteMaterial.prototype.constructor = SpriteMaterial;\nSpriteMaterial.prototype.isSpriteMaterial = true;\n\nSpriteMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\tthis.map = source.map;\n\n\tthis.rotation = source.rotation;\n\n\treturn this;\n\n};\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Sprite( material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Sprite';\n\n\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\tthis.center = new Vector2( 0.5, 0.5 );\n\n}\n\nSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Sprite,\n\n\tisSprite: true,\n\n\traycast: ( function () {\n\n\t\tvar intersectPoint = new Vector3();\n\t\tvar worldPosition = new Vector3();\n\t\tvar worldScale = new Vector3();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tworldPosition.setFromMatrixPosition( this.matrixWorld );\n\t\t\traycaster.ray.closestPointToPoint( worldPosition, intersectPoint );\n\n\t\t\tworldScale.setFromMatrixScale( this.matrixWorld );\n\t\t\tvar guessSizeSq = worldScale.x * worldScale.y / 4;\n\n\t\t\tif ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return;\n\n\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\tintersects.push( {\n\n\t\t\t\tdistance: distance,\n\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\tface: null,\n\t\t\t\tobject: this\n\n\t\t\t} );\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.material ).copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\treturn this;\n\n\t}\n\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LOD() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'LOD';\n\n\tObject.defineProperties( this, {\n\t\tlevels: {\n\t\t\tenumerable: true,\n\t\t\tvalue: []\n\t\t}\n\t} );\n\n}\n\nLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: LOD,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\tvar levels = source.levels;\n\n\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tvar level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\taddLevel: function ( object, distance ) {\n\n\t\tif ( distance === undefined ) distance = 0;\n\n\t\tdistance = Math.abs( distance );\n\n\t\tvar levels = this.levels;\n\n\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\tthis.add( object );\n\n\t},\n\n\tgetObjectForDistance: function ( distance ) {\n\n\t\tvar levels = this.levels;\n\n\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn levels[ i - 1 ].object;\n\n\t},\n\n\traycast: ( function () {\n\n\t\tvar matrixPosition = new Vector3();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t};\n\n\t}() ),\n\n\tupdate: function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function update( camera ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.levels = [];\n\n\t\tvar levels = this.levels;\n\n\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tvar level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author michael guerrero / http://realitymeltdown.com\n * @author ikerr / http://verold.com\n */\n\nfunction Skeleton( bones, boneInverses ) {\n\n\t// copy the bone array\n\n\tbones = bones || [];\n\n\tthis.bones = bones.slice( 0 );\n\tthis.boneMatrices = new Float32Array( this.bones.length * 16 );\n\n\t// use the supplied bone inverses or calculate the inverses\n\n\tif ( boneInverses === undefined ) {\n\n\t\tthis.calculateInverses();\n\n\t} else {\n\n\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Skeleton boneInverses is the wrong length.' );\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nObject.assign( Skeleton.prototype, {\n\n\tcalculateInverses: function () {\n\n\t\tthis.boneInverses = [];\n\n\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tvar inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.getInverse( this.bones[ i ].matrixWorld );\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t},\n\n\tpose: function () {\n\n\t\tvar bone, i, il;\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tbone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tbone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdate: ( function () {\n\n\t\tvar offsetMatrix = new Matrix4();\n\t\tvar identityMatrix = new Matrix4();\n\n\t\treturn function update() {\n\n\t\t\tvar bones = this.bones;\n\t\t\tvar boneInverses = this.boneInverses;\n\t\t\tvar boneMatrices = this.boneMatrices;\n\t\t\tvar boneTexture = this.boneTexture;\n\n\t\t\t// flatten bone matrices to array\n\n\t\t\tfor ( var i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\tvar matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix;\n\n\t\t\t\toffsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t\toffsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t\t}\n\n\t\t\tif ( boneTexture !== undefined ) {\n\n\t\t\t\tboneTexture.needsUpdate = true;\n\n\t\t\t}\n\n\t\t};\n\n\t} )(),\n\n\tclone: function () {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t},\n\n\tgetBoneByName: function ( name ) {\n\n\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author ikerr / http://verold.com\n */\n\nfunction Bone() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Bone';\n\n}\n\nBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Bone,\n\n\tisBone: true\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author ikerr / http://verold.com\n */\n\nfunction SkinnedMesh( geometry, material ) {\n\n\tMesh.call( this, geometry, material );\n\n\tthis.type = 'SkinnedMesh';\n\n\tthis.bindMode = 'attached';\n\tthis.bindMatrix = new Matrix4();\n\tthis.bindMatrixInverse = new Matrix4();\n\n\tvar bones = this.initBones();\n\tvar skeleton = new Skeleton( bones );\n\n\tthis.bind( skeleton, this.matrixWorld );\n\n\tthis.normalizeSkinWeights();\n\n}\n\nSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\tconstructor: SkinnedMesh,\n\n\tisSkinnedMesh: true,\n\n\tinitBones: function () {\n\n\t\tvar bones = [], bone, gbone;\n\t\tvar i, il;\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\t// first, create array of 'Bone' objects from geometry data\n\n\t\t\tfor ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {\n\n\t\t\t\tgbone = this.geometry.bones[ i ];\n\n\t\t\t\t// create new 'Bone' object\n\n\t\t\t\tbone = new Bone();\n\t\t\t\tbones.push( bone );\n\n\t\t\t\t// apply values\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\t// second, create bone hierarchy\n\n\t\t\tfor ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {\n\n\t\t\t\tgbone = this.geometry.bones[ i ];\n\n\t\t\t\tif ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) {\n\n\t\t\t\t\t// subsequent bones in the hierarchy\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ i ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// topmost bone, immediate child of the skinned mesh\n\n\t\t\t\t\tthis.add( bones[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// now the bones are part of the scene graph and children of the skinned mesh.\n\t\t// let's update the corresponding matrices\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\treturn bones;\n\n\t},\n\n\tbind: function ( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t},\n\n\tpose: function () {\n\n\t\tthis.skeleton.pose();\n\n\t},\n\n\tnormalizeSkinWeights: function () {\n\n\t\tvar scale, i;\n\n\t\tif ( this.geometry && this.geometry.isGeometry ) {\n\n\t\t\tfor ( i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\tscale = 1.0 / sw.manhattanLength();\n\n\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( this.geometry && this.geometry.isBufferGeometry ) {\n\n\t\t\tvar vec = new Vector4();\n\n\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\tfor ( i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\tscale = 1.0 / vec.manhattanLength();\n\n\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t}\n\n\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tMesh.prototype.updateMatrixWorld.call( this, force );\n\n\t\tif ( this.bindMode === 'attached' ) {\n\n\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t} else if ( this.bindMode === 'detached' ) {\n\n\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: <hex>,\n * opacity: <float>,\n *\n * linewidth: <float>,\n * linecap: \"round\",\n * linejoin: \"round\"\n * }\n */\n\nfunction LineBasicMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'LineBasicMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.linewidth = 1;\n\tthis.linecap = 'round';\n\tthis.linejoin = 'round';\n\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nLineBasicMaterial.prototype = Object.create( Material.prototype );\nLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\nLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\nLineBasicMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.linewidth = source.linewidth;\n\tthis.linecap = source.linecap;\n\tthis.linejoin = source.linejoin;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Line( geometry, material, mode ) {\n\n\tif ( mode === 1 ) {\n\n\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\treturn new LineSegments( geometry, material );\n\n\t}\n\n\tObject3D.call( this );\n\n\tthis.type = 'Line';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n}\n\nLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Line,\n\n\tisLine: true,\n\n\tcomputeLineDistances: ( function () {\n\n\t\tvar start = new Vector3();\n\t\tvar end = new Vector3();\n\n\t\treturn function computeLineDistances() {\n\n\t\t\tvar geometry = this.geometry;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t// we assume non-indexed geometry\n\n\t\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\t\tvar positionAttribute = geometry.attributes.position;\n\t\t\t\t\tvar lineDistances = [ 0 ];\n\n\t\t\t\t\tfor ( var i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\tstart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t\t\tend.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\t\t\tlineDistances[ i ] += start.distanceTo( end );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar lineDistances = geometry.lineDistances;\n\n\t\t\t\tlineDistances[ 0 ] = 0;\n\n\t\t\t\tfor ( var i = 1, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() ),\n\n\traycast: ( function () {\n\n\t\tvar inverseMatrix = new Matrix4();\n\t\tvar ray = new Ray();\n\t\tvar sphere = new Sphere();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tvar precision = raycaster.linePrecision;\n\t\t\tvar precisionSq = precision * precision;\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t//\n\n\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\tvar vStart = new Vector3();\n\t\t\tvar vEnd = new Vector3();\n\t\t\tvar interSegment = new Vector3();\n\t\t\tvar interRay = new Vector3();\n\t\t\tvar step = ( this && this.isLineSegments ) ? 2 : 1;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tvar index = geometry.index;\n\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LineSegments( geometry, material ) {\n\n\tLine.call( this, geometry, material );\n\n\tthis.type = 'LineSegments';\n\n}\n\nLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\tconstructor: LineSegments,\n\n\tisLineSegments: true,\n\n\tcomputeLineDistances: ( function () {\n\n\t\tvar start = new Vector3();\n\t\tvar end = new Vector3();\n\n\t\treturn function computeLineDistances() {\n\n\t\t\tvar geometry = this.geometry;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t// we assume non-indexed geometry\n\n\t\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\t\tvar positionAttribute = geometry.attributes.position;\n\t\t\t\t\tvar lineDistances = [];\n\n\t\t\t\t\tfor ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t\t\tstart.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\t\tend.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar lineDistances = geometry.lineDistances;\n\n\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i += 2 ) {\n\n\t\t\t\t\tstart.copy( vertices[ i ] );\n\t\t\t\t\tend.copy( vertices[ i + 1 ] );\n\n\t\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() )\n\n} );\n\n/**\n * @author mgreter / http://github.com/mgreter\n */\n\nfunction LineLoop( geometry, material ) {\n\n\tLine.call( this, geometry, material );\n\n\tthis.type = 'LineLoop';\n\n}\n\nLineLoop.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\tconstructor: LineLoop,\n\n\tisLineLoop: true,\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: <hex>,\n * opacity: <float>,\n * map: new THREE.Texture( <Image> ),\n *\n * size: <float>,\n * sizeAttenuation: <bool>\n *\n * morphTargets: <bool>\n * }\n */\n\nfunction PointsMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'PointsMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.map = null;\n\n\tthis.size = 1;\n\tthis.sizeAttenuation = true;\n\n\tthis.morphTargets = false;\n\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nPointsMaterial.prototype = Object.create( Material.prototype );\nPointsMaterial.prototype.constructor = PointsMaterial;\n\nPointsMaterial.prototype.isPointsMaterial = true;\n\nPointsMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.size = source.size;\n\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Points( geometry, material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Points';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n}\n\nPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Points,\n\n\tisPoints: true,\n\n\traycast: ( function () {\n\n\t\tvar inverseMatrix = new Matrix4();\n\t\tvar ray = new Ray();\n\t\tvar sphere = new Sphere();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tvar object = this;\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\tsphere.applyMatrix4( matrixWorld );\n\t\t\tsphere.radius += threshold;\n\n\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t//\n\n\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\tvar position = new Vector3();\n\t\t\tvar intersectPoint = new Vector3();\n\n\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\tray.closestPointToPoint( point, intersectPoint );\n\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tvar index = geometry.index;\n\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Group() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Group';\n\n}\n\nGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Group,\n\n\tisGroup: true\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.generateMipmaps = false;\n\n}\n\nVideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), {\n\n\tconstructor: VideoTexture,\n\n\tisVideoTexture: true,\n\n\tupdate: function () {\n\n\t\tvar video = this.image;\n\n\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.image = { width: width, height: height };\n\tthis.mipmaps = mipmaps;\n\n\t// no flipping for cube textures\n\t// (also flipping doesn't work for compressed textures )\n\n\tthis.flipY = false;\n\n\t// can't generate mipmaps for compressed textures\n\t// mips must be embedded in DDS files\n\n\tthis.generateMipmaps = false;\n\n}\n\nCompressedTexture.prototype = Object.create( Texture.prototype );\nCompressedTexture.prototype.constructor = CompressedTexture;\n\nCompressedTexture.prototype.isCompressedTexture = true;\n\n/**\n * @author Matt DesLauriers / @mattdesl\n * @author atix / arthursilber.de\n */\n\nfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\tformat = format !== undefined ? format : DepthFormat;\n\n\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t}\n\n\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.image = { width: width, height: height };\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\tthis.flipY = false;\n\tthis.generateMipmaps\t= false;\n\n}\n\nDepthTexture.prototype = Object.create( Texture.prototype );\nDepthTexture.prototype.constructor = DepthTexture;\nDepthTexture.prototype.isDepthTexture = true;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction WireframeGeometry( geometry ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'WireframeGeometry';\n\n\t// buffer\n\n\tvar vertices = [];\n\n\t// helper variables\n\n\tvar i, j, l, o, ol;\n\tvar edge = [ 0, 0 ], edges = {}, e, edge1, edge2;\n\tvar key, keys = [ 'a', 'b', 'c' ];\n\tvar vertex;\n\n\t// different logic for Geometry and BufferGeometry\n\n\tif ( geometry && geometry.isGeometry ) {\n\n\t\t// create a data structure that contains all edges without duplicates\n\n\t\tvar faces = geometry.faces;\n\n\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge1 = face[ keys[ j ] ];\n\t\t\t\tedge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\te = edges[ key ];\n\n\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\tvar position, indices, groups;\n\t\tvar group, start, count;\n\t\tvar index1, index2;\n\n\t\tvertex = new Vector3();\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\t// indexed BufferGeometry\n\n\t\t\tposition = geometry.attributes.position;\n\t\t\tindices = geometry.index;\n\t\t\tgroups = geometry.groups;\n\n\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t}\n\n\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\tstart = group.start;\n\t\t\t\tcount = group.count;\n\n\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tedge1 = indices.getX( i + j );\n\t\t\t\t\t\tedge2 = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// non-indexed BufferGeometry\n\n\t\t\tposition = geometry.attributes.position;\n\n\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n}\n\nWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\nWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n/**\n * @author zz85 / https://github.com/zz85\n * @author Mugen87 / https://github.com/Mugen87\n *\n * Parametric Surfaces Geometry\n * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n */\n\n// ParametricGeometry\n\nfunction ParametricGeometry( func, slices, stacks ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ParametricGeometry';\n\n\tthis.parameters = {\n\t\tfunc: func,\n\t\tslices: slices,\n\t\tstacks: stacks\n\t};\n\n\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\tthis.mergeVertices();\n\n}\n\nParametricGeometry.prototype = Object.create( Geometry.prototype );\nParametricGeometry.prototype.constructor = ParametricGeometry;\n\n// ParametricBufferGeometry\n\nfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ParametricBufferGeometry';\n\n\tthis.parameters = {\n\t\tfunc: func,\n\t\tslices: slices,\n\t\tstacks: stacks\n\t};\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\tvar EPS = 0.00001;\n\n\tvar normal = new Vector3();\n\n\tvar p0 = new Vector3(), p1 = new Vector3();\n\tvar pu = new Vector3(), pv = new Vector3();\n\n\tvar i, j;\n\n\tif ( func.length < 3 ) {\n\n\t\tconsole.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' );\n\n\t}\n\n\t// generate vertices, normals and uvs\n\n\tvar sliceCount = slices + 1;\n\n\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\tvar v = i / stacks;\n\n\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\tvar u = j / slices;\n\n\t\t\t// vertex\n\n\t\t\tfunc( u, v, p0 );\n\t\t\tvertices.push( p0.x, p0.y, p0.z );\n\n\t\t\t// normal\n\n\t\t\t// approximate tangent vectors via finite differences\n\n\t\t\tif ( u - EPS >= 0 ) {\n\n\t\t\t\tfunc( u - EPS, v, p1 );\n\t\t\t\tpu.subVectors( p0, p1 );\n\n\t\t\t} else {\n\n\t\t\t\tfunc( u + EPS, v, p1 );\n\t\t\t\tpu.subVectors( p1, p0 );\n\n\t\t\t}\n\n\t\t\tif ( v - EPS >= 0 ) {\n\n\t\t\t\tfunc( u, v - EPS, p1 );\n\t\t\t\tpv.subVectors( p0, p1 );\n\n\t\t\t} else {\n\n\t\t\t\tfunc( u, v + EPS, p1 );\n\t\t\t\tpv.subVectors( p1, p0 );\n\n\t\t\t}\n\n\t\t\t// cross product of tangent vectors returns surface normal\n\n\t\t\tnormal.crossVectors( pu, pv ).normalize();\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( u, v );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\tvar a = i * sliceCount + j;\n\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t// faces one and two\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n/**\n * @author clockworkgeek / https://github.com/clockworkgeek\n * @author timothypratley / https://github.com/timothypratley\n * @author WestLangley / http://github.com/WestLangley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// PolyhedronGeometry\n\nfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'PolyhedronGeometry';\n\n\tthis.parameters = {\n\t\tvertices: vertices,\n\t\tindices: indices,\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\nPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n// PolyhedronBufferGeometry\n\nfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'PolyhedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tvertices: vertices,\n\t\tindices: indices,\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tradius = radius || 1;\n\tdetail = detail || 0;\n\n\t// default buffer data\n\n\tvar vertexBuffer = [];\n\tvar uvBuffer = [];\n\n\t// the subdivision creates the vertex buffer data\n\n\tsubdivide( detail );\n\n\t// all vertices should lie on a conceptual sphere with a given radius\n\n\tappplyRadius( radius );\n\n\t// finally, create the uv data\n\n\tgenerateUVs();\n\n\t// build non-indexed geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\tif ( detail === 0 ) {\n\n\t\tthis.computeVertexNormals(); // flat normals\n\n\t} else {\n\n\t\tthis.normalizeNormals(); // smooth normals\n\n\t}\n\n\t// helper functions\n\n\tfunction subdivide( detail ) {\n\n\t\tvar a = new Vector3();\n\t\tvar b = new Vector3();\n\t\tvar c = new Vector3();\n\n\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t// get the vertices of the face\n\n\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t// perform subdivision\n\n\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t}\n\n\t}\n\n\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\tvar cols = Math.pow( 2, detail );\n\n\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\tvar v = [];\n\n\t\tvar i, j;\n\n\t\t// construct all of the vertices for this subdivision\n\n\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\tv[ i ] = [];\n\n\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\tvar rows = cols - i;\n\n\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// construct all of the faces\n\n\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction appplyRadius( radius ) {\n\n\t\tvar vertex = new Vector3();\n\n\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t}\n\n\t}\n\n\tfunction generateUVs() {\n\n\t\tvar vertex = new Vector3();\n\n\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t}\n\n\t\tcorrectUVs();\n\n\t\tcorrectSeam();\n\n\t}\n\n\tfunction correctSeam() {\n\n\t\t// handle case when face straddles the seam, see #3269\n\n\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t// uv data of a single face\n\n\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction pushVertex( vertex ) {\n\n\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t}\n\n\tfunction getVertexByIndex( index, vertex ) {\n\n\t\tvar stride = index * 3;\n\n\t\tvertex.x = vertices[ stride + 0 ];\n\t\tvertex.y = vertices[ stride + 1 ];\n\t\tvertex.z = vertices[ stride + 2 ];\n\n\t}\n\n\tfunction correctUVs() {\n\n\t\tvar a = new Vector3();\n\t\tvar b = new Vector3();\n\t\tvar c = new Vector3();\n\n\t\tvar centroid = new Vector3();\n\n\t\tvar uvA = new Vector2();\n\t\tvar uvB = new Vector2();\n\t\tvar uvC = new Vector2();\n\n\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\tvar azi = azimuth( centroid );\n\n\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t}\n\n\t}\n\n\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t}\n\n\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t}\n\n\t}\n\n\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\tfunction azimuth( vector ) {\n\n\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t}\n\n\n\t// Angle above the XZ plane.\n\n\tfunction inclination( vector ) {\n\n\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t}\n\n}\n\nPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n/**\n * @author timothypratley / https://github.com/timothypratley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// TetrahedronGeometry\n\nfunction TetrahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TetrahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\nTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n// TetrahedronBufferGeometry\n\nfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\tvar vertices = [\n\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t];\n\n\tvar indices = [\n\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'TetrahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n/**\n * @author timothypratley / https://github.com/timothypratley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// OctahedronGeometry\n\nfunction OctahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'OctahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nOctahedronGeometry.prototype = Object.create( Geometry.prototype );\nOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n// OctahedronBufferGeometry\n\nfunction OctahedronBufferGeometry( radius, detail ) {\n\n\tvar vertices = [\n\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t];\n\n\tvar indices = [\n\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t1, 3, 4,\t1, 4, 2\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'OctahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n/**\n * @author timothypratley / https://github.com/timothypratley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// IcosahedronGeometry\n\nfunction IcosahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'IcosahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\nIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n// IcosahedronBufferGeometry\n\nfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\tvar vertices = [\n\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t 0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t t, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t];\n\n\tvar indices = [\n\t\t 0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t 1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t 3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t 4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'IcosahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n/**\n * @author Abe Pazos / https://hamoid.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// DodecahedronGeometry\n\nfunction DodecahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'DodecahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\nDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n// DodecahedronBufferGeometry\n\nfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\tvar r = 1 / t;\n\n\tvar vertices = [\n\n\t\t// (±1, ±1, ±1)\n\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t// (0, ±1/φ, ±φ)\n\t\t 0, - r, - t, 0, - r, t,\n\t\t 0, r, - t, 0, r, t,\n\n\t\t// (±1/φ, ±φ, 0)\n\t\t- r, - t, 0, - r, t, 0,\n\t\t r, - t, 0, r, t, 0,\n\n\t\t// (±φ, 0, ±1/φ)\n\t\t- t, 0, - r, t, 0, - r,\n\t\t- t, 0, r, t, 0, r\n\t];\n\n\tvar indices = [\n\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'DodecahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n/**\n * @author oosmoxiecode / https://github.com/oosmoxiecode\n * @author WestLangley / https://github.com/WestLangley\n * @author zz85 / https://github.com/zz85\n * @author miningold / https://github.com/miningold\n * @author jonobr1 / https://github.com/jonobr1\n * @author Mugen87 / https://github.com/Mugen87\n *\n */\n\n// TubeGeometry\n\nfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TubeGeometry';\n\n\tthis.parameters = {\n\t\tpath: path,\n\t\ttubularSegments: tubularSegments,\n\t\tradius: radius,\n\t\tradialSegments: radialSegments,\n\t\tclosed: closed\n\t};\n\n\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t// expose internals\n\n\tthis.tangents = bufferGeometry.tangents;\n\tthis.normals = bufferGeometry.normals;\n\tthis.binormals = bufferGeometry.binormals;\n\n\t// create geometry\n\n\tthis.fromBufferGeometry( bufferGeometry );\n\tthis.mergeVertices();\n\n}\n\nTubeGeometry.prototype = Object.create( Geometry.prototype );\nTubeGeometry.prototype.constructor = TubeGeometry;\n\n// TubeBufferGeometry\n\nfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TubeBufferGeometry';\n\n\tthis.parameters = {\n\t\tpath: path,\n\t\ttubularSegments: tubularSegments,\n\t\tradius: radius,\n\t\tradialSegments: radialSegments,\n\t\tclosed: closed\n\t};\n\n\ttubularSegments = tubularSegments || 64;\n\tradius = radius || 1;\n\tradialSegments = radialSegments || 8;\n\tclosed = closed || false;\n\n\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t// expose internals\n\n\tthis.tangents = frames.tangents;\n\tthis.normals = frames.normals;\n\tthis.binormals = frames.binormals;\n\n\t// helper variables\n\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\tvar uv = new Vector2();\n\tvar P = new Vector3();\n\n\tvar i, j;\n\n\t// buffer\n\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\tvar indices = [];\n\n\t// create buffer data\n\n\tgenerateBufferData();\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// functions\n\n\tfunction generateBufferData() {\n\n\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\tgenerateSegment( i );\n\n\t\t}\n\n\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t// at the regular position on the given path\n\t\t//\n\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t// uvs are generated in a separate function.\n\t\t// this makes it easy compute correct values for closed geometries\n\n\t\tgenerateUVs();\n\n\t\t// finally create faces\n\n\t\tgenerateIndices();\n\n\t}\n\n\tfunction generateSegment( i ) {\n\n\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t// retrieve corresponding normal and binormal\n\n\t\tvar N = frames.normals[ i ];\n\t\tvar B = frames.binormals[ i ];\n\n\t\t// generate normals and vertices for the current segment\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\tvar sin = Math.sin( v );\n\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t// normal\n\n\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\tnormal.normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t}\n\n\tfunction generateIndices() {\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction generateUVs() {\n\n\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n/**\n * @author oosmoxiecode\n * @author Mugen87 / https://github.com/Mugen87\n *\n * based on http://www.blackpawn.com/texts/pqtorus/\n */\n\n// TorusKnotGeometry\n\nfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TorusKnotGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\ttubularSegments: tubularSegments,\n\t\tradialSegments: radialSegments,\n\t\tp: p,\n\t\tq: q\n\t};\n\n\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\tthis.mergeVertices();\n\n}\n\nTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\nTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n// TorusKnotBufferGeometry\n\nfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TorusKnotBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\ttubularSegments: tubularSegments,\n\t\tradialSegments: radialSegments,\n\t\tp: p,\n\t\tq: q\n\t};\n\n\tradius = radius || 1;\n\ttube = tube || 0.4;\n\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\tp = p || 2;\n\tq = q || 3;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar i, j;\n\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\n\tvar P1 = new Vector3();\n\tvar P2 = new Vector3();\n\n\tvar B = new Vector3();\n\tvar T = new Vector3();\n\tvar N = new Vector3();\n\n\t// generate vertices, normals and uvs\n\n\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t// calculate orthonormal basis\n\n\t\tT.subVectors( P2, P1 );\n\t\tN.addVectors( P2, P1 );\n\t\tB.crossVectors( T, N );\n\t\tN.crossVectors( B, T );\n\n\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\tB.normalize();\n\t\tN.normalize();\n\n\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t// now calculate the final vertex position.\n\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( i / tubularSegments );\n\t\t\tuvs.push( j / radialSegments );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t// indices\n\n\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// this function calculates the current position on the torus curve\n\n\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\tvar cu = Math.cos( u );\n\t\tvar su = Math.sin( u );\n\t\tvar quOverP = q / p * u;\n\t\tvar cs = Math.cos( quOverP );\n\n\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t}\n\n}\n\nTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n/**\n * @author oosmoxiecode\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// TorusGeometry\n\nfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TorusGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\tradialSegments: radialSegments,\n\t\ttubularSegments: tubularSegments,\n\t\tarc: arc\n\t};\n\n\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\tthis.mergeVertices();\n\n}\n\nTorusGeometry.prototype = Object.create( Geometry.prototype );\nTorusGeometry.prototype.constructor = TorusGeometry;\n\n// TorusBufferGeometry\n\nfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TorusBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\tradialSegments: radialSegments,\n\t\ttubularSegments: tubularSegments,\n\t\tarc: arc\n\t};\n\n\tradius = radius || 1;\n\ttube = tube || 0.4;\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\tarc = arc || Math.PI * 2;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar center = new Vector3();\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\n\tvar j, i;\n\n\t// generate vertices, normals and uvs\n\n\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\tvar u = i / tubularSegments * arc;\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( i / tubularSegments );\n\t\t\tuvs.push( j / radialSegments );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t// indices\n\n\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n * Port from https://github.com/mapbox/earcut (v2.1.2)\n */\n\nvar Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim ) {\n\n\t\tdim = dim || 2;\n\n\t\tvar hasHoles = holeIndices && holeIndices.length,\n\t\t\touterLen = hasHoles ? holeIndices[ 0 ] * dim : data.length,\n\t\t\touterNode = linkedList( data, 0, outerLen, dim, true ),\n\t\t\ttriangles = [];\n\n\t\tif ( ! outerNode ) return triangles;\n\n\t\tvar minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( var i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 1 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\n\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tvar i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\n\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tvar p = start, again;\n\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\n\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tvar stop = ear, prev, next;\n\n\t// iterate through ears, slicing them one by one\n\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim );\n\t\t\ttriangles.push( ear.i / dim );\n\t\t\ttriangles.push( next.i / dim );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertice leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( ear, triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\n\nfunction isEar( ear ) {\n\n\tvar a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tvar p = ear.next.next;\n\n\twhile ( p !== ear.prev ) {\n\n\t\tif ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tvar a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// triangle bbox; min & max are calculated like this for speed\n\n\tvar minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ),\n\t\tminTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ),\n\t\tmaxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ),\n\t\tmaxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y );\n\n\t// z-order range for the current triangle bbox;\n\n\tvar minZ = zOrder( minTX, minTY, minX, minY, invSize ),\n\t\tmaxZ = zOrder( maxTX, maxTY, minX, minY, invSize );\n\n\t// first look for points inside the triangle in increasing z-order\n\n\tvar p = ear.nextZ;\n\n\twhile ( p && p.z <= maxZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.nextZ;\n\n\t}\n\n\t// then look for points in decreasing z-order\n\n\tp = ear.prevZ;\n\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\n\t\tp = p.prevZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\n\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tvar p = start;\n\n\tdo {\n\n\t\tvar a = p.prev, b = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim );\n\t\t\ttriangles.push( p.i / dim );\n\t\t\ttriangles.push( b.i / dim );\n\n\t\t\t// remove two nodes involved\n\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn p;\n\n}\n\n// try splitting polygon into two and triangulate them independently\n\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\n\tvar a = start;\n\n\tdo {\n\n\t\tvar b = a.next.next;\n\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\n\t\t\t\tvar c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\n\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tvar queue = [], i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\teliminateHole( queue[ i ], outerNode );\n\t\touterNode = filterPoints( outerNode, outerNode.next );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\n\nfunction eliminateHole( hole, outerNode ) {\n\n\touterNode = findHoleBridge( hole, outerNode );\n\n\tif ( outerNode ) {\n\n\t\tvar b = splitPolygon( outerNode, hole );\n\n\t\tfilterPoints( b, b.next );\n\n\t}\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\n\nfunction findHoleBridge( hole, outerNode ) {\n\n\tvar p = outerNode,\n\t\thx = hole.x,\n\t\thy = hole.y,\n\t\tqx = - Infinity,\n\t\tm;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tvar x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\n\t\t\t\tif ( x === hx ) {\n\n\t\t\t\t\tif ( hy === p.y ) return p;\n\t\t\t\t\tif ( hy === p.next.y ) return p.next;\n\n\t\t\t\t}\n\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\tif ( hx === qx ) return m.prev; // hole touches outer segment; pick lower endpoint\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tvar stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y,\n\t\ttanMin = Infinity,\n\t\ttan;\n\n\tp = m.next;\n\n\twhile ( p !== stop ) {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t}\n\n\treturn m;\n\n}\n\n// interlink polygon nodes in z-order\n\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tvar p = start;\n\n\tdo {\n\n\t\tif ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\n\nfunction sortLinked( list ) {\n\n\tvar i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\n\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\n\tx = 32767 * ( x - minX ) * invSize;\n\ty = 32767 * ( y - minY ) * invSize;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\n\nfunction getLeftmost( start ) {\n\n\tvar p = start, leftmost = start;\n\n\tdo {\n\n\t\tif ( p.x < leftmost.x ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\n\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 &&\n\t ( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 &&\n\t ( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0;\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\n\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) &&\n\t\tlocallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b );\n\n}\n\n// signed area of a triangle\n\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\n\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\n\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tif ( ( equals( p1, q1 ) && equals( p2, q2 ) ) ||\n\t\t\t( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true;\n\n\treturn area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 &&\n\t\t\t\t area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\n\nfunction intersectsPolygon( a, b ) {\n\n\tvar p = a;\n\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\t\t\t\tintersects( p, p.next, a, b ) ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\n\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\n\nfunction middleInside( a, b ) {\n\n\tvar p = a,\n\t\tinside = false,\n\t\tpx = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) {\n\n\t\t\tinside = ! inside;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\n\nfunction splitPolygon( a, b ) {\n\n\tvar a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\n\nfunction insertNode( i, x, y, last ) {\n\n\tvar p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertice index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertice nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = null;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tvar sum = 0;\n\n\tfor ( var i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n */\n\nvar ShapeUtils = {\n\n\t// calculate area of the contour polygon\n\n\tarea: function ( contour ) {\n\n\t\tvar n = contour.length;\n\t\tvar a = 0.0;\n\n\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t},\n\n\tisClockWise: function ( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t},\n\n\ttriangulateShape: function ( contour, holes ) {\n\n\t\tvar vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tvar holeIndices = []; // array of hole indices\n\t\tvar faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tvar holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( var i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tvar triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( var i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n};\n\nfunction removeDupEndPts( points ) {\n\n\tvar l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( var i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: <int>, // number of points on the curves\n * steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: <float>, // Depth to extrude the shape\n *\n * bevelEnabled: <bool>, // turn on bevel\n * bevelThickness: <float>, // how deep into the original shape bevel goes\n * bevelSize: <float>, // how far from shape outline is bevel\n * bevelSegments: <int>, // number of bevel layers\n *\n * extrudePath: <THREE.Curve> // curve to extrude shape along\n *\n * UVGenerator: <Object> // object that provides UV generator functions\n *\n * }\n */\n\n// ExtrudeGeometry\n\nfunction ExtrudeGeometry( shapes, options ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ExtrudeGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\toptions: options\n\t};\n\n\tthis.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) );\n\tthis.mergeVertices();\n\n}\n\nExtrudeGeometry.prototype = Object.create( Geometry.prototype );\nExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\nExtrudeGeometry.prototype.toJSON = function () {\n\n\tvar data = Geometry.prototype.toJSON.call( this );\n\n\tvar shapes = this.parameters.shapes;\n\tvar options = this.parameters.options;\n\n\treturn toJSON( shapes, options, data );\n\n};\n\n// ExtrudeBufferGeometry\n\nfunction ExtrudeBufferGeometry( shapes, options ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ExtrudeBufferGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\toptions: options\n\t};\n\n\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\tvar scope = this;\n\n\tvar verticesArray = [];\n\tvar uvArray = [];\n\n\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\tvar shape = shapes[ i ];\n\t\taddShape( shape );\n\n\t}\n\n\t// build geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\tthis.computeVertexNormals();\n\n\t// functions\n\n\tfunction addShape( shape ) {\n\n\t\tvar placeholder = [];\n\n\t\t// options\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\t\tvar depth = options.depth !== undefined ? options.depth : 100;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6;\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2;\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar extrudePath = options.extrudePath;\n\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t// deprecated options\n\n\t\tif ( options.amount !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' );\n\t\t\tdepth = options.amount;\n\n\t\t}\n\n\t\t//\n\n\t\tvar extrudePts, extrudeByPath = false;\n\t\tvar splineTube, binormal, normal, position2;\n\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x,\n\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x,\n\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false; // assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [],\n\t\t\toneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tvar start = verticesArray.length / 3;\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar start = verticesArray.length / 3;\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\n\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0,\n\t\t\t\t\tsl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tplaceholder.push( x );\n\t\t\tplaceholder.push( y );\n\t\t\tplaceholder.push( z );\n\n\t\t}\n\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\taddVertex( a );\n\t\t\taddVertex( b );\n\t\t\taddVertex( c );\n\n\t\t\tvar nextIndex = verticesArray.length / 3;\n\t\t\tvar uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\taddUV( uvs[ 0 ] );\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 2 ] );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d ) {\n\n\t\t\taddVertex( a );\n\t\t\taddVertex( b );\n\t\t\taddVertex( d );\n\n\t\t\taddVertex( b );\n\t\t\taddVertex( c );\n\t\t\taddVertex( d );\n\n\n\t\t\tvar nextIndex = verticesArray.length / 3;\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\taddUV( uvs[ 0 ] );\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 2 ] );\n\t\t\taddUV( uvs[ 3 ] );\n\n\t\t}\n\n\t\tfunction addVertex( index ) {\n\n\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t}\n\n\n\t\tfunction addUV( vector2 ) {\n\n\t\t\tuvArray.push( vector2.x );\n\t\t\tuvArray.push( vector2.y );\n\n\t\t}\n\n\t}\n\n}\n\nExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry;\n\nExtrudeBufferGeometry.prototype.toJSON = function () {\n\n\tvar data = BufferGeometry.prototype.toJSON.call( this );\n\n\tvar shapes = this.parameters.shapes;\n\tvar options = this.parameters.options;\n\n\treturn toJSON( shapes, options, data );\n\n};\n\n//\n\nvar WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tvar a_x = vertices[ indexA * 3 ];\n\t\tvar a_y = vertices[ indexA * 3 + 1 ];\n\t\tvar b_x = vertices[ indexB * 3 ];\n\t\tvar b_y = vertices[ indexB * 3 + 1 ];\n\t\tvar c_x = vertices[ indexC * 3 ];\n\t\tvar c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tvar a_x = vertices[ indexA * 3 ];\n\t\tvar a_y = vertices[ indexA * 3 + 1 ];\n\t\tvar a_z = vertices[ indexA * 3 + 2 ];\n\t\tvar b_x = vertices[ indexB * 3 ];\n\t\tvar b_y = vertices[ indexB * 3 + 1 ];\n\t\tvar b_z = vertices[ indexB * 3 + 2 ];\n\t\tvar c_x = vertices[ indexC * 3 ];\n\t\tvar c_y = vertices[ indexC * 3 + 1 ];\n\t\tvar c_z = vertices[ indexC * 3 + 2 ];\n\t\tvar d_x = vertices[ indexD * 3 ];\n\t\tvar d_y = vertices[ indexD * 3 + 1 ];\n\t\tvar d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < 0.01 ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n};\n\nfunction toJSON( shapes, options, data ) {\n\n\t//\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tvar shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\t//\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author alteredq / http://alteredqualia.com/\n *\n * Text = 3D Text\n *\n * parameters = {\n * font: <THREE.Font>, // font\n *\n * size: <float>, // size of the text\n * height: <float>, // thickness to extrude text\n * curveSegments: <int>, // number of points on the curves\n *\n * bevelEnabled: <bool>, // turn on bevel\n * bevelThickness: <float>, // how deep into text bevel goes\n * bevelSize: <float> // how far from text outline is bevel\n * }\n */\n\n// TextGeometry\n\nfunction TextGeometry( text, parameters ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TextGeometry';\n\n\tthis.parameters = {\n\t\ttext: text,\n\t\tparameters: parameters\n\t};\n\n\tthis.fromBufferGeometry( new TextBufferGeometry( text, parameters ) );\n\tthis.mergeVertices();\n\n}\n\nTextGeometry.prototype = Object.create( Geometry.prototype );\nTextGeometry.prototype.constructor = TextGeometry;\n\n// TextBufferGeometry\n\nfunction TextBufferGeometry( text, parameters ) {\n\n\tparameters = parameters || {};\n\n\tvar font = parameters.font;\n\n\tif ( ! ( font && font.isFont ) ) {\n\n\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\treturn new Geometry();\n\n\t}\n\n\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t// translate parameters to ExtrudeGeometry API\n\n\tparameters.depth = parameters.height !== undefined ? parameters.height : 50;\n\n\t// defaults\n\n\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\tExtrudeBufferGeometry.call( this, shapes, parameters );\n\n\tthis.type = 'TextBufferGeometry';\n\n}\n\nTextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype );\nTextBufferGeometry.prototype.constructor = TextBufferGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author benaadams / https://twitter.com/ben_a_adams\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// SphereGeometry\n\nfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'SphereGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nSphereGeometry.prototype = Object.create( Geometry.prototype );\nSphereGeometry.prototype.constructor = SphereGeometry;\n\n// SphereBufferGeometry\n\nfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'SphereBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tradius = radius || 1;\n\n\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\tphiStart = phiStart !== undefined ? phiStart : 0;\n\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\tvar thetaEnd = thetaStart + thetaLength;\n\n\tvar ix, iy;\n\n\tvar index = 0;\n\tvar grid = [];\n\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// generate vertices, normals and uvs\n\n\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\tvar verticesRow = [];\n\n\t\tvar v = iy / heightSegments;\n\n\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\tvar u = ix / widthSegments;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormal.set( vertex.x, vertex.y, vertex.z ).normalize();\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( u, 1 - v );\n\n\t\t\tverticesRow.push( index ++ );\n\n\t\t}\n\n\t\tgrid.push( verticesRow );\n\n\t}\n\n\t// indices\n\n\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n/**\n * @author Kaleb Murphy\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// RingGeometry\n\nfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'RingGeometry';\n\n\tthis.parameters = {\n\t\tinnerRadius: innerRadius,\n\t\touterRadius: outerRadius,\n\t\tthetaSegments: thetaSegments,\n\t\tphiSegments: phiSegments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nRingGeometry.prototype = Object.create( Geometry.prototype );\nRingGeometry.prototype.constructor = RingGeometry;\n\n// RingBufferGeometry\n\nfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'RingBufferGeometry';\n\n\tthis.parameters = {\n\t\tinnerRadius: innerRadius,\n\t\touterRadius: outerRadius,\n\t\tthetaSegments: thetaSegments,\n\t\tphiSegments: phiSegments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tinnerRadius = innerRadius || 0.5;\n\touterRadius = outerRadius || 1;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// some helper variables\n\n\tvar segment;\n\tvar radius = innerRadius;\n\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\tvar vertex = new Vector3();\n\tvar uv = new Vector2();\n\tvar j, i;\n\n\t// generate vertices, normals and uvs\n\n\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uv\n\n\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// increase the radius for next row of vertices\n\n\t\tradius += radiusStep;\n\n\t}\n\n\t// indices\n\n\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\tvar a = segment;\n\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\tvar d = segment + 1;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n/**\n * @author astrodud / http://astrodud.isgreat.org/\n * @author zz85 / https://github.com/zz85\n * @author bhouston / http://clara.io\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// LatheGeometry\n\nfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'LatheGeometry';\n\n\tthis.parameters = {\n\t\tpoints: points,\n\t\tsegments: segments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength\n\t};\n\n\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\tthis.mergeVertices();\n\n}\n\nLatheGeometry.prototype = Object.create( Geometry.prototype );\nLatheGeometry.prototype.constructor = LatheGeometry;\n\n// LatheBufferGeometry\n\nfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'LatheBufferGeometry';\n\n\tthis.parameters = {\n\t\tpoints: points,\n\t\tsegments: segments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength\n\t};\n\n\tsegments = Math.floor( segments ) || 12;\n\tphiStart = phiStart || 0;\n\tphiLength = phiLength || Math.PI * 2;\n\n\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar base;\n\tvar inverseSegments = 1.0 / segments;\n\tvar vertex = new Vector3();\n\tvar uv = new Vector2();\n\tvar i, j;\n\n\t// generate vertices and uvs\n\n\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\tvar sin = Math.sin( phi );\n\t\tvar cos = Math.cos( phi );\n\n\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\tvertex.y = points[ j ].y;\n\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// uv\n\n\t\t\tuv.x = i / segments;\n\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\tbase = j + i * points.length;\n\n\t\t\tvar a = base;\n\t\t\tvar b = base + points.length;\n\t\t\tvar c = base + points.length + 1;\n\t\t\tvar d = base + 1;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// generate normals\n\n\tthis.computeVertexNormals();\n\n\t// if the geometry is closed, we need to average the normals along the seam.\n\t// because the corresponding vertices are identical (but still have different UVs).\n\n\tif ( phiLength === Math.PI * 2 ) {\n\n\t\tvar normals = this.attributes.normal.array;\n\t\tvar n1 = new Vector3();\n\t\tvar n2 = new Vector3();\n\t\tvar n = new Vector3();\n\n\t\t// this is the buffer offset for the last line of vertices\n\n\t\tbase = segments * points.length * 3;\n\n\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t// select the normal of the vertex in the first line\n\n\t\t\tn1.x = normals[ j + 0 ];\n\t\t\tn1.y = normals[ j + 1 ];\n\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t// select the normal of the vertex in the last line\n\n\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t// average normals\n\n\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t// assign the new values to both normals\n\n\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t}\n\n\t}\n\n}\n\nLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n/**\n * @author jonobr1 / http://jonobr1.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// ShapeGeometry\n\nfunction ShapeGeometry( shapes, curveSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ShapeGeometry';\n\n\tif ( typeof curveSegments === 'object' ) {\n\n\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\tcurveSegments = curveSegments.curveSegments;\n\n\t}\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\tcurveSegments: curveSegments\n\t};\n\n\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\tthis.mergeVertices();\n\n}\n\nShapeGeometry.prototype = Object.create( Geometry.prototype );\nShapeGeometry.prototype.constructor = ShapeGeometry;\n\nShapeGeometry.prototype.toJSON = function () {\n\n\tvar data = Geometry.prototype.toJSON.call( this );\n\n\tvar shapes = this.parameters.shapes;\n\n\treturn toJSON$1( shapes, data );\n\n};\n\n// ShapeBufferGeometry\n\nfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ShapeBufferGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\tcurveSegments: curveSegments\n\t};\n\n\tcurveSegments = curveSegments || 12;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar groupStart = 0;\n\tvar groupCount = 0;\n\n\t// allow single and array values for \"shapes\" parameter\n\n\tif ( Array.isArray( shapes ) === false ) {\n\n\t\taddShape( shapes );\n\n\t} else {\n\n\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\taddShape( shapes[ i ] );\n\n\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\tgroupStart += groupCount;\n\t\t\tgroupCount = 0;\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t// helper functions\n\n\tfunction addShape( shape ) {\n\n\t\tvar i, l, shapeHole;\n\n\t\tvar indexOffset = vertices.length / 3;\n\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\tvar shapeVertices = points.shape;\n\t\tvar shapeHoles = points.holes;\n\n\t\t// check direction of vertices\n\n\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t// also check if holes are in the opposite direction\n\n\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t// join vertices of inner and outer paths to a single array\n\n\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t}\n\n\t\t// vertices, normals, uvs\n\n\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\tnormals.push( 0, 0, 1 );\n\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t}\n\n\t\t// incides\n\n\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\tindices.push( a, b, c );\n\t\t\tgroupCount += 3;\n\n\t\t}\n\n\t}\n\n}\n\nShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\nShapeBufferGeometry.prototype.toJSON = function () {\n\n\tvar data = BufferGeometry.prototype.toJSON.call( this );\n\n\tvar shapes = this.parameters.shapes;\n\n\treturn toJSON$1( shapes, data );\n\n};\n\n//\n\nfunction toJSON$1( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tvar shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'EdgesGeometry';\n\n\tthis.parameters = {\n\t\tthresholdAngle: thresholdAngle\n\t};\n\n\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t// buffer\n\n\tvar vertices = [];\n\n\t// helper variables\n\n\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\tvar edge = [ 0, 0 ], edges = {}, edge1, edge2;\n\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t// prepare source geometry\n\n\tvar geometry2;\n\n\tif ( geometry.isBufferGeometry ) {\n\n\t\tgeometry2 = new Geometry();\n\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t} else {\n\n\t\tgeometry2 = geometry.clone();\n\n\t}\n\n\tgeometry2.mergeVertices();\n\tgeometry2.computeFaceNormals();\n\n\tvar sourceVertices = geometry2.vertices;\n\tvar faces = geometry2.faces;\n\n\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\tvar face = faces[ i ];\n\n\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\tedge1 = face[ keys[ j ] ];\n\t\t\tedge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\tedge[ 0 ] = Math.min( edge1, edge2 );\n\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t} else {\n\n\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// generate vertices\n\n\tfor ( key in edges ) {\n\n\t\tvar e = edges[ key ];\n\n\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n}\n\nEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\nEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// CylinderGeometry\n\nfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'CylinderGeometry';\n\n\tthis.parameters = {\n\t\tradiusTop: radiusTop,\n\t\tradiusBottom: radiusBottom,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nCylinderGeometry.prototype = Object.create( Geometry.prototype );\nCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n// CylinderBufferGeometry\n\nfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'CylinderBufferGeometry';\n\n\tthis.parameters = {\n\t\tradiusTop: radiusTop,\n\t\tradiusBottom: radiusBottom,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tvar scope = this;\n\n\tradiusTop = radiusTop !== undefined ? radiusTop : 1;\n\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 1;\n\theight = height || 1;\n\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\theightSegments = Math.floor( heightSegments ) || 1;\n\n\topenEnded = openEnded !== undefined ? openEnded : false;\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar index = 0;\n\tvar indexArray = [];\n\tvar halfHeight = height / 2;\n\tvar groupStart = 0;\n\n\t// generate geometry\n\n\tgenerateTorso();\n\n\tif ( openEnded === false ) {\n\n\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\tfunction generateTorso() {\n\n\t\tvar x, y;\n\t\tvar normal = new Vector3();\n\t\tvar vertex = new Vector3();\n\n\t\tvar groupCount = 0;\n\n\t\t// this will be used to calculate the normal\n\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\tvar indexRow = [];\n\n\t\t\tvar v = y / heightSegments;\n\n\t\t\t// calculate the radius of the current row\n\n\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\t// now save vertices of the row in our index array\n\n\t\t\tindexArray.push( indexRow );\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t// update group counter\n\n\t\t\t\tgroupCount += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t}\n\n\tfunction generateCap( top ) {\n\n\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\tvar uv = new Vector2();\n\t\tvar vertex = new Vector3();\n\n\t\tvar groupCount = 0;\n\n\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t// save the index of the first center vertex\n\t\tcenterIndexStart = index;\n\n\t\t// first we generate the center vertex data of the cap.\n\t\t// because the geometry needs one set of uvs per face,\n\t\t// we must generate a center vertex per face/segment\n\n\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t// vertex\n\n\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t// increase index\n\n\t\t\tindex ++;\n\n\t\t}\n\n\t\t// save the index of the last center vertex\n\n\t\tcenterIndexEnd = index;\n\n\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\tvar u = x / radialSegments;\n\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * sinTheta;\n\t\t\tvertex.y = halfHeight * sign;\n\t\t\tvertex.z = radius * cosTheta;\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t// uv\n\n\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t// increase index\n\n\t\t\tindex ++;\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\tvar c = centerIndexStart + x;\n\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\tif ( top === true ) {\n\n\t\t\t\t// face top\n\n\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t} else {\n\n\t\t\t\t// face bottom\n\n\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t}\n\n\t\t\tgroupCount += 3;\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t}\n\n}\n\nCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n/**\n * @author abelnation / http://github.com/abelnation\n */\n\n// ConeGeometry\n\nfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\tthis.type = 'ConeGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n}\n\nConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\nConeGeometry.prototype.constructor = ConeGeometry;\n\n// ConeBufferGeometry\n\nfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\tthis.type = 'ConeBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n}\n\nConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\nConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n * @author Mugen87 / https://github.com/Mugen87\n * @author hughes\n */\n\n// CircleGeometry\n\nfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'CircleGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tsegments: segments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nCircleGeometry.prototype = Object.create( Geometry.prototype );\nCircleGeometry.prototype.constructor = CircleGeometry;\n\n// CircleBufferGeometry\n\nfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'CircleBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tsegments: segments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tradius = radius || 1;\n\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar i, s;\n\tvar vertex = new Vector3();\n\tvar uv = new Vector2();\n\n\t// center point\n\n\tvertices.push( 0, 0, 0 );\n\tnormals.push( 0, 0, 1 );\n\tuvs.push( 0.5, 0.5 );\n\n\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t// vertex\n\n\t\tvertex.x = radius * Math.cos( segment );\n\t\tvertex.y = radius * Math.sin( segment );\n\n\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t// normal\n\n\t\tnormals.push( 0, 0, 1 );\n\n\t\t// uvs\n\n\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\tuvs.push( uv.x, uv.y );\n\n\t}\n\n\t// indices\n\n\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\tindices.push( i, i + 1, 0 );\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\tWireframeGeometry: WireframeGeometry,\n\tParametricGeometry: ParametricGeometry,\n\tParametricBufferGeometry: ParametricBufferGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\tTubeGeometry: TubeGeometry,\n\tTubeBufferGeometry: TubeBufferGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusBufferGeometry: TorusBufferGeometry,\n\tTextGeometry: TextGeometry,\n\tTextBufferGeometry: TextBufferGeometry,\n\tSphereGeometry: SphereGeometry,\n\tSphereBufferGeometry: SphereBufferGeometry,\n\tRingGeometry: RingGeometry,\n\tRingBufferGeometry: RingBufferGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPlaneBufferGeometry: PlaneBufferGeometry,\n\tLatheGeometry: LatheGeometry,\n\tLatheBufferGeometry: LatheBufferGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tShapeBufferGeometry: ShapeBufferGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tExtrudeBufferGeometry: ExtrudeBufferGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tConeGeometry: ConeGeometry,\n\tConeBufferGeometry: ConeBufferGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tCylinderBufferGeometry: CylinderBufferGeometry,\n\tCircleGeometry: CircleGeometry,\n\tCircleBufferGeometry: CircleBufferGeometry,\n\tBoxGeometry: BoxGeometry,\n\tBoxBufferGeometry: BoxBufferGeometry\n});\n\n/**\n * @author mrdoob / http://mrdoob.com/\n *\n * parameters = {\n * color: <THREE.Color>\n * }\n */\n\nfunction ShadowMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'ShadowMaterial';\n\n\tthis.color = new Color( 0x000000 );\n\tthis.transparent = true;\n\n\tthis.setValues( parameters );\n\n}\n\nShadowMaterial.prototype = Object.create( Material.prototype );\nShadowMaterial.prototype.constructor = ShadowMaterial;\n\nShadowMaterial.prototype.isShadowMaterial = true;\n\nShadowMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction RawShaderMaterial( parameters ) {\n\n\tShaderMaterial.call( this, parameters );\n\n\tthis.type = 'RawShaderMaterial';\n\n}\n\nRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\nRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\nRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n * color: <hex>,\n * roughness: <float>,\n * metalness: <float>,\n * opacity: <float>,\n *\n * map: new THREE.Texture( <Image> ),\n *\n * lightMap: new THREE.Texture( <Image> ),\n * lightMapIntensity: <float>\n *\n * aoMap: new THREE.Texture( <Image> ),\n * aoMapIntensity: <float>\n *\n * emissive: <hex>,\n * emissiveIntensity: <float>\n * emissiveMap: new THREE.Texture( <Image> ),\n *\n * bumpMap: new THREE.Texture( <Image> ),\n * bumpScale: <float>,\n *\n * normalMap: new THREE.Texture( <Image> ),\n * normalScale: <Vector2>,\n *\n * displacementMap: new THREE.Texture( <Image> ),\n * displacementScale: <float>,\n * displacementBias: <float>,\n *\n * roughnessMap: new THREE.Texture( <Image> ),\n *\n * metalnessMap: new THREE.Texture( <Image> ),\n *\n * alphaMap: new THREE.Texture( <Image> ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * envMapIntensity: <float>\n *\n * refractionRatio: <float>,\n *\n * wireframe: <boolean>,\n * wireframeLinewidth: <float>,\n *\n * skinning: <bool>,\n * morphTargets: <bool>,\n * morphNormals: <bool>\n * }\n */\n\nfunction MeshStandardMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.defines = { 'STANDARD': '' };\n\n\tthis.type = 'MeshStandardMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\tthis.roughness = 0.5;\n\tthis.metalness = 0.5;\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.roughnessMap = null;\n\n\tthis.metalnessMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.envMapIntensity = 1.0;\n\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshStandardMaterial.prototype = Object.create( Material.prototype );\nMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\nMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\nMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'STANDARD': '' };\n\n\tthis.color.copy( source.color );\n\tthis.roughness = source.roughness;\n\tthis.metalness = source.metalness;\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.roughnessMap = source.roughnessMap;\n\n\tthis.metalnessMap = source.metalnessMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.envMapIntensity = source.envMapIntensity;\n\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n * reflectivity: <float>\n * }\n */\n\nfunction MeshPhysicalMaterial( parameters ) {\n\n\tMeshStandardMaterial.call( this );\n\n\tthis.defines = { 'PHYSICAL': '' };\n\n\tthis.type = 'MeshPhysicalMaterial';\n\n\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\tthis.clearCoat = 0.0;\n\tthis.clearCoatRoughness = 0.0;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\nMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\nMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\nMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'PHYSICAL': '' };\n\n\tthis.reflectivity = source.reflectivity;\n\n\tthis.clearCoat = source.clearCoat;\n\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: <hex>,\n * specular: <hex>,\n * shininess: <float>,\n * opacity: <float>,\n *\n * map: new THREE.Texture( <Image> ),\n *\n * lightMap: new THREE.Texture( <Image> ),\n * lightMapIntensity: <float>\n *\n * aoMap: new THREE.Texture( <Image> ),\n * aoMapIntensity: <float>\n *\n * emissive: <hex>,\n * emissiveIntensity: <float>\n * emissiveMap: new THREE.Texture( <Image> ),\n *\n * bumpMap: new THREE.Texture( <Image> ),\n * bumpScale: <float>,\n *\n * normalMap: new THREE.Texture( <Image> ),\n * normalScale: <Vector2>,\n *\n * displacementMap: new THREE.Texture( <Image> ),\n * displacementScale: <float>,\n * displacementBias: <float>,\n *\n * specularMap: new THREE.Texture( <Image> ),\n *\n * alphaMap: new THREE.Texture( <Image> ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: <float>,\n * refractionRatio: <float>,\n *\n * wireframe: <boolean>,\n * wireframeLinewidth: <float>,\n *\n * skinning: <bool>,\n * morphTargets: <bool>,\n * morphNormals: <bool>\n * }\n */\n\nfunction MeshPhongMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshPhongMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\tthis.specular = new Color( 0x111111 );\n\tthis.shininess = 30;\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshPhongMaterial.prototype = Object.create( Material.prototype );\nMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\nMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\nMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\tthis.specular.copy( source.specular );\n\tthis.shininess = source.shininess;\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author takahirox / http://github.com/takahirox\n *\n * parameters = {\n * gradientMap: new THREE.Texture( <Image> )\n * }\n */\n\nfunction MeshToonMaterial( parameters ) {\n\n\tMeshPhongMaterial.call( this );\n\n\tthis.defines = { 'TOON': '' };\n\n\tthis.type = 'MeshToonMaterial';\n\n\tthis.gradientMap = null;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\nMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\nMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\nMeshToonMaterial.prototype.copy = function ( source ) {\n\n\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\tthis.gradientMap = source.gradientMap;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n * opacity: <float>,\n *\n * bumpMap: new THREE.Texture( <Image> ),\n * bumpScale: <float>,\n *\n * normalMap: new THREE.Texture( <Image> ),\n * normalScale: <Vector2>,\n *\n * displacementMap: new THREE.Texture( <Image> ),\n * displacementScale: <float>,\n * displacementBias: <float>,\n *\n * wireframe: <boolean>,\n * wireframeLinewidth: <float>\n *\n * skinning: <bool>,\n * morphTargets: <bool>,\n * morphNormals: <bool>\n * }\n */\n\nfunction MeshNormalMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshNormalMaterial';\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshNormalMaterial.prototype = Object.create( Material.prototype );\nMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\nMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\nMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: <hex>,\n * opacity: <float>,\n *\n * map: new THREE.Texture( <Image> ),\n *\n * lightMap: new THREE.Texture( <Image> ),\n * lightMapIntensity: <float>\n *\n * aoMap: new THREE.Texture( <Image> ),\n * aoMapIntensity: <float>\n *\n * emissive: <hex>,\n * emissiveIntensity: <float>\n * emissiveMap: new THREE.Texture( <Image> ),\n *\n * specularMap: new THREE.Texture( <Image> ),\n *\n * alphaMap: new THREE.Texture( <Image> ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: <float>,\n * refractionRatio: <float>,\n *\n * wireframe: <boolean>,\n * wireframeLinewidth: <float>,\n *\n * skinning: <bool>,\n * morphTargets: <bool>,\n * morphNormals: <bool>\n * }\n */\n\nfunction MeshLambertMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshLambertMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshLambertMaterial.prototype = Object.create( Material.prototype );\nMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\nMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\nMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: <hex>,\n * opacity: <float>,\n *\n * linewidth: <float>,\n *\n * scale: <float>,\n * dashSize: <float>,\n * gapSize: <float>\n * }\n */\n\nfunction LineDashedMaterial( parameters ) {\n\n\tLineBasicMaterial.call( this );\n\n\tthis.type = 'LineDashedMaterial';\n\n\tthis.scale = 1;\n\tthis.dashSize = 3;\n\tthis.gapSize = 1;\n\n\tthis.setValues( parameters );\n\n}\n\nLineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype );\nLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\nLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\nLineDashedMaterial.prototype.copy = function ( source ) {\n\n\tLineBasicMaterial.prototype.copy.call( this, source );\n\n\tthis.scale = source.scale;\n\tthis.dashSize = source.dashSize;\n\tthis.gapSize = source.gapSize;\n\n\treturn this;\n\n};\n\n\n\nvar Materials = /*#__PURE__*/Object.freeze({\n\tShadowMaterial: ShadowMaterial,\n\tSpriteMaterial: SpriteMaterial,\n\tRawShaderMaterial: RawShaderMaterial,\n\tShaderMaterial: ShaderMaterial,\n\tPointsMaterial: PointsMaterial,\n\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\tMeshStandardMaterial: MeshStandardMaterial,\n\tMeshPhongMaterial: MeshPhongMaterial,\n\tMeshToonMaterial: MeshToonMaterial,\n\tMeshNormalMaterial: MeshNormalMaterial,\n\tMeshLambertMaterial: MeshLambertMaterial,\n\tMeshDepthMaterial: MeshDepthMaterial,\n\tMeshDistanceMaterial: MeshDistanceMaterial,\n\tMeshBasicMaterial: MeshBasicMaterial,\n\tLineDashedMaterial: LineDashedMaterial,\n\tLineBasicMaterial: LineBasicMaterial,\n\tMaterial: Material\n});\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\tvar scope = this;\n\n\tvar isLoading = false;\n\tvar itemsLoaded = 0;\n\tvar itemsTotal = 0;\n\tvar urlModifier = undefined;\n\n\tthis.onStart = undefined;\n\tthis.onLoad = onLoad;\n\tthis.onProgress = onProgress;\n\tthis.onError = onError;\n\n\tthis.itemStart = function ( url ) {\n\n\t\titemsTotal ++;\n\n\t\tif ( isLoading === false ) {\n\n\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tisLoading = true;\n\n\t};\n\n\tthis.itemEnd = function ( url ) {\n\n\t\titemsLoaded ++;\n\n\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t}\n\n\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\tisLoading = false;\n\n\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\tscope.onLoad();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.itemError = function ( url ) {\n\n\t\tif ( scope.onError !== undefined ) {\n\n\t\t\tscope.onError( url );\n\n\t\t}\n\n\t};\n\n\tthis.resolveURL = function ( url ) {\n\n\t\tif ( urlModifier ) {\n\n\t\t\treturn urlModifier( url );\n\n\t\t}\n\n\t\treturn url;\n\n\t};\n\n\tthis.setURLModifier = function ( transform ) {\n\n\t\turlModifier = transform;\n\t\treturn this;\n\n\t};\n\n}\n\nvar DefaultLoadingManager = new LoadingManager();\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar loading = {};\n\nfunction FileLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( FileLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tvar scope = this;\n\n\t\tvar cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Check for data: URI\n\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\tif ( dataUriRegexResult ) {\n\n\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\tdata = window.decodeURIComponent( data );\n\n\t\t\tif ( isBase64 ) data = window.atob( data );\n\n\t\t\ttry {\n\n\t\t\t\tvar response;\n\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\tvar view = new Uint8Array( data.length );\n\n\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\tresponse = new Blob( [ view.buffer ], { type: mimeType } );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tresponse = view.buffer;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\t// Wait for next browser tick like standard XMLHttpRequest event dispatching does\n\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\t// Wait for next browser tick like standard XMLHttpRequest event dispatching does\n\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Initialise array for duplicate requests\n\n\t\t\tloading[ url ] = [];\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\tvar request = new XMLHttpRequest();\n\n\t\t\trequest.open( 'GET', url, true );\n\n\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\tvar response = this.response;\n\n\t\t\t\tCache.add( url, response );\n\n\t\t\t\tvar callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tif ( this.status === 200 || this.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( this.status === 0 ) console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( response );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tvar callbacks = loading[ url ];\n\n\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t}\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tvar callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\tfor ( var header in this.requestHeader ) {\n\n\t\t\t\trequest.setRequestHeader( header, this.requestHeader[ header ] );\n\n\t\t\t}\n\n\t\t\trequest.send( null );\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\treturn request;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t},\n\n\tsetResponseType: function ( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t},\n\n\tsetWithCredentials: function ( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t},\n\n\tsetMimeType: function ( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t},\n\n\tsetRequestHeader: function ( value ) {\n\n\t\tthis.requestHeader = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n *\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n */\n\nfunction CompressedTextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t// override in sub classes\n\tthis._parser = null;\n\n}\n\nObject.assign( CompressedTextureLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar images = [];\n\n\t\tvar texture = new CompressedTexture();\n\t\ttexture.image = images;\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author Nikos M. / https://github.com/foo123/\n *\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n */\n\nfunction DataTextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t// override in sub classes\n\tthis._parser = null;\n\n}\n\nObject.assign( DataTextureLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar texture = new DataTexture();\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\tif ( ! texData ) return;\n\n\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t}\n\n\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction ImageLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( ImageLoader.prototype, {\n\n\tcrossOrigin: 'Anonymous',\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tvar scope = this;\n\n\t\tvar cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemEnd( url );\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.substr( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction CubeTextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( CubeTextureLoader.prototype, {\n\n\tcrossOrigin: 'Anonymous',\n\n\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\tvar texture = new CubeTexture();\n\n\t\tvar loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tvar loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction TextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( TextureLoader.prototype, {\n\n\tcrossOrigin: 'Anonymous',\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar texture = new Texture();\n\n\t\tvar loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\n\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * Extensible curve object\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\n/**************************************************************\n *\tAbstract Curve base class\n **************************************************************/\n\nfunction Curve() {\n\n\tthis.type = 'Curve';\n\n\tthis.arcLengthDivisions = 200;\n\n}\n\nObject.assign( Curve.prototype, {\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint: function ( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t},\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt: function ( u, optionalTarget ) {\n\n\t\tvar t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t},\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = 5;\n\n\t\tvar points = [];\n\n\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = 5;\n\n\t\tvar points = [];\n\n\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\t// Get total curve arc length\n\n\tgetLength: function () {\n\n\t\tvar lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t},\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = this.arcLengthDivisions;\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tvar cache = [];\n\t\tvar current, last = this.getPoint( 0 );\n\t\tvar p, sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t},\n\n\tupdateArcLengths: function () {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t},\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping: function ( u, distance ) {\n\n\t\tvar arcLengths = this.getLengths();\n\n\t\tvar i = 0, il = arcLengths.length;\n\n\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tvar low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tvar lengthBefore = arcLengths[ i ];\n\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t},\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent: function ( t ) {\n\n\t\tvar delta = 0.0001;\n\t\tvar t1 = t - delta;\n\t\tvar t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tvar pt1 = this.getPoint( t1 );\n\t\tvar pt2 = this.getPoint( t2 );\n\n\t\tvar vec = pt2.clone().sub( pt1 );\n\t\treturn vec.normalize();\n\n\t},\n\n\tgetTangentAt: function ( u ) {\n\n\t\tvar t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t );\n\n\t},\n\n\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tvar normal = new Vector3();\n\n\t\tvar tangents = [];\n\t\tvar normals = [];\n\t\tvar binormals = [];\n\n\t\tvar vec = new Vector3();\n\t\tvar mat = new Matrix4();\n\n\t\tvar i, u, theta;\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tu = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\ttangents[ i ].normalize();\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tvar min = Number.MAX_VALUE;\n\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'EllipseCurve';\n\n\tthis.aX = aX || 0;\n\tthis.aY = aY || 0;\n\n\tthis.xRadius = xRadius || 1;\n\tthis.yRadius = yRadius || 1;\n\n\tthis.aStartAngle = aStartAngle || 0;\n\tthis.aEndAngle = aEndAngle || 2 * Math.PI;\n\n\tthis.aClockwise = aClockwise || false;\n\n\tthis.aRotation = aRotation || 0;\n\n}\n\nEllipseCurve.prototype = Object.create( Curve.prototype );\nEllipseCurve.prototype.constructor = EllipseCurve;\n\nEllipseCurve.prototype.isEllipseCurve = true;\n\nEllipseCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar twoPi = Math.PI * 2;\n\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t// ensures that deltaAngle is 0 .. 2 PI\n\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\tif ( samePoints ) {\n\n\t\t\tdeltaAngle = 0;\n\n\t\t} else {\n\n\t\t\tdeltaAngle = twoPi;\n\n\t\t}\n\n\t}\n\n\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\tdeltaAngle = - twoPi;\n\n\t\t} else {\n\n\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t}\n\n\t}\n\n\tvar angle = this.aStartAngle + t * deltaAngle;\n\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\tif ( this.aRotation !== 0 ) {\n\n\t\tvar cos = Math.cos( this.aRotation );\n\t\tvar sin = Math.sin( this.aRotation );\n\n\t\tvar tx = x - this.aX;\n\t\tvar ty = y - this.aY;\n\n\t\t// Rotate the point about the center of the ellipse.\n\t\tx = tx * cos - ty * sin + this.aX;\n\t\ty = tx * sin + ty * cos + this.aY;\n\n\t}\n\n\treturn point.set( x, y );\n\n};\n\nEllipseCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.aX = source.aX;\n\tthis.aY = source.aY;\n\n\tthis.xRadius = source.xRadius;\n\tthis.yRadius = source.yRadius;\n\n\tthis.aStartAngle = source.aStartAngle;\n\tthis.aEndAngle = source.aEndAngle;\n\n\tthis.aClockwise = source.aClockwise;\n\n\tthis.aRotation = source.aRotation;\n\n\treturn this;\n\n};\n\n\nEllipseCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.aX = this.aX;\n\tdata.aY = this.aY;\n\n\tdata.xRadius = this.xRadius;\n\tdata.yRadius = this.yRadius;\n\n\tdata.aStartAngle = this.aStartAngle;\n\tdata.aEndAngle = this.aEndAngle;\n\n\tdata.aClockwise = this.aClockwise;\n\n\tdata.aRotation = this.aRotation;\n\n\treturn data;\n\n};\n\nEllipseCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.aX = json.aX;\n\tthis.aY = json.aY;\n\n\tthis.xRadius = json.xRadius;\n\tthis.yRadius = json.yRadius;\n\n\tthis.aStartAngle = json.aStartAngle;\n\tthis.aEndAngle = json.aEndAngle;\n\n\tthis.aClockwise = json.aClockwise;\n\n\tthis.aRotation = json.aRotation;\n\n\treturn this;\n\n};\n\nfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\tthis.type = 'ArcCurve';\n\n}\n\nArcCurve.prototype = Object.create( EllipseCurve.prototype );\nArcCurve.prototype.constructor = ArcCurve;\n\nArcCurve.prototype.isArcCurve = true;\n\n/**\n * @author zz85 https://github.com/zz85\n *\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nvar tmp = new Vector3();\nvar px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly();\n\nfunction CatmullRomCurve3( points, closed, curveType, tension ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CatmullRomCurve3';\n\n\tthis.points = points || [];\n\tthis.closed = closed || false;\n\tthis.curveType = curveType || 'centripetal';\n\tthis.tension = tension || 0.5;\n\n}\n\nCatmullRomCurve3.prototype = Object.create( Curve.prototype );\nCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\nCatmullRomCurve3.prototype.isCatmullRomCurve3 = true;\n\nCatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tvar points = this.points;\n\tvar l = points.length;\n\n\tvar p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\tvar intPoint = Math.floor( p );\n\tvar weight = p - intPoint;\n\n\tif ( this.closed ) {\n\n\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\tintPoint = l - 2;\n\t\tweight = 1;\n\n\t}\n\n\tvar p0, p1, p2, p3; // 4 points\n\n\tif ( this.closed || intPoint > 0 ) {\n\n\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t} else {\n\n\t\t// extrapolate first point\n\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\tp0 = tmp;\n\n\t}\n\n\tp1 = points[ intPoint % l ];\n\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t} else {\n\n\t\t// extrapolate last point\n\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\tp3 = tmp;\n\n\t}\n\n\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t// init Centripetal / Chordal Catmull-Rom\n\t\tvar pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t// safety check for repeated points\n\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t}\n\n\tpoint.set(\n\t\tpx.calc( weight ),\n\t\tpy.calc( weight ),\n\t\tpz.calc( weight )\n\t);\n\n\treturn point;\n\n};\n\nCatmullRomCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\tvar point = source.points[ i ];\n\n\t\tthis.points.push( point.clone() );\n\n\t}\n\n\tthis.closed = source.closed;\n\tthis.curveType = source.curveType;\n\tthis.tension = source.tension;\n\n\treturn this;\n\n};\n\nCatmullRomCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.points = [];\n\n\tfor ( var i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\tvar point = this.points[ i ];\n\t\tdata.points.push( point.toArray() );\n\n\t}\n\n\tdata.closed = this.closed;\n\tdata.curveType = this.curveType;\n\tdata.tension = this.tension;\n\n\treturn data;\n\n};\n\nCatmullRomCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\tvar point = json.points[ i ];\n\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t}\n\n\tthis.closed = json.closed;\n\tthis.curveType = json.curveType;\n\tthis.tension = json.tension;\n\n\treturn this;\n\n};\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * Bezier Curves formulas obtained from\n * http://en.wikipedia.org/wiki/Bézier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tvar v0 = ( p2 - p0 ) * 0.5;\n\tvar v1 = ( p3 - p1 ) * 0.5;\n\tvar t2 = t * t;\n\tvar t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tvar k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tvar k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tvar k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CubicBezierCurve';\n\n\tthis.v0 = v0 || new Vector2();\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\tthis.v3 = v3 || new Vector2();\n\n}\n\nCubicBezierCurve.prototype = Object.create( Curve.prototype );\nCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\nCubicBezierCurve.prototype.isCubicBezierCurve = true;\n\nCubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\tpoint.set(\n\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t);\n\n\treturn point;\n\n};\n\nCubicBezierCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\tthis.v3.copy( source.v3 );\n\n\treturn this;\n\n};\n\nCubicBezierCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\tdata.v3 = this.v3.toArray();\n\n\treturn data;\n\n};\n\nCubicBezierCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\tthis.v3.fromArray( json.v3 );\n\n\treturn this;\n\n};\n\nfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CubicBezierCurve3';\n\n\tthis.v0 = v0 || new Vector3();\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\tthis.v3 = v3 || new Vector3();\n\n}\n\nCubicBezierCurve3.prototype = Object.create( Curve.prototype );\nCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\nCubicBezierCurve3.prototype.isCubicBezierCurve3 = true;\n\nCubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\tpoint.set(\n\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t);\n\n\treturn point;\n\n};\n\nCubicBezierCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\tthis.v3.copy( source.v3 );\n\n\treturn this;\n\n};\n\nCubicBezierCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\tdata.v3 = this.v3.toArray();\n\n\treturn data;\n\n};\n\nCubicBezierCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\tthis.v3.fromArray( json.v3 );\n\n\treturn this;\n\n};\n\nfunction LineCurve( v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'LineCurve';\n\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\n}\n\nLineCurve.prototype = Object.create( Curve.prototype );\nLineCurve.prototype.constructor = LineCurve;\n\nLineCurve.prototype.isLineCurve = true;\n\nLineCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tif ( t === 1 ) {\n\n\t\tpoint.copy( this.v2 );\n\n\t} else {\n\n\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t}\n\n\treturn point;\n\n};\n\n// Line curve is linear, so we can overwrite default getPointAt\n\nLineCurve.prototype.getPointAt = function ( u, optionalTarget ) {\n\n\treturn this.getPoint( u, optionalTarget );\n\n};\n\nLineCurve.prototype.getTangent = function ( /* t */ ) {\n\n\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\treturn tangent.normalize();\n\n};\n\nLineCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nLineCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nLineCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction LineCurve3( v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'LineCurve3';\n\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\n}\n\nLineCurve3.prototype = Object.create( Curve.prototype );\nLineCurve3.prototype.constructor = LineCurve3;\n\nLineCurve3.prototype.isLineCurve3 = true;\n\nLineCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tif ( t === 1 ) {\n\n\t\tpoint.copy( this.v2 );\n\n\t} else {\n\n\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t}\n\n\treturn point;\n\n};\n\n// Line curve is linear, so we can overwrite default getPointAt\n\nLineCurve3.prototype.getPointAt = function ( u, optionalTarget ) {\n\n\treturn this.getPoint( u, optionalTarget );\n\n};\n\nLineCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nLineCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nLineCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'QuadraticBezierCurve';\n\n\tthis.v0 = v0 || new Vector2();\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\n}\n\nQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\nQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\nQuadraticBezierCurve.prototype.isQuadraticBezierCurve = true;\n\nQuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\tpoint.set(\n\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t);\n\n\treturn point;\n\n};\n\nQuadraticBezierCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nQuadraticBezierCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nQuadraticBezierCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'QuadraticBezierCurve3';\n\n\tthis.v0 = v0 || new Vector3();\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\n}\n\nQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\nQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\nQuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;\n\nQuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\tpoint.set(\n\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t);\n\n\treturn point;\n\n};\n\nQuadraticBezierCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nQuadraticBezierCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nQuadraticBezierCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'SplineCurve';\n\n\tthis.points = points || [];\n\n}\n\nSplineCurve.prototype = Object.create( Curve.prototype );\nSplineCurve.prototype.constructor = SplineCurve;\n\nSplineCurve.prototype.isSplineCurve = true;\n\nSplineCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar points = this.points;\n\tvar p = ( points.length - 1 ) * t;\n\n\tvar intPoint = Math.floor( p );\n\tvar weight = p - intPoint;\n\n\tvar p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\tvar p1 = points[ intPoint ];\n\tvar p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\tvar p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\tpoint.set(\n\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t);\n\n\treturn point;\n\n};\n\nSplineCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\tvar point = source.points[ i ];\n\n\t\tthis.points.push( point.clone() );\n\n\t}\n\n\treturn this;\n\n};\n\nSplineCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.points = [];\n\n\tfor ( var i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\tvar point = this.points[ i ];\n\t\tdata.points.push( point.toArray() );\n\n\t}\n\n\treturn data;\n\n};\n\nSplineCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\tvar point = json.points[ i ];\n\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t}\n\n\treturn this;\n\n};\n\n\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n **/\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n * curves, but retains the api of a curve\n **************************************************************/\n\nfunction CurvePath() {\n\n\tCurve.call( this );\n\n\tthis.type = 'CurvePath';\n\n\tthis.curves = [];\n\tthis.autoClose = false; // Automatically closes the path\n\n}\n\nCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\tconstructor: CurvePath,\n\n\tadd: function ( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t},\n\n\tclosePath: function () {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t}\n\n\t},\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint: function ( t ) {\n\n\t\tvar d = t * this.getLength();\n\t\tvar curveLengths = this.getCurveLengths();\n\t\tvar i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 <d\n\n\t},\n\n\t// We cannot use the default THREE.Curve getPoint() with getLength() because in\n\t// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath\n\t// getPoint() depends on getLength\n\n\tgetLength: function () {\n\n\t\tvar lens = this.getCurveLengths();\n\t\treturn lens[ lens.length - 1 ];\n\n\t},\n\n\t// cacheLengths must be recalculated.\n\tupdateArcLengths: function () {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.cacheLengths = null;\n\t\tthis.getCurveLengths();\n\n\t},\n\n\t// Compute lengths and cache them\n\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\n\tgetCurveLengths: function () {\n\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tvar lengths = [], sums = 0;\n\n\t\tfor ( var i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t},\n\n\tgetSpacedPoints: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = 40;\n\n\t\tvar points = [];\n\n\t\tfor ( var i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\tgetPoints: function ( divisions ) {\n\n\t\tdivisions = divisions || 12;\n\n\t\tvar points = [], last;\n\n\t\tfor ( var i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tvar curve = curves[ i ];\n\t\t\tvar resolution = ( curve && curve.isEllipseCurve ) ? divisions * 2\n\t\t\t\t: ( curve && curve.isLineCurve ) ? 1\n\t\t\t\t\t: ( curve && curve.isSplineCurve ) ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tvar pts = curve.getPoints( resolution );\n\n\t\t\tfor ( var j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tvar point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tCurve.prototype.copy.call( this, source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( var i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tvar curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = Curve.prototype.toJSON.call( this );\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( var i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tvar curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tCurve.prototype.fromJSON.call( this, json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( var i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tvar curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * Creates free form 2d path using series of points, lines or curves.\n **/\n\nfunction Path( points ) {\n\n\tCurvePath.call( this );\n\n\tthis.type = 'Path';\n\n\tthis.currentPoint = new Vector2();\n\n\tif ( points ) {\n\n\t\tthis.setFromPoints( points );\n\n\t}\n\n}\n\nPath.prototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\tconstructor: Path,\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( var i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t},\n\n\tmoveTo: function ( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t},\n\n\tlineTo: function ( x, y ) {\n\n\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t},\n\n\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\tvar curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t},\n\n\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tvar curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t},\n\n\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tvar curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t},\n\n\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tvar x0 = this.currentPoint.x;\n\t\tvar y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t},\n\n\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t},\n\n\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tvar x0 = this.currentPoint.x;\n\t\tvar y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t},\n\n\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tvar lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tCurvePath.prototype.copy.call( this, source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = CurvePath.prototype.toJSON.call( this );\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tCurvePath.prototype.fromJSON.call( this, json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * Defines a 2d shape plane using paths.\n **/\n\n// STEP 1 Create a path.\n// STEP 2 Turn path into shape.\n// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n// STEP 3a - Extract points from each shape, turn to vertices\n// STEP 3b - Triangulate each shape, add faces.\n\nfunction Shape( points ) {\n\n\tPath.call( this, points );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.type = 'Shape';\n\n\tthis.holes = [];\n\n}\n\nShape.prototype = Object.assign( Object.create( Path.prototype ), {\n\n\tconstructor: Shape,\n\n\tgetPointsHoles: function ( divisions ) {\n\n\t\tvar holesPts = [];\n\n\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t},\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints: function ( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tPath.prototype.copy.call( this, source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( var i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tvar hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = Path.prototype.toJSON.call( this );\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tvar hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tPath.prototype.fromJSON.call( this, json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( var i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tvar hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Light( color, intensity ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Light';\n\n\tthis.color = new Color( color );\n\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\tthis.receiveShadow = undefined;\n\n}\n\nLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Light,\n\n\tisLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\tLight.call( this, skyColor, intensity );\n\n\tthis.type = 'HemisphereLight';\n\n\tthis.castShadow = undefined;\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.groundColor = new Color( groundColor );\n\n}\n\nHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: HemisphereLight,\n\n\tisHemisphereLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LightShadow( camera ) {\n\n\tthis.camera = camera;\n\n\tthis.bias = 0;\n\tthis.radius = 1;\n\n\tthis.mapSize = new Vector2( 512, 512 );\n\n\tthis.map = null;\n\tthis.matrix = new Matrix4();\n\n}\n\nObject.assign( LightShadow.prototype, {\n\n\tcopy: function ( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction SpotLightShadow() {\n\n\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n}\n\nSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: SpotLightShadow,\n\n\tisSpotLightShadow: true,\n\n\tupdate: function ( light ) {\n\n\t\tvar camera = this.camera;\n\n\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\tvar far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'SpotLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.target = new Object3D();\n\n\tObject.defineProperty( this, 'power', {\n\t\tget: function () {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\treturn this.intensity * Math.PI;\n\n\t\t},\n\t\tset: function ( power ) {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\tthis.intensity = power / Math.PI;\n\n\t\t}\n\t} );\n\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\tthis.shadow = new SpotLightShadow();\n\n}\n\nSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: SpotLight,\n\n\tisSpotLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction PointLight( color, intensity, distance, decay ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'PointLight';\n\n\tObject.defineProperty( this, 'power', {\n\t\tget: function () {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t},\n\t\tset: function ( power ) {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t\t}\n\t} );\n\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n}\n\nPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: PointLight,\n\n\tisPointLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction DirectionalLightShadow( ) {\n\n\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n}\n\nDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: DirectionalLightShadow\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction DirectionalLight( color, intensity ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'DirectionalLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.target = new Object3D();\n\n\tthis.shadow = new DirectionalLightShadow();\n\n}\n\nDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: DirectionalLight,\n\n\tisDirectionalLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AmbientLight( color, intensity ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'AmbientLight';\n\n\tthis.castShadow = undefined;\n\n}\n\nAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: AmbientLight,\n\n\tisAmbientLight: true\n\n} );\n\n/**\n * @author abelnation / http://github.com/abelnation\n */\n\nfunction RectAreaLight( color, intensity, width, height ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'RectAreaLight';\n\n\tthis.width = ( width !== undefined ) ? width : 10;\n\tthis.height = ( height !== undefined ) ? height : 10;\n\n}\n\nRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: RectAreaLight,\n\n\tisRectAreaLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Light.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n *\n * A Track that interpolates Strings\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nStringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: StringKeyframeTrack,\n\n\tValueTypeName: 'string',\n\tValueBufferType: Array,\n\n\tDefaultInterpolation: InterpolateDiscrete,\n\n\tInterpolantFactoryMethodLinear: undefined,\n\n\tInterpolantFactoryMethodSmooth: undefined\n\n} );\n\n/**\n *\n * A Track of Boolean keyframe values.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction BooleanKeyframeTrack( name, times, values ) {\n\n\tKeyframeTrack.call( this, name, times, values );\n\n}\n\nBooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: BooleanKeyframeTrack,\n\n\tValueTypeName: 'bool',\n\tValueBufferType: Array,\n\n\tDefaultInterpolation: InterpolateDiscrete,\n\n\tInterpolantFactoryMethodLinear: undefined,\n\tInterpolantFactoryMethodSmooth: undefined\n\n\t// Note: Actually this track could have a optimized / compressed\n\t// representation of a single value and a custom interpolant that\n\t// computes \"firstValue ^ isOdd( index )\".\n\n} );\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n * @author tschw\n */\n\nfunction Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tthis.parameterPositions = parameterPositions;\n\tthis._cachedIndex = 0;\n\n\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\tthis.sampleValues = sampleValues;\n\tthis.valueSize = sampleSize;\n\n}\n\nObject.assign( Interpolant.prototype, {\n\n\tevaluate: function ( t ) {\n\n\t\tvar pp = this.parameterPositions,\n\t\t\ti1 = this._cachedIndex,\n\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tvar right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t},\n\n\tsettings: null, // optional, subclass-specific settings structure\n\t// Note: The indirection allows central control of many interpolants.\n\n\t// --- Protected interface\n\n\tDefaultSettings_: {},\n\n\tgetSettings_: function () {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t},\n\n\tcopySampleValue_: function ( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// Template methods for derived classes:\n\n\tinterpolate_: function ( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t},\n\n\tintervalChanged_: function ( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n} );\n\n//!\\ DECLARE ALIAS AFTER assign prototype !\nObject.assign( Interpolant.prototype, {\n\n\t//( 0, t, t0 ), returns this.resultBuffer\n\tbeforeStart_: Interpolant.prototype.copySampleValue_,\n\n\t//( N-1, tN-1, t ), returns this.resultBuffer\n\tafterEnd_: Interpolant.prototype.copySampleValue_,\n\n} );\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @author tschw\n */\n\nfunction QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nQuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: QuaternionLinearInterpolant,\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset = i1 * stride,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n *\n * A Track of quaternion keyframe values.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nQuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: QuaternionKeyframeTrack,\n\n\tValueTypeName: 'quaternion',\n\n\t// ValueBufferType is inherited\n\n\tDefaultInterpolation: InterpolateLinear,\n\n\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n} );\n\n/**\n *\n * A Track of keyframe values that represent color.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: ColorKeyframeTrack,\n\n\tValueTypeName: 'color'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n\t// Note: Very basic implementation and nothing special yet.\n\t// However, this is the place for color space parameterization.\n\n} );\n\n/**\n *\n * A Track of numeric keyframe values.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nNumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: NumberKeyframeTrack,\n\n\tValueTypeName: 'number'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n} );\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @author tschw\n */\n\nfunction CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\tthis._weightPrev = - 0;\n\tthis._offsetPrev = - 0;\n\tthis._weightNext = - 0;\n\tthis._offsetNext = - 0;\n\n}\n\nCubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: CubicInterpolant,\n\n\tDefaultSettings_: {\n\n\t\tendingStart: ZeroCurvatureEnding,\n\t\tendingEnd: ZeroCurvatureEnding\n\n\t},\n\n\tintervalChanged_: function ( i1, t0, t1 ) {\n\n\t\tvar pp = this.parameterPositions,\n\t\t\tiPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t},\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tvar s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tvar s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n * @author tschw\n */\n\nfunction LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: LinearInterpolant,\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceeding\n * the parameter.\n *\n * @author tschw\n */\n\nfunction DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nDiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: DiscreteInterpolant,\n\n\tinterpolate_: function ( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n} );\n\n/**\n * @author tschw\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n */\n\nvar AnimationUtils = {\n\n\t// same as Array.prototype.slice, but also works on typed arrays\n\tarraySlice: function ( array, from, to ) {\n\n\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\t\treturn new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );\n\n\t\t}\n\n\t\treturn array.slice( from, to );\n\n\t},\n\n\t// converts an array to a specific type\n\tconvertArray: function ( array, type, forceClone ) {\n\n\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\treturn new type( array ); // create typed array\n\n\t\t}\n\n\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t},\n\n\tisTypedArray: function ( object ) {\n\n\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t! ( object instanceof DataView );\n\n\t},\n\n\t// returns an array by which times and values can be sorted\n\tgetKeyframeOrder: function ( times ) {\n\n\t\tfunction compareTime( i, j ) {\n\n\t\t\treturn times[ i ] - times[ j ];\n\n\t\t}\n\n\t\tvar n = times.length;\n\t\tvar result = new Array( n );\n\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\tresult.sort( compareTime );\n\n\t\treturn result;\n\n\t},\n\n\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\tsortedArray: function ( values, stride, order ) {\n\n\t\tvar nValues = values.length;\n\t\tvar result = new values.constructor( nValues );\n\n\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// function for parsing AOS keyframe formats\n\tflattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t}\n\n\t\tif ( key === undefined ) return; // no data\n\n\t\tvar value = key[ valuePropertyName ];\n\t\tif ( value === undefined ) return; // no data\n\n\t\tif ( Array.isArray( value ) ) {\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else if ( value.toArray !== undefined ) {\n\n\t\t\t// ...assume THREE.Math-ish\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else {\n\n\t\t\t// otherwise push as-is\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t}\n\n\t}\n\n};\n\n/**\n *\n * A timed sequence of keyframes for a specific property.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\tthis.name = name;\n\n\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\tthis.validate();\n\tthis.optimize();\n\n}\n\n// Static methods:\n\nObject.assign( KeyframeTrack, {\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\tparse: function ( json ) {\n\n\t\tif ( json.type === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t\t}\n\n\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\tif ( json.times === undefined ) {\n\n\t\t\tvar times = [], values = [];\n\n\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\tjson.times = times;\n\t\t\tjson.values = values;\n\n\t\t}\n\n\t\t// derived classes can define a static parse method\n\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\treturn trackType.parse( json );\n\n\t\t} else {\n\n\t\t\t// by default, we assume a constructor compatible with the base\n\t\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( track ) {\n\n\t\tvar trackType = track.constructor;\n\n\t\tvar json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t},\n\n\t_getTrackTypeForValueTypeName: function ( typeName ) {\n\n\t\tswitch ( typeName.toLowerCase() ) {\n\n\t\t\tcase 'scalar':\n\t\t\tcase 'double':\n\t\t\tcase 'float':\n\t\t\tcase 'number':\n\t\t\tcase 'integer':\n\n\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\tcase 'vector':\n\t\t\tcase 'vector2':\n\t\t\tcase 'vector3':\n\t\t\tcase 'vector4':\n\n\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\tcase 'color':\n\n\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\tcase 'quaternion':\n\n\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\tcase 'bool':\n\t\t\tcase 'boolean':\n\n\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\tcase 'string':\n\n\t\t\t\treturn StringKeyframeTrack;\n\n\t\t}\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n\t}\n\n} );\n\nObject.assign( KeyframeTrack.prototype, {\n\n\tconstructor: KeyframeTrack,\n\n\tTimeBufferType: Float32Array,\n\n\tValueBufferType: Float32Array,\n\n\tDefaultInterpolation: InterpolateLinear,\n\n\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tsetInterpolation: function ( interpolation ) {\n\n\t\tvar factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t},\n\n\tgetInterpolation: function () {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t},\n\n\tgetValueSize: function () {\n\n\t\treturn this.values.length / this.times.length;\n\n\t},\n\n\t// move all keyframes either forwards or backwards in time\n\tshift: function ( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tvar times = this.times;\n\n\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale: function ( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tvar times = this.times;\n\n\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim: function ( startTime, endTime ) {\n\n\t\tvar times = this.times,\n\t\t\tnKeys = times.length,\n\t\t\tfrom = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== - 1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\tvar stride = this.getValueSize();\n\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\tthis.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate: function () {\n\n\t\tvar valid = true;\n\n\t\tvar valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tvar times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tvar prevTime = null;\n\n\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tvar currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t},\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize: function () {\n\n\t\tvar times = this.times,\n\t\t\tvalues = this.values,\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\twriteIndex = 1,\n\t\t\tlastIndex = times.length - 1;\n\n\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tvar keep = false;\n\n\t\t\tvar time = times[ i ];\n\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n *\n * A Track of vectored keyframe values.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nVectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: VectorKeyframeTrack,\n\n\tValueTypeName: 'vector'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n} );\n\n/**\n *\n * Reusable set of Tracks that represent an animation.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n */\n\nfunction AnimationClip( name, duration, tracks ) {\n\n\tthis.name = name;\n\tthis.tracks = tracks;\n\tthis.duration = ( duration !== undefined ) ? duration : - 1;\n\n\tthis.uuid = _Math.generateUUID();\n\n\t// this means it should figure out its duration by scanning the tracks\n\tif ( this.duration < 0 ) {\n\n\t\tthis.resetDuration();\n\n\t}\n\n\tthis.optimize();\n\n}\n\nObject.assign( AnimationClip, {\n\n\tparse: function ( json ) {\n\n\t\tvar tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t},\n\n\ttoJSON: function ( clip ) {\n\n\t\tvar tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tvar json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid\n\n\t\t};\n\n\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t},\n\n\tCreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\tvar tracks = [];\n\n\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tvar times = [];\n\t\t\tvar values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new AnimationClip( name, - 1, tracks );\n\n\t},\n\n\tfindByName: function ( objectOrClipArray, name ) {\n\n\t\tvar clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tvar o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\tCreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) {\n\n\t\tvar animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar clips = [];\n\n\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t},\n\n\t// parse the animation.hierarchy format\n\tparseAnimation: function ( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tvar tracks = [];\n\n\t\tvar clipName = animation.name || 'default';\n\t\t// automatic length determination in AnimationClip.\n\t\tvar duration = animation.length || - 1;\n\t\tvar fps = animation.fps || 30;\n\n\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tvar morphTargetNames = {};\n\n\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tfor ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tvar animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\treturn clip;\n\n\t}\n\n} );\n\nObject.assign( AnimationClip.prototype, {\n\n\tresetDuration: function () {\n\n\t\tvar tracks = this.tracks, duration = 0;\n\n\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tvar track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t},\n\n\ttrim: function () {\n\n\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\toptimize: function () {\n\n\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction MaterialLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\tthis.textures = {};\n\n}\n\nObject.assign( MaterialLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tsetTextures: function ( value ) {\n\n\t\tthis.textures = value;\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tvar textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tvar material = new Materials[ json.type ]();\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== 1 ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\t// Deprecated\n\n\t\tif ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\tmaterial.transparent = true;\n\n\t\t}\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tvar normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\treturn material;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction BufferGeometryLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( BufferGeometryLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tvar attributes = json.data.attributes;\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tvar attribute = attributes[ key ];\n\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t}\n\n\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tvar center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n} );\n\nvar TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\t// Workaround for IE11 pre KB2929437. See #11440\n\tUint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Loader() {}\n\nLoader.Handlers = {\n\n\thandlers: [],\n\n\tadd: function ( regex, loader ) {\n\n\t\tthis.handlers.push( regex, loader );\n\n\t},\n\n\tget: function ( file ) {\n\n\t\tvar handlers = this.handlers;\n\n\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\tvar regex = handlers[ i ];\n\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\treturn loader;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n};\n\nObject.assign( Loader.prototype, {\n\n\tcrossOrigin: undefined,\n\n\tonLoadStart: function () {},\n\n\tonLoadProgress: function () {},\n\n\tonLoadComplete: function () {},\n\n\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\tvar array = [];\n\n\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t}\n\n\t\treturn array;\n\n\t},\n\n\tcreateMaterial: ( function () {\n\n\t\tvar BlendingMode = {\n\t\t\tNoBlending: NoBlending,\n\t\t\tNormalBlending: NormalBlending,\n\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\tCustomBlending: CustomBlending\n\t\t};\n\n\t\tvar color = new Color();\n\t\tvar textureLoader = new TextureLoader();\n\t\tvar materialLoader = new MaterialLoader();\n\n\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t// convert from old material format\n\n\t\t\tvar textures = {};\n\n\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\tvar texture;\n\n\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t}\n\n\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t}\n\n\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t}\n\n\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\treturn uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar json = {\n\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t};\n\n\t\t\tfor ( var name in m ) {\n\n\t\t\t\tvar value = m[ name ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\tjson.normalScale = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\tcase 'opacity':\n\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\tcase 'transparent':\n\t\t\t\t\tcase 'visible':\n\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\treturn materialLoader.parse( json );\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * @author Don McCurdy / https://www.donmccurdy.com\n */\n\nvar LoaderUtils = {\n\n\tdecodeText: function ( array ) {\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tvar s = '';\n\n\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\t// Merges multi-byte utf-8 characters.\n\t\treturn decodeURIComponent( escape( s ) );\n\n\t},\n\n\textractUrlBase: function ( url ) {\n\n\t\tvar index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.substr( 0, index + 1 );\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction JSONLoader( manager ) {\n\n\tif ( typeof manager === 'boolean' ) {\n\n\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\tmanager = undefined;\n\n\t}\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\tthis.withCredentials = false;\n\n}\n\nObject.assign( JSONLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === 'string' ) ? this.texturePath : LoaderUtils.extractUrlBase( url );\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json = JSON.parse( text );\n\t\t\tvar metadata = json.metadata;\n\n\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\tvar type = metadata.type;\n\n\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tsetTexturePath: function ( value ) {\n\n\t\tthis.texturePath = value;\n\n\t},\n\n\tparse: ( function () {\n\n\t\tfunction parseModel( json, geometry ) {\n\n\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t}\n\n\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tscale = json.scale,\n\n\t\t\t\tnUvLayers = 0;\n\n\n\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t// disregard empty arrays\n\n\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toffset = 0;\n\t\t\tzLength = vertices.length;\n\n\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\tvertex = new Vector3();\n\n\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t}\n\n\t\t\toffset = 0;\n\t\t\tzLength = faces.length;\n\n\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\ttype = faces[ offset ++ ];\n\n\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\thasFaceColor = isBitSet( type, 6 );\n\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\toffset += 4;\n\n\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface = new Face3();\n\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseSkin( json, geometry ) {\n\n\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.bones = json.bones;\n\n\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseMorphing( json, geometry ) {\n\n\t\t\tvar scale = json.scale;\n\n\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\tvar faces = geometry.faces;\n\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseAnimations( json, geometry ) {\n\n\t\t\tvar outputAnimations = [];\n\n\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\tvar animations = [];\n\n\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\tanimations.push( json.animation );\n\n\t\t\t}\n\n\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t}\n\n\t\t\t// parse implicit morph animations\n\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t}\n\n\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t}\n\n\t\treturn function parse( json, texturePath ) {\n\n\t\t\tif ( json.data !== undefined ) {\n\n\t\t\t\t// Geometry 4.0 spec\n\t\t\t\tjson = json.data;\n\n\t\t\t}\n\n\t\t\tif ( json.scale !== undefined ) {\n\n\t\t\t\tjson.scale = 1.0 / json.scale;\n\n\t\t\t} else {\n\n\t\t\t\tjson.scale = 1.0;\n\n\t\t\t}\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tparseModel( json, geometry );\n\t\t\tparseSkin( json, geometry );\n\t\t\tparseMorphing( json, geometry );\n\t\t\tparseAnimations( json, geometry );\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction ObjectLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\tthis.texturePath = '';\n\n}\n\nObject.assign( ObjectLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.texturePath === '' ) {\n\n\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t}\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url + '. Use THREE.JSONLoader instead.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tsetTexturePath: function ( value ) {\n\n\t\tthis.texturePath = value;\n\t\treturn this;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tparse: function ( json, onLoad ) {\n\n\t\tvar shapes = this.parseShape( json.shapes );\n\t\tvar geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tvar textures = this.parseTextures( json.textures, images );\n\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\tif ( json.animations ) {\n\n\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t}\n\n\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t},\n\n\tparseShape: function ( json ) {\n\n\t\tvar shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t},\n\n\tparseGeometries: function ( json, shapes ) {\n\n\t\tvar geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar geometry;\n\t\t\t\tvar data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\tcase 'DodecahedronBufferGeometry':\n\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\tcase 'IcosahedronBufferGeometry':\n\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\tcase 'OctahedronBufferGeometry':\n\t\t\t\t\tcase 'TetrahedronGeometry':\n\t\t\t\t\tcase 'TetrahedronBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PolyhedronGeometry':\n\t\t\t\t\tcase 'PolyhedronBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.vertices,\n\t\t\t\t\t\t\tdata.indices,\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.details\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ShapeGeometry':\n\t\t\t\t\tcase 'ShapeBufferGeometry':\n\n\t\t\t\t\t\tvar geometryShapes = [];\n\n\t\t\t\t\t\tfor ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tvar shape = shapes[ data.shapes[ j ] ];\n\n\t\t\t\t\t\t\tgeometryShapes.push( shape );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tgeometryShapes,\n\t\t\t\t\t\t\tdata.curveSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\tcase 'ExtrudeGeometry':\n\t\t\t\t\tcase 'ExtrudeBufferGeometry':\n\n\t\t\t\t\t\tvar geometryShapes = [];\n\n\t\t\t\t\t\tfor ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tvar shape = shapes[ data.shapes[ j ] ];\n\n\t\t\t\t\t\t\tgeometryShapes.push( shape );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar extrudePath = data.options.extrudePath;\n\n\t\t\t\t\t\tif ( extrudePath !== undefined ) {\n\n\t\t\t\t\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tgeometryShapes,\n\t\t\t\t\t\t\tdata.options\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\tgeometry = geometryLoader.parse( data, this.texturePath ).geometry;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t},\n\n\tparseMaterials: function ( json, textures ) {\n\n\t\tvar materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tvar loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar data = json[ i ];\n\n\t\t\t\tif ( data.type === 'MultiMaterial' ) {\n\n\t\t\t\t\t// Deprecated\n\n\t\t\t\t\tvar array = [];\n\n\t\t\t\t\tfor ( var j = 0; j < data.materials.length; j ++ ) {\n\n\t\t\t\t\t\tarray.push( loader.parse( data.materials[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = array;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterials[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t},\n\n\tparseAnimations: function ( json ) {\n\n\t\tvar animations = [];\n\n\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\tvar data = json[ i ];\n\n\t\t\tvar clip = AnimationClip.parse( data );\n\n\t\t\tif ( data.uuid !== undefined ) clip.uuid = data.uuid;\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t},\n\n\tparseImages: function ( json, onLoad ) {\n\n\t\tvar scope = this;\n\t\tvar images = {};\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\tvar loader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar image = json[ i ];\n\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t},\n\n\tparseTextures: function ( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tvar textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t},\n\n\tparseObject: function ( data, geometries, materials ) {\n\n\t\tvar object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tvar array = [];\n\n\t\t\t\tfor ( var i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' );\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tvar children = data.children;\n\n\t\t\tfor ( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tvar levels = data.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tvar level = levels[ l ];\n\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n} );\n\nvar TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tSphericalReflectionMapping: SphericalReflectionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\tCubeUVRefractionMapping: CubeUVRefractionMapping\n};\n\nvar TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nvar TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n};\n\n/**\n * @author thespite / http://clicktorelease.com/\n */\n\n\nfunction ImageBitmapLoader( manager ) {\n\n\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t}\n\n\tif ( typeof fetch === 'undefined' ) {\n\n\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t}\n\n\tthis.manager = manager !== undefined ? manager : DefaultLoadingManager;\n\tthis.options = undefined;\n\n}\n\nImageBitmapLoader.prototype = {\n\n\tconstructor: ImageBitmapLoader,\n\n\tsetOptions: function setOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t},\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tvar scope = this;\n\n\t\tvar cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tfetch( url ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, scope.options );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tscope.manager.itemEnd( url );\n\t\t\tscope.manager.itemError( url );\n\n\t\t} );\n\n\t},\n\n\tsetCrossOrigin: function ( /* value */ ) {\n\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n};\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n **/\n\nfunction ShapePath() {\n\n\tthis.type = 'ShapePath';\n\n\tthis.color = new Color();\n\n\tthis.subPaths = [];\n\tthis.currentPath = null;\n\n}\n\nObject.assign( ShapePath.prototype, {\n\n\tmoveTo: function ( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t},\n\n\tlineTo: function ( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t},\n\n\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t},\n\n\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t},\n\n\tsplineThru: function ( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t},\n\n\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tvar inside = false;\n\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\tvar subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tvar betterShapeHoles = [];\n\t\tvar newShapes = [];\n\t\tvar newShapeHoles = [];\n\t\tvar mainIdx = 0;\n\t\tvar tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tvar ambiguous = false;\n\t\t\tvar toChange = [];\n\n\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar tmpHoles;\n\n\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction Font( data ) {\n\n\tthis.type = 'Font';\n\n\tthis.data = data;\n\n}\n\nObject.assign( Font.prototype, {\n\n\tisFont: true,\n\n\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\tif ( size === undefined ) size = 100;\n\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\tvar shapes = [];\n\t\tvar paths = createPaths( text, size, divisions, this.data );\n\n\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\nfunction createPaths( text, size, divisions, data ) {\n\n\tvar chars = Array.from ? Array.from( text ) : String( text ).split( '' ); // see #13988\n\tvar scale = size / data.resolution;\n\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tvar paths = [];\n\n\tvar offsetX = 0, offsetY = 0;\n\n\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\tvar char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tvar ret = createPath( char, divisions, scale, offsetX, offsetY, data );\n\t\t\toffsetX += ret.offsetX;\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, divisions, scale, offsetX, offsetY, data ) {\n\n\tvar glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) return;\n\n\tvar path = new ShapePath();\n\n\tvar x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\tvar action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction FontLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( FontLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t}\n\n\t\t\tvar font = scope.parse( json );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\treturn new Font( json );\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar context;\n\nvar AudioContext = {\n\n\tgetContext: function () {\n\n\t\tif ( context === undefined ) {\n\n\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn context;\n\n\t},\n\n\tsetContext: function ( value ) {\n\n\t\tcontext = value;\n\n\t}\n\n};\n\n/**\n * @author Reece Aaron Lecrivain / http://reecenotes.com/\n */\n\nfunction AudioLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( AudioLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tvar context = AudioContext.getContext();\n\n\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t} );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction StereoCamera() {\n\n\tthis.type = 'StereoCamera';\n\n\tthis.aspect = 1;\n\n\tthis.eyeSep = 0.064;\n\n\tthis.cameraL = new PerspectiveCamera();\n\tthis.cameraL.layers.enable( 1 );\n\tthis.cameraL.matrixAutoUpdate = false;\n\n\tthis.cameraR = new PerspectiveCamera();\n\tthis.cameraR.layers.enable( 2 );\n\tthis.cameraR.matrixAutoUpdate = false;\n\n}\n\nObject.assign( StereoCamera.prototype, {\n\n\tupdate: ( function () {\n\n\t\tvar instance, focus, fov, aspect, near, far, zoom, eyeSep;\n\n\t\tvar eyeRight = new Matrix4();\n\t\tvar eyeLeft = new Matrix4();\n\n\t\treturn function update( camera ) {\n\n\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep;\n\n\t\t\tif ( needsUpdate ) {\n\n\t\t\t\tinstance = this;\n\t\t\t\tfocus = camera.focus;\n\t\t\t\tfov = camera.fov;\n\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\tnear = camera.near;\n\t\t\t\tfar = camera.far;\n\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\teyeSep = this.eyeSep / 2;\n\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t// translate xOffset\n\n\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t// for left eye\n\n\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t// for right eye\n\n\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t}\n\n\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * Camera for rendering cube maps\n *\t- renders scene into axis-aligned cube\n *\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction CubeCamera( near, far, cubeResolution ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'CubeCamera';\n\n\tvar fov = 90, aspect = 1;\n\n\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPX.up.set( 0, - 1, 0 );\n\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\tthis.add( cameraPX );\n\n\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNX.up.set( 0, - 1, 0 );\n\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\tthis.add( cameraNX );\n\n\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPY.up.set( 0, 0, 1 );\n\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\tthis.add( cameraPY );\n\n\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNY.up.set( 0, 0, - 1 );\n\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\tthis.add( cameraNY );\n\n\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPZ.up.set( 0, - 1, 0 );\n\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\tthis.add( cameraPZ );\n\n\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNZ.up.set( 0, - 1, 0 );\n\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\tthis.add( cameraNZ );\n\n\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\tthis.renderTarget.texture.name = \"CubeCamera\";\n\n\tthis.update = function ( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tvar renderTarget = this.renderTarget;\n\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderTarget.activeCubeFace = 0;\n\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\trenderTarget.activeCubeFace = 1;\n\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\trenderTarget.activeCubeFace = 2;\n\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\trenderTarget.activeCubeFace = 3;\n\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\trenderTarget.activeCubeFace = 4;\n\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderTarget.activeCubeFace = 5;\n\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\trenderer.setRenderTarget( null );\n\n\t};\n\n\tthis.clear = function ( renderer, color, depth, stencil ) {\n\n\t\tvar renderTarget = this.renderTarget;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\trenderTarget.activeCubeFace = i;\n\t\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( null );\n\n\t};\n\n}\n\nCubeCamera.prototype = Object.create( Object3D.prototype );\nCubeCamera.prototype.constructor = CubeCamera;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AudioListener() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'AudioListener';\n\n\tthis.context = AudioContext.getContext();\n\n\tthis.gain = this.context.createGain();\n\tthis.gain.connect( this.context.destination );\n\n\tthis.filter = null;\n\n}\n\nAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: AudioListener,\n\n\tgetInput: function () {\n\n\t\treturn this.gain;\n\n\t},\n\n\tremoveFilter: function ( ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t},\n\n\tgetFilter: function () {\n\n\t\treturn this.filter;\n\n\t},\n\n\tsetFilter: function ( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t},\n\n\tgetMasterVolume: function () {\n\n\t\treturn this.gain.gain.value;\n\n\t},\n\n\tsetMasterVolume: function ( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t},\n\n\tupdateMatrixWorld: ( function () {\n\n\t\tvar position = new Vector3();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3();\n\n\t\tvar orientation = new Vector3();\n\n\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\tvar listener = this.context.listener;\n\t\t\tvar up = this.up;\n\n\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\tif ( listener.positionX ) {\n\n\t\t\t\tlistener.positionX.setValueAtTime( position.x, this.context.currentTime );\n\t\t\t\tlistener.positionY.setValueAtTime( position.y, this.context.currentTime );\n\t\t\t\tlistener.positionZ.setValueAtTime( position.z, this.context.currentTime );\n\t\t\t\tlistener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );\n\t\t\t\tlistener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );\n\t\t\t\tlistener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );\n\t\t\t\tlistener.upX.setValueAtTime( up.x, this.context.currentTime );\n\t\t\t\tlistener.upY.setValueAtTime( up.y, this.context.currentTime );\n\t\t\t\tlistener.upZ.setValueAtTime( up.z, this.context.currentTime );\n\n\t\t\t} else {\n\n\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t}\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Reece Aaron Lecrivain / http://reecenotes.com/\n */\n\nfunction Audio( listener ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Audio';\n\n\tthis.context = listener.context;\n\n\tthis.gain = this.context.createGain();\n\tthis.gain.connect( listener.getInput() );\n\n\tthis.autoplay = false;\n\n\tthis.buffer = null;\n\tthis.loop = false;\n\tthis.startTime = 0;\n\tthis.offset = 0;\n\tthis.playbackRate = 1;\n\tthis.isPlaying = false;\n\tthis.hasPlaybackControl = true;\n\tthis.sourceType = 'empty';\n\n\tthis.filters = [];\n\n}\n\nAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Audio,\n\n\tgetOutput: function () {\n\n\t\treturn this.gain;\n\n\t},\n\n\tsetNodeSource: function ( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t},\n\n\tsetMediaElementSource: function ( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t},\n\n\tsetBuffer: function ( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t},\n\n\tplay: function () {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar source = this.context.createBufferSource();\n\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.playbackRate.setValueAtTime( this.playbackRate, this.startTime );\n\t\tthis.startTime = this.context.currentTime;\n\t\tsource.start( this.startTime, this.offset );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\treturn this.connect();\n\n\t},\n\n\tpause: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.stop();\n\t\t\tthis.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate;\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tstop: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.source.stop();\n\t\tthis.offset = 0;\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t},\n\n\tconnect: function () {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tdisconnect: function () {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetFilters: function () {\n\n\t\treturn this.filters;\n\n\t},\n\n\tsetFilters: function ( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value;\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetFilter: function () {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t},\n\n\tsetFilter: function ( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t},\n\n\tsetPlaybackRate: function ( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetPlaybackRate: function () {\n\n\t\treturn this.playbackRate;\n\n\t},\n\n\tonEnded: function () {\n\n\t\tthis.isPlaying = false;\n\n\t},\n\n\tgetLoop: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t},\n\n\tsetLoop: function ( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetVolume: function () {\n\n\t\treturn this.gain.gain.value;\n\n\t},\n\n\tsetVolume: function ( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction PositionalAudio( listener ) {\n\n\tAudio.call( this, listener );\n\n\tthis.panner = this.context.createPanner();\n\tthis.panner.connect( this.gain );\n\n}\n\nPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\tconstructor: PositionalAudio,\n\n\tgetOutput: function () {\n\n\t\treturn this.panner;\n\n\t},\n\n\tgetRefDistance: function () {\n\n\t\treturn this.panner.refDistance;\n\n\t},\n\n\tsetRefDistance: function ( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t},\n\n\tgetRolloffFactor: function () {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t},\n\n\tsetRolloffFactor: function ( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t},\n\n\tgetDistanceModel: function () {\n\n\t\treturn this.panner.distanceModel;\n\n\t},\n\n\tsetDistanceModel: function ( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t},\n\n\tgetMaxDistance: function () {\n\n\t\treturn this.panner.maxDistance;\n\n\t},\n\n\tsetMaxDistance: function ( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t},\n\n\tupdateMatrixWorld: ( function () {\n\n\t\tvar position = new Vector3();\n\n\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t};\n\n\t} )()\n\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AudioAnalyser( audio, fftSize ) {\n\n\tthis.analyser = audio.context.createAnalyser();\n\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\taudio.getOutput().connect( this.analyser );\n\n}\n\nObject.assign( AudioAnalyser.prototype, {\n\n\tgetFrequencyData: function () {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t},\n\n\tgetAverageFrequency: function () {\n\n\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n} );\n\n/**\n *\n * Buffered scene graph property that allows weighted accumulation.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\tthis.binding = binding;\n\tthis.valueSize = valueSize;\n\n\tvar bufferType = Float64Array,\n\t\tmixFunction;\n\n\tswitch ( typeName ) {\n\n\t\tcase 'quaternion':\n\t\t\tmixFunction = this._slerp;\n\t\t\tbreak;\n\n\t\tcase 'string':\n\t\tcase 'bool':\n\t\t\tbufferType = Array;\n\t\t\tmixFunction = this._select;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tmixFunction = this._lerp;\n\n\t}\n\n\tthis.buffer = new bufferType( valueSize * 4 );\n\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t//\n\t// interpolators can use .buffer as their .result\n\t// the data then goes to 'incoming'\n\t//\n\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t// the cumulative result and are compared to detect\n\t// changes\n\t//\n\t// 'orig' stores the original state of the property\n\n\tthis._mixBufferRegion = mixFunction;\n\n\tthis.cumulativeWeight = 0;\n\n\tthis.useCount = 0;\n\tthis.referenceCount = 0;\n\n}\n\nObject.assign( PropertyMixer.prototype, {\n\n\t// accumulate data in the 'incoming' region into 'accu<i>'\n\taccumulate: function ( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tvar buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tvar mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t},\n\n\t// apply the state of 'accu<i>' to the binding when accus differ\n\tapply: function ( accuIndex ) {\n\n\t\tvar stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState: function () {\n\n\t\tvar binding = this.binding;\n\n\t\tvar buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * 3;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\tthis.cumulativeWeight = 0;\n\n\t},\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState: function () {\n\n\t\tvar originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t},\n\n\n\t// mix functions\n\n\t_select: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_slerp: function ( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t},\n\n\t_lerp: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tvar s = 1 - t;\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tvar j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n *\n * A reference to a real property in the scene graph.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\n// Characters [].:/ are reserved for track binding syntax.\nvar RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\n\nfunction Composite( targetGroup, path, optionalParsedPath ) {\n\n\tvar parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\tthis._targetGroup = targetGroup;\n\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n}\n\nObject.assign( Composite.prototype, {\n\n\tgetValue: function ( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t},\n\n\tsetValue: function ( array, offset ) {\n\n\t\tvar bindings = this._bindings;\n\n\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t},\n\n\tbind: function () {\n\n\t\tvar bindings = this._bindings;\n\n\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t},\n\n\tunbind: function () {\n\n\t\tvar bindings = this._bindings;\n\n\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n} );\n\n\nfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\tthis.path = path;\n\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;\n\n\tthis.rootNode = rootNode;\n\n}\n\nObject.assign( PropertyBinding, {\n\n\tComposite: Composite,\n\n\tcreate: function ( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t},\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tsanitizeNodeName: ( function () {\n\n\t\tvar reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' );\n\n\t\treturn function sanitizeNodeName( name ) {\n\n\t\t\treturn name.replace( /\\s/g, '_' ).replace( reservedRe, '' );\n\n\t\t};\n\n\t}() ),\n\n\tparseTrackName: function () {\n\n\t\t// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n\t\t// only latin characters, and the unicode \\p{L} is not yet supported. So\n\t\t// instead, we exclude reserved characters and match everything else.\n\t\tvar wordChar = '[^' + RESERVED_CHARS_RE + ']';\n\t\tvar wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n\t\t// Parent directories, delimited by '/' or ':'. Currently unused, but must\n\t\t// be matched to parse the rest of the track name.\n\t\tvar directoryRe = /((?:WC+[\\/:])*)/.source.replace( 'WC', wordChar );\n\n\t\t// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\n\t\tvar nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot );\n\n\t\t// Object on target node, and accessor. May not contain reserved\n\t\t// characters. Accessor may contain any character except closing bracket.\n\t\tvar objectRe = /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', wordChar );\n\n\t\t// Property and accessor. May not contain reserved characters. Accessor may\n\t\t// contain any non-bracket characters.\n\t\tvar propertyRe = /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', wordChar );\n\n\t\tvar trackRe = new RegExp( ''\n\t\t\t+ '^'\n\t\t\t+ directoryRe\n\t\t\t+ nodeRe\n\t\t\t+ objectRe\n\t\t\t+ propertyRe\n\t\t\t+ '$'\n\t\t);\n\n\t\tvar supportedObjectNames = [ 'material', 'materials', 'bones' ];\n\n\t\treturn function parseTrackName( trackName ) {\n\n\t\t\tvar matches = trackRe.exec( trackName );\n\n\t\t\tif ( ! matches ) {\n\n\t\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t\t}\n\n\t\t\tvar results = {\n\t\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\t\tnodeName: matches[ 2 ],\n\t\t\t\tobjectName: matches[ 3 ],\n\t\t\t\tobjectIndex: matches[ 4 ],\n\t\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\t\tpropertyIndex: matches[ 6 ]\n\t\t\t};\n\n\t\t\tvar lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\t\tvar objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t\t// Object names must be checked against a whitelist. Otherwise, there\n\t\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t\t// include '.' characters).\n\t\t\t\tif ( supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\t\tresults.objectName = objectName;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t\t}\n\n\t\t\treturn results;\n\n\t\t};\n\n\t}(),\n\n\tfindNode: function ( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n} );\n\nObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable: function () {},\n\t_setValue_unavailable: function () {},\n\n\tBindingType: {\n\t\tDirect: 0,\n\t\tEntireArray: 1,\n\t\tArrayElement: 2,\n\t\tHasFromToArray: 3\n\t},\n\n\tVersioning: {\n\t\tNone: 0,\n\t\tNeedsUpdate: 1,\n\t\tMatrixWorldNeedsUpdate: 2\n\t},\n\n\tGetterByBindingType: [\n\n\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t},\n\n\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\tvar source = this.resolvedProperty;\n\n\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t}\n\n\t\t},\n\n\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t},\n\n\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t}\n\n\t],\n\n\tSetterByBindingTypeAndVersioning: [\n\n\t\t[\n\t\t\t// Direct\n\n\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t},\n\n\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// EntireArray\n\n\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// ArrayElement\n\n\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t},\n\n\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// HasToFromArray\n\n\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t},\n\n\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t]\n\n\t],\n\n\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t// prototype version of these methods with one that represents\n\t\t// the bound state. When the property is not found, the methods\n\t\t// become no-ops.\n\n\t},\n\n\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t},\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind: function () {\n\n\t\tvar targetObject = this.node,\n\t\t\tparsedPath = this.parsedPath,\n\n\t\t\tobjectName = parsedPath.objectName,\n\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\\'t found.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tvar versioning = this.Versioning.None;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\tthis.targetObject = targetObject;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\tthis.targetObject = targetObject;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tvar bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.geometry.isBufferGeometry ) {\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t},\n\n\tunbind: function () {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n} );\n\n//!\\ DECLARE ALIAS AFTER assign prototype !\nObject.assign( PropertyBinding.prototype, {\n\n\t// initial state of these methods that calls 'bind'\n\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n} );\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * \t-\tAdd objects you would otherwise pass as 'root' to the\n * \t\tconstructor or the .clipAction method of AnimationMixer.\n *\n * \t-\tInstead pass this object as 'root'.\n *\n * \t-\tYou can also add and remove objects later when the mixer\n * \t\tis running.\n *\n * Note:\n *\n * \tObjects of this class appear as one object to the mixer,\n * \tso cache control of the individual objects must be done\n * \ton the group.\n *\n * Limitation:\n *\n * \t- \tThe animated properties must be compatible among the\n * \t\tall objects in the group.\n *\n * -\tA single property can either be controlled through a\n * \ttarget group or directly, but not both.\n *\n * @author tschw\n */\n\nfunction AnimationObjectGroup() {\n\n\tthis.uuid = _Math.generateUUID();\n\n\t// cached objects followed by the active ones\n\tthis._objects = Array.prototype.slice.call( arguments );\n\n\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t// note: read by PropertyBinding.Composite\n\n\tvar indices = {};\n\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t}\n\n\tthis._paths = [];\t\t\t\t\t// inside: string\n\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\tvar scope = this;\n\n\tthis.stats = {\n\n\t\tobjects: {\n\t\t\tget total() {\n\n\t\t\t\treturn scope._objects.length;\n\n\t\t\t},\n\t\t\tget inUse() {\n\n\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t}\n\t\t},\n\t\tget bindingsPerObject() {\n\n\t\t\treturn scope._bindings.length;\n\n\t\t}\n\n\t};\n\n}\n\nObject.assign( AnimationObjectGroup.prototype, {\n\n\tisAnimationObjectGroup: true,\n\n\tadd: function () {\n\n\t\tvar objects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length,\n\t\t\tknownObject = undefined;\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tvar object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\tremove: function () {\n\n\t\tvar objects = this._objects,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tvar object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\t// remove & forget\n\tuncache: function () {\n\n\t\tvar objects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tvar object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_: function ( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ],\n\t\t\tbindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tvar paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tvar object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t},\n\n\tunsubscribe_: function ( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n *\n * Action provided by AnimationMixer for scheduling clip playback on specific\n * objects.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n *\n */\n\nfunction AnimationAction( mixer, clip, localRoot ) {\n\n\tthis._mixer = mixer;\n\tthis._clip = clip;\n\tthis._localRoot = localRoot || null;\n\n\tvar tracks = clip.tracks,\n\t\tnTracks = tracks.length,\n\t\tinterpolants = new Array( nTracks );\n\n\tvar interpolantSettings = {\n\t\tendingStart: ZeroCurvatureEnding,\n\t\tendingEnd: ZeroCurvatureEnding\n\t};\n\n\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\tinterpolants[ i ] = interpolant;\n\t\tinterpolant.settings = interpolantSettings;\n\n\t}\n\n\tthis._interpolantSettings = interpolantSettings;\n\n\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t// inside: PropertyMixer (managed by the mixer)\n\tthis._propertyBindings = new Array( nTracks );\n\n\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\tthis._timeScaleInterpolant = null;\n\tthis._weightInterpolant = null;\n\n\tthis.loop = LoopRepeat;\n\tthis._loopCount = - 1;\n\n\t// global mixer time when the action is to be started\n\t// it's set back to 'null' upon start of the action\n\tthis._startTime = null;\n\n\t// scaled local time of the action\n\t// gets clamped or wrapped to 0..clip.duration according to loop\n\tthis.time = 0;\n\n\tthis.timeScale = 1;\n\tthis._effectiveTimeScale = 1;\n\n\tthis.weight = 1;\n\tthis._effectiveWeight = 1;\n\n\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\tthis.paused = false;\t\t\t\t// true -> zero effective time scale\n\tthis.enabled = true;\t\t\t\t// false -> zero effective weight\n\n\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n}\n\nObject.assign( AnimationAction.prototype, {\n\n\t// State & Scheduling\n\n\tplay: function () {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t},\n\n\tstop: function () {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t},\n\n\treset: function () {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0;\t\t\t// restart clip\n\t\tthis._loopCount = - 1;\t// forget previous loops\n\t\tthis._startTime = null;\t// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t},\n\n\tisRunning: function () {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t},\n\n\t// return true when play has been called\n\tisScheduled: function () {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t},\n\n\tstartAt: function ( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t},\n\n\tsetLoop: function ( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t},\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight: function ( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t},\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight: function () {\n\n\t\treturn this._effectiveWeight;\n\n\t},\n\n\tfadeIn: function ( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t},\n\n\tfadeOut: function ( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t},\n\n\tcrossFadeFrom: function ( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcrossFadeTo: function ( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t},\n\n\tstopFading: function () {\n\n\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale: function ( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale: function () {\n\n\t\treturn this._effectiveTimeScale;\n\n\t},\n\n\tsetDuration: function ( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\tsyncWith: function ( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\thalt: function ( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t},\n\n\twarp: function ( startTimeScale, endTimeScale, duration ) {\n\n\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tvar times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t},\n\n\tstopWarping: function () {\n\n\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// Object Accessors\n\n\tgetMixer: function () {\n\n\t\treturn this._mixer;\n\n\t},\n\n\tgetClip: function () {\n\n\t\treturn this._clip;\n\n\t},\n\n\tgetRoot: function () {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t},\n\n\t// Interna\n\n\t_update: function ( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t}\n\n\t\t\t// start\n\n\t\t\tthis._startTime = null; // unschedule\n\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tvar weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tvar interpolants = this._interpolants;\n\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_updateWeight: function ( time ) {\n\n\t\tvar weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t},\n\n\t_updateTimeScale: function ( time ) {\n\n\t\tvar timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t},\n\n\t_updateTime: function ( deltaTime ) {\n\n\t\tvar time = this.time + deltaTime;\n\n\t\tif ( deltaTime === 0 ) return time;\n\n\t\tvar duration = this._clip.duration,\n\n\t\t\tloop = this.loop,\n\t\t\tloopCount = this._loopCount;\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else break handle_stop;\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? - 1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : - 1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\tthis.time = time;\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.time = time;\n\t\treturn time;\n\n\t},\n\n\t_setEndings: function ( atStart, atEnd, pingPong ) {\n\n\t\tvar settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_scheduleFading: function ( duration, weightNow, weightThen ) {\n\n\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\tinterpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tvar times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n *\n * Player for AnimationClips.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction AnimationMixer( root ) {\n\n\tthis._root = root;\n\tthis._initMemoryManager();\n\tthis._accuIndex = 0;\n\n\tthis.time = 0;\n\n\tthis.timeScale = 1.0;\n\n}\n\nAnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: AnimationMixer,\n\n\t_bindAction: function ( action, prototypeAction ) {\n\n\t\tvar root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar track = tracks[ i ],\n\t\t\t\ttrackName = track.name,\n\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t},\n\n\t_activateAction: function ( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t},\n\n\t_deactivateAction: function ( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t},\n\n\t// Memory manager\n\n\t_initMemoryManager: function () {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t},\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction: function ( action ) {\n\n\t\tvar index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t},\n\n\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\tvar actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t},\n\n\t_removeInactiveAction: function ( action ) {\n\n\t\tvar actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tvar clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t},\n\n\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\tvar bindings = action._propertyBindings;\n\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tvar binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_lendAction: function ( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tvar actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t},\n\n\t_takeBackAction: function ( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tvar actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t},\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tbindings = this._bindings;\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t},\n\n\t_removeInactiveBinding: function ( binding ) {\n\n\t\tvar bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tremove_empty_map: {\n\n\t\t\tfor ( var _ in bindingByName ) break remove_empty_map; // eslint-disable-line no-unused-vars\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t},\n\n\t_lendBinding: function ( binding ) {\n\n\t\tvar bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t},\n\n\t_takeBackBinding: function ( binding ) {\n\n\t\tvar bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t},\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant: function () {\n\n\t\tvar interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t},\n\n\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\tvar interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t},\n\n\t_controlInterpolantsResultBuffer: new Float32Array( 1 ),\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction: function ( clip, optionalRoot ) {\n\n\t\tvar root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\tprototypeAction = null;\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tvar existingAction =\n\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t},\n\n\t// get an existing action\n\texistingAction: function ( clip, optionalRoot ) {\n\n\t\tvar root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction: function () {\n\n\t\tvar actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tthis._nActiveActions = 0;\n\t\tthis._nActiveBindings = 0;\n\n\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\tactions[ i ].reset();\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].useCount = 0;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// advance the time and update apply the animation\n\tupdate: function ( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tvar actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\tvar action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tvar bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// return this mixer's root target object\n\tgetRoot: function () {\n\n\t\treturn this._root;\n\n\t},\n\n\t// free all resources specific to a particular clip\n\tuncacheClip: function ( clip ) {\n\n\t\tvar actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t},\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot: function ( root ) {\n\n\t\tvar rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t// remove a targeted clip from the cache\n\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Uniform( value ) {\n\n\tif ( typeof value === 'string' ) {\n\n\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\tvalue = arguments[ 1 ];\n\n\t}\n\n\tthis.value = value;\n\n}\n\nUniform.prototype.clone = function () {\n\n\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n};\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InstancedBufferGeometry() {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'InstancedBufferGeometry';\n\tthis.maxInstancedCount = undefined;\n\n}\n\nInstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), {\n\n\tconstructor: InstancedBufferGeometry,\n\n\tisInstancedBufferGeometry: true,\n\n\tcopy: function ( source ) {\n\n\t\tBufferGeometry.prototype.copy.call( this, source );\n\n\t\tthis.maxInstancedCount = source.maxInstancedCount;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\tthis.data = interleavedBuffer;\n\tthis.itemSize = itemSize;\n\tthis.offset = offset;\n\n\tthis.normalized = normalized === true;\n\n}\n\nObject.defineProperties( InterleavedBufferAttribute.prototype, {\n\n\tcount: {\n\n\t\tget: function () {\n\n\t\t\treturn this.data.count;\n\n\t\t}\n\n\t},\n\n\tarray: {\n\n\t\tget: function () {\n\n\t\t\treturn this.data.array;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( InterleavedBufferAttribute.prototype, {\n\n\tisInterleavedBufferAttribute: true,\n\n\tsetX: function ( index, x ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( index, y ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( index, z ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetW: function ( index, w ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tgetX: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t},\n\n\tgetY: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t},\n\n\tgetZ: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t},\n\n\tgetW: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t},\n\n\tsetXY: function ( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZ: function ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InterleavedBuffer( array, stride ) {\n\n\tthis.array = array;\n\tthis.stride = stride;\n\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\tthis.dynamic = false;\n\tthis.updateRange = { offset: 0, count: - 1 };\n\n\tthis.version = 0;\n\n}\n\nObject.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( InterleavedBuffer.prototype, {\n\n\tisInterleavedBuffer: true,\n\n\tonUploadCallback: function () {},\n\n\tsetArray: function ( array ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\tthis.array = array;\n\n\t\treturn this;\n\n\t},\n\n\tsetDynamic: function ( value ) {\n\n\t\tthis.dynamic = value;\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.dynamic = source.dynamic;\n\n\t\treturn this;\n\n\t},\n\n\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tset: function ( value, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tonUpload: function ( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\tInterleavedBuffer.call( this, array, stride );\n\n\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n}\n\nInstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), {\n\n\tconstructor: InstancedInterleavedBuffer,\n\n\tisInstancedInterleavedBuffer: true,\n\n\tcopy: function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\tBufferAttribute.call( this, array, itemSize );\n\n\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n}\n\nInstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), {\n\n\tconstructor: InstancedBufferAttribute,\n\n\tisInstancedBufferAttribute: true,\n\n\tcopy: function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author bhouston / http://clara.io/\n * @author stephomi / http://stephaneginier.com/\n */\n\nfunction Raycaster( origin, direction, near, far ) {\n\n\tthis.ray = new Ray( origin, direction );\n\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\tthis.near = near || 0;\n\tthis.far = far || Infinity;\n\n\tthis.params = {\n\t\tMesh: {},\n\t\tLine: {},\n\t\tLOD: {},\n\t\tPoints: { threshold: 1 },\n\t\tSprite: {}\n\t};\n\n\tObject.defineProperties( this.params, {\n\t\tPointCloud: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\treturn this.Points;\n\n\t\t\t}\n\t\t}\n\t} );\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\tif ( object.visible === false ) return;\n\n\tobject.raycast( raycaster, intersects );\n\n\tif ( recursive === true ) {\n\n\t\tvar children = object.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\nObject.assign( Raycaster.prototype, {\n\n\tlinePrecision: 1,\n\n\tset: function ( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t},\n\n\tsetFromCamera: function ( coords, camera ) {\n\n\t\tif ( ( camera && camera.isPerspectiveCamera ) ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t} else if ( ( camera && camera.isOrthographicCamera ) ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t}\n\n\t},\n\n\tintersectObject: function ( object, recursive, optionalTarget ) {\n\n\t\tvar intersects = optionalTarget || [];\n\n\t\tintersectObject( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t},\n\n\tintersectObjects: function ( objects, recursive, optionalTarget ) {\n\n\t\tvar intersects = optionalTarget || [];\n\n\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\treturn intersects;\n\n\t\t}\n\n\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Clock( autoStart ) {\n\n\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\tthis.startTime = 0;\n\tthis.oldTime = 0;\n\tthis.elapsedTime = 0;\n\n\tthis.running = false;\n\n}\n\nObject.assign( Clock.prototype, {\n\n\tstart: function () {\n\n\t\tthis.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t},\n\n\tstop: function () {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t},\n\n\tgetElapsedTime: function () {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t},\n\n\tgetDelta: function () {\n\n\t\tvar diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tvar newTime = ( typeof performance === 'undefined' ? Date : performance ).now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author WestLangley / http://github.com/WestLangley\n *\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The poles (phi) are at the positive and negative y axis.\n * The equator starts at positive z.\n */\n\nfunction Spherical( radius, phi, theta ) {\n\n\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\treturn this;\n\n}\n\nObject.assign( Spherical.prototype, {\n\n\tset: function ( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t},\n\n\t// restrict phi to be betwee EPS and PI-EPS\n\tmakeSafe: function () {\n\n\t\tvar EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromVector3: function ( vec3 ) {\n\n\t\tthis.radius = vec3.length();\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n *\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n *\n */\n\nfunction Cylindrical( radius, theta, y ) {\n\n\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\treturn this;\n\n}\n\nObject.assign( Cylindrical.prototype, {\n\n\tset: function ( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromVector3: function ( vec3 ) {\n\n\t\tthis.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );\n\t\tthis.theta = Math.atan2( vec3.x, vec3.z );\n\t\tthis.y = vec3.y;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Box2( min, max ) {\n\n\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n}\n\nObject.assign( Box2.prototype, {\n\n\tset: function ( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCenterAndSize: function () {\n\n\t\tvar v1 = new Vector2();\n\n\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tmakeEmpty: function () {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t},\n\n\tisEmpty: function () {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getCenter() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t},\n\n\tgetSize: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getSize() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t},\n\n\texpandByPoint: function ( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t},\n\n\texpandByVector: function ( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t},\n\n\texpandByScalar: function ( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t},\n\n\tcontainsBox: function ( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t},\n\n\tgetParameter: function ( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getParameter() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t},\n\n\tclampPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t},\n\n\tdistanceToPoint: function () {\n\n\t\tvar v1 = new Vector2();\n\n\t\treturn function distanceToPoint( point ) {\n\n\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t};\n\n\t}(),\n\n\tintersect: function ( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tunion: function ( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction ImmediateRenderObject( material ) {\n\n\tObject3D.call( this );\n\n\tthis.material = material;\n\tthis.render = function ( /* renderCallback */ ) {};\n\n}\n\nImmediateRenderObject.prototype = Object.create( Object3D.prototype );\nImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\nImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\tthis.object = object;\n\n\tthis.size = ( size !== undefined ) ? size : 1;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t//\n\n\tvar nNormals = 0;\n\n\tvar objGeometry = this.object.geometry;\n\n\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\tnNormals = objGeometry.faces.length * 3;\n\n\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t}\n\n\t//\n\n\tvar geometry = new BufferGeometry();\n\n\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\tgeometry.addAttribute( 'position', positions );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t//\n\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n}\n\nVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\nVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\nVertexNormalsHelper.prototype.update = ( function () {\n\n\tvar v1 = new Vector3();\n\tvar v2 = new Vector3();\n\tvar normalMatrix = new Matrix3();\n\n\treturn function update() {\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tthis.object.updateMatrixWorld( true );\n\n\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\tvar position = this.geometry.attributes.position;\n\n\t\t//\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\tvar idx = 0;\n\n\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tposition.needsUpdate = true;\n\n\t};\n\n}() );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction SpotLightHelper( light, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tvar geometry = new BufferGeometry();\n\n\tvar positions = [\n\t\t0, 0, 0, \t0, 0, 1,\n\t\t0, 0, 0, \t1, 0, 1,\n\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t0, 0, 0, \t0, 1, 1,\n\t\t0, 0, 0, \t0, - 1, 1\n\t];\n\n\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\tpositions.push(\n\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t);\n\n\t}\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\tvar material = new LineBasicMaterial( { fog: false } );\n\n\tthis.cone = new LineSegments( geometry, material );\n\tthis.add( this.cone );\n\n\tthis.update();\n\n}\n\nSpotLightHelper.prototype = Object.create( Object3D.prototype );\nSpotLightHelper.prototype.constructor = SpotLightHelper;\n\nSpotLightHelper.prototype.dispose = function () {\n\n\tthis.cone.geometry.dispose();\n\tthis.cone.material.dispose();\n\n};\n\nSpotLightHelper.prototype.update = function () {\n\n\tvar vector = new Vector3();\n\tvar vector2 = new Vector3();\n\n\treturn function update() {\n\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t};\n\n}();\n\n/**\n * @author Sean Griffin / http://twitter.com/sgrif\n * @author Michael Guerrero / http://realitymeltdown.com\n * @author mrdoob / http://mrdoob.com/\n * @author ikerr / http://verold.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction getBoneList( object ) {\n\n\tvar boneList = [];\n\n\tif ( object && object.isBone ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nfunction SkeletonHelper( object ) {\n\n\tvar bones = getBoneList( object );\n\n\tvar geometry = new BufferGeometry();\n\n\tvar vertices = [];\n\tvar colors = [];\n\n\tvar color1 = new Color( 0, 0, 1 );\n\tvar color2 = new Color( 0, 1, 0 );\n\n\tfor ( var i = 0; i < bones.length; i ++ ) {\n\n\t\tvar bone = bones[ i ];\n\n\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t}\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.root = object;\n\tthis.bones = bones;\n\n\tthis.matrix = object.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n}\n\nSkeletonHelper.prototype = Object.create( LineSegments.prototype );\nSkeletonHelper.prototype.constructor = SkeletonHelper;\n\nSkeletonHelper.prototype.updateMatrixWorld = function () {\n\n\tvar vector = new Vector3();\n\n\tvar boneMatrix = new Matrix4();\n\tvar matrixWorldInv = new Matrix4();\n\n\treturn function updateMatrixWorld( force ) {\n\n\t\tvar bones = this.bones;\n\n\t\tvar geometry = this.geometry;\n\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\tfor ( var i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tvar bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t};\n\n}();\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction PointLightHelper( light, sphereSize, color ) {\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.color = color;\n\n\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\n\tMesh.call( this, geometry, material );\n\n\tthis.matrix = this.light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n\n\t/*\n\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tvar d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n}\n\nPointLightHelper.prototype = Object.create( Mesh.prototype );\nPointLightHelper.prototype.constructor = PointLightHelper;\n\nPointLightHelper.prototype.dispose = function () {\n\n\tthis.geometry.dispose();\n\tthis.material.dispose();\n\n};\n\nPointLightHelper.prototype.update = function () {\n\n\tif ( this.color !== undefined ) {\n\n\t\tthis.material.color.set( this.color );\n\n\t} else {\n\n\t\tthis.material.color.copy( this.light.color );\n\n\t}\n\n\t/*\n\tvar d = this.light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.visible = true;\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\t*/\n\n};\n\n/**\n * @author abelnation / http://github.com/abelnation\n * @author Mugen87 / http://github.com/Mugen87\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction RectAreaLightHelper( light, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tvar material = new LineBasicMaterial( { fog: false } );\n\n\tvar geometry = new BufferGeometry();\n\n\tgeometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) );\n\n\tthis.line = new Line( geometry, material );\n\tthis.add( this.line );\n\n\n\tthis.update();\n\n}\n\nRectAreaLightHelper.prototype = Object.create( Object3D.prototype );\nRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\nRectAreaLightHelper.prototype.dispose = function () {\n\n\tthis.children[ 0 ].geometry.dispose();\n\tthis.children[ 0 ].material.dispose();\n\n};\n\nRectAreaLightHelper.prototype.update = function () {\n\n\t// calculate new dimensions of the helper\n\n\tvar hx = this.light.width * 0.5;\n\tvar hy = this.light.height * 0.5;\n\n\tvar position = this.line.geometry.attributes.position;\n\tvar array = position.array;\n\n\t// update vertices\n\n\tarray[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;\n\tarray[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;\n\tarray[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;\n\tarray[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0;\n\tarray[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0;\n\n\tposition.needsUpdate = true;\n\n\tif ( this.color !== undefined ) {\n\n\t\tthis.line.material.color.set( this.color );\n\n\t} else {\n\n\t\tthis.line.material.color.copy( this.light.color );\n\n\t}\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction HemisphereLightHelper( light, size, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tvar geometry = new OctahedronBufferGeometry( size );\n\tgeometry.rotateY( Math.PI * 0.5 );\n\n\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\tif ( this.color === undefined ) this.material.vertexColors = VertexColors;\n\n\tvar position = geometry.getAttribute( 'position' );\n\tvar colors = new Float32Array( position.count * 3 );\n\n\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\tthis.add( new Mesh( geometry, this.material ) );\n\n\tthis.update();\n\n}\n\nHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\nHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\nHemisphereLightHelper.prototype.dispose = function () {\n\n\tthis.children[ 0 ].geometry.dispose();\n\tthis.children[ 0 ].material.dispose();\n\n};\n\nHemisphereLightHelper.prototype.update = function () {\n\n\tvar vector = new Vector3();\n\n\tvar color1 = new Color();\n\tvar color2 = new Color();\n\n\treturn function update() {\n\n\t\tvar mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\tcolor1.copy( this.light.color );\n\t\t\tcolor2.copy( this.light.groundColor );\n\n\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t};\n\n}();\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction GridHelper( size, divisions, color1, color2 ) {\n\n\tsize = size || 10;\n\tdivisions = divisions || 10;\n\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\tvar center = divisions / 2;\n\tvar step = size / divisions;\n\tvar halfSize = size / 2;\n\n\tvar vertices = [], colors = [];\n\n\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\tvar color = i === center ? color1 : color2;\n\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\n\t}\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\tLineSegments.call( this, geometry, material );\n\n}\n\nGridHelper.prototype = Object.create( LineSegments.prototype );\nGridHelper.prototype.constructor = GridHelper;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / http://github.com/Mugen87\n * @author Hectate / http://www.github.com/Hectate\n */\n\nfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\tradius = radius || 10;\n\tradials = radials || 16;\n\tcircles = circles || 8;\n\tdivisions = divisions || 64;\n\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\tvar vertices = [];\n\tvar colors = [];\n\n\tvar x, z;\n\tvar v, i, j, r, color;\n\n\t// create the radials\n\n\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\tx = Math.sin( v ) * radius;\n\t\tz = Math.cos( v ) * radius;\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tvertices.push( x, 0, z );\n\n\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\tcolors.push( color.r, color.g, color.b );\n\t\tcolors.push( color.r, color.g, color.b );\n\n\t}\n\n\t// create the circles\n\n\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\tr = radius - ( radius / circles * i );\n\n\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t// first vertex\n\n\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * r;\n\t\t\tz = Math.cos( v ) * r;\n\n\t\t\tvertices.push( x, 0, z );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t// second vertex\n\n\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * r;\n\t\t\tz = Math.cos( v ) * r;\n\n\t\t\tvertices.push( x, 0, z );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t}\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\tLineSegments.call( this, geometry, material );\n\n}\n\nPolarGridHelper.prototype = Object.create( LineSegments.prototype );\nPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t// FaceNormalsHelper only supports THREE.Geometry\n\n\tthis.object = object;\n\n\tthis.size = ( size !== undefined ) ? size : 1;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t//\n\n\tvar nNormals = 0;\n\n\tvar objGeometry = this.object.geometry;\n\n\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\tnNormals = objGeometry.faces.length;\n\n\t} else {\n\n\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t}\n\n\t//\n\n\tvar geometry = new BufferGeometry();\n\n\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\tgeometry.addAttribute( 'position', positions );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t//\n\n\tthis.matrixAutoUpdate = false;\n\tthis.update();\n\n}\n\nFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\nFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\nFaceNormalsHelper.prototype.update = ( function () {\n\n\tvar v1 = new Vector3();\n\tvar v2 = new Vector3();\n\tvar normalMatrix = new Matrix3();\n\n\treturn function update() {\n\n\t\tthis.object.updateMatrixWorld( true );\n\n\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\tvar position = this.geometry.attributes.position;\n\n\t\t//\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tvar vertices = objGeometry.vertices;\n\n\t\tvar faces = objGeometry.faces;\n\n\t\tvar idx = 0;\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tvar normal = face.normal;\n\n\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t.divideScalar( 3 )\n\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\tidx = idx + 1;\n\n\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\tidx = idx + 1;\n\n\t\t}\n\n\t\tposition.needsUpdate = true;\n\n\t};\n\n}() );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction DirectionalLightHelper( light, size, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tif ( size === undefined ) size = 1;\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t- size, size, 0,\n\t\tsize, size, 0,\n\t\tsize, - size, 0,\n\t\t- size, - size, 0,\n\t\t- size, size, 0\n\t], 3 ) );\n\n\tvar material = new LineBasicMaterial( { fog: false } );\n\n\tthis.lightPlane = new Line( geometry, material );\n\tthis.add( this.lightPlane );\n\n\tgeometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\tthis.targetLine = new Line( geometry, material );\n\tthis.add( this.targetLine );\n\n\tthis.update();\n\n}\n\nDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\nDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\nDirectionalLightHelper.prototype.dispose = function () {\n\n\tthis.lightPlane.geometry.dispose();\n\tthis.lightPlane.material.dispose();\n\tthis.targetLine.geometry.dispose();\n\tthis.targetLine.material.dispose();\n\n};\n\nDirectionalLightHelper.prototype.update = function () {\n\n\tvar v1 = new Vector3();\n\tvar v2 = new Vector3();\n\tvar v3 = new Vector3();\n\n\treturn function update() {\n\n\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\tv3.subVectors( v2, v1 );\n\n\t\tthis.lightPlane.lookAt( v3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( v3 );\n\t\tthis.targetLine.scale.z = v3.length();\n\n\t};\n\n}();\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author Mugen87 / https://github.com/Mugen87\n *\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n */\n\nfunction CameraHelper( camera ) {\n\n\tvar geometry = new BufferGeometry();\n\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\tvar vertices = [];\n\tvar colors = [];\n\n\tvar pointMap = {};\n\n\t// colors\n\n\tvar colorFrustum = new Color( 0xffaa00 );\n\tvar colorCone = new Color( 0xff0000 );\n\tvar colorUp = new Color( 0x00aaff );\n\tvar colorTarget = new Color( 0xffffff );\n\tvar colorCross = new Color( 0x333333 );\n\n\t// near\n\n\taddLine( 'n1', 'n2', colorFrustum );\n\taddLine( 'n2', 'n4', colorFrustum );\n\taddLine( 'n4', 'n3', colorFrustum );\n\taddLine( 'n3', 'n1', colorFrustum );\n\n\t// far\n\n\taddLine( 'f1', 'f2', colorFrustum );\n\taddLine( 'f2', 'f4', colorFrustum );\n\taddLine( 'f4', 'f3', colorFrustum );\n\taddLine( 'f3', 'f1', colorFrustum );\n\n\t// sides\n\n\taddLine( 'n1', 'f1', colorFrustum );\n\taddLine( 'n2', 'f2', colorFrustum );\n\taddLine( 'n3', 'f3', colorFrustum );\n\taddLine( 'n4', 'f4', colorFrustum );\n\n\t// cone\n\n\taddLine( 'p', 'n1', colorCone );\n\taddLine( 'p', 'n2', colorCone );\n\taddLine( 'p', 'n3', colorCone );\n\taddLine( 'p', 'n4', colorCone );\n\n\t// up\n\n\taddLine( 'u1', 'u2', colorUp );\n\taddLine( 'u2', 'u3', colorUp );\n\taddLine( 'u3', 'u1', colorUp );\n\n\t// target\n\n\taddLine( 'c', 't', colorTarget );\n\taddLine( 'p', 'c', colorCross );\n\n\t// cross\n\n\taddLine( 'cn1', 'cn2', colorCross );\n\taddLine( 'cn3', 'cn4', colorCross );\n\n\taddLine( 'cf1', 'cf2', colorCross );\n\taddLine( 'cf3', 'cf4', colorCross );\n\n\tfunction addLine( a, b, color ) {\n\n\t\taddPoint( a, color );\n\t\taddPoint( b, color );\n\n\t}\n\n\tfunction addPoint( id, color ) {\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tcolors.push( color.r, color.g, color.b );\n\n\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\tpointMap[ id ] = [];\n\n\t\t}\n\n\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t}\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.camera = camera;\n\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\tthis.matrix = camera.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.pointMap = pointMap;\n\n\tthis.update();\n\n}\n\nCameraHelper.prototype = Object.create( LineSegments.prototype );\nCameraHelper.prototype.constructor = CameraHelper;\n\nCameraHelper.prototype.update = function () {\n\n\tvar geometry, pointMap;\n\n\tvar vector = new Vector3();\n\tvar camera = new Camera();\n\n\tfunction setPoint( point, x, y, z ) {\n\n\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\tvar points = pointMap[ point ];\n\n\t\tif ( points !== undefined ) {\n\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn function update() {\n\n\t\tgeometry = this.geometry;\n\t\tpointMap = this.pointMap;\n\n\t\tvar w = 1, h = 1;\n\n\t\t// we need just camera projection matrix\n\t\t// world matrix must be identity\n\n\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', 0, 0, - 1 );\n\t\tsetPoint( 't', 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', - w, - h, - 1 );\n\t\tsetPoint( 'n2', w, - h, - 1 );\n\t\tsetPoint( 'n3', - w, h, - 1 );\n\t\tsetPoint( 'n4', w, h, - 1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', - w, - h, 1 );\n\t\tsetPoint( 'f2', w, - h, 1 );\n\t\tsetPoint( 'f3', - w, h, 1 );\n\t\tsetPoint( 'f4', w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u2', - w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u3', 0, h * 2, - 1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', - w, 0, 1 );\n\t\tsetPoint( 'cf2', w, 0, 1 );\n\t\tsetPoint( 'cf3', 0, - h, 1 );\n\t\tsetPoint( 'cf4', 0, h, 1 );\n\n\t\tsetPoint( 'cn1', - w, 0, - 1 );\n\t\tsetPoint( 'cn2', w, 0, - 1 );\n\t\tsetPoint( 'cn3', 0, - h, - 1 );\n\t\tsetPoint( 'cn4', 0, h, - 1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t};\n\n}();\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / http://github.com/Mugen87\n */\n\nfunction BoxHelper( object, color ) {\n\n\tthis.object = object;\n\n\tif ( color === undefined ) color = 0xffff00;\n\n\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\tvar positions = new Float32Array( 8 * 3 );\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n}\n\nBoxHelper.prototype = Object.create( LineSegments.prototype );\nBoxHelper.prototype.constructor = BoxHelper;\n\nBoxHelper.prototype.update = ( function () {\n\n\tvar box = new Box3();\n\n\treturn function update( object ) {\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t}\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\tbox.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tvar min = box.min;\n\t\tvar max = box.max;\n\n\t\t/*\n\t\t 5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tvar position = this.geometry.attributes.position;\n\t\tvar array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t};\n\n} )();\n\nBoxHelper.prototype.setFromObject = function ( object ) {\n\n\tthis.object = object;\n\tthis.update();\n\n\treturn this;\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Box3Helper( box, hex ) {\n\n\tthis.type = 'Box3Helper';\n\n\tthis.box = box;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\tvar positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];\n\n\tvar geometry = new BufferGeometry();\n\n\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\tthis.geometry.computeBoundingSphere();\n\n}\n\nBox3Helper.prototype = Object.create( LineSegments.prototype );\nBox3Helper.prototype.constructor = Box3Helper;\n\nBox3Helper.prototype.updateMatrixWorld = function ( force ) {\n\n\tvar box = this.box;\n\n\tif ( box.isEmpty() ) return;\n\n\tbox.getCenter( this.position );\n\n\tbox.getSize( this.scale );\n\n\tthis.scale.multiplyScalar( 0.5 );\n\n\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction PlaneHelper( plane, size, hex ) {\n\n\tthis.type = 'PlaneHelper';\n\n\tthis.plane = plane;\n\n\tthis.size = ( size === undefined ) ? 1 : size;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\tvar positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\tgeometry.computeBoundingSphere();\n\n\tLine.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t//\n\n\tvar positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];\n\n\tvar geometry2 = new BufferGeometry();\n\tgeometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\tgeometry2.computeBoundingSphere();\n\n\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) );\n\n}\n\nPlaneHelper.prototype = Object.create( Line.prototype );\nPlaneHelper.prototype.constructor = PlaneHelper;\n\nPlaneHelper.prototype.updateMatrixWorld = function ( force ) {\n\n\tvar scale = - this.plane.constant;\n\n\tif ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter\n\n\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, scale );\n\n\tthis.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here\n\n\tthis.lookAt( this.plane.normal );\n\n\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n * @author zz85 / http://github.com/zz85\n * @author bhouston / http://clara.io\n *\n * Creates an arrow for visualizing directions\n *\n * Parameters:\n * dir - Vector3\n * origin - Vector3\n * length - Number\n * color - color in hex value\n * headLength - Number\n * headWidth - Number\n */\n\nvar lineGeometry, coneGeometry;\n\nfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t// dir is assumed to be normalized\n\n\tObject3D.call( this );\n\n\tif ( color === undefined ) color = 0xffff00;\n\tif ( length === undefined ) length = 1;\n\tif ( headLength === undefined ) headLength = 0.2 * length;\n\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\tif ( lineGeometry === undefined ) {\n\n\t\tlineGeometry = new BufferGeometry();\n\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t}\n\n\tthis.position.copy( origin );\n\n\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\tthis.line.matrixAutoUpdate = false;\n\tthis.add( this.line );\n\n\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\tthis.cone.matrixAutoUpdate = false;\n\tthis.add( this.cone );\n\n\tthis.setDirection( dir );\n\tthis.setLength( length, headLength, headWidth );\n\n}\n\nArrowHelper.prototype = Object.create( Object3D.prototype );\nArrowHelper.prototype.constructor = ArrowHelper;\n\nArrowHelper.prototype.setDirection = ( function () {\n\n\tvar axis = new Vector3();\n\tvar radians;\n\n\treturn function setDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tradians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t}\n\n\t};\n\n}() );\n\nArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\tif ( headLength === undefined ) headLength = 0.2 * length;\n\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\tthis.line.updateMatrix();\n\n\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\tthis.cone.position.y = length;\n\tthis.cone.updateMatrix();\n\n};\n\nArrowHelper.prototype.setColor = function ( color ) {\n\n\tthis.line.material.color.copy( color );\n\tthis.cone.material.color.copy( color );\n\n};\n\n/**\n * @author sroucheray / http://sroucheray.org/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AxesHelper( size ) {\n\n\tsize = size || 1;\n\n\tvar vertices = [\n\t\t0, 0, 0,\tsize, 0, 0,\n\t\t0, 0, 0,\t0, size, 0,\n\t\t0, 0, 0,\t0, 0, size\n\t];\n\n\tvar colors = [\n\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t0, 0, 1,\t0, 0.6, 1\n\t];\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\tLineSegments.call( this, geometry, material );\n\n}\n\nAxesHelper.prototype = Object.create( LineSegments.prototype );\nAxesHelper.prototype.constructor = AxesHelper;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n}\n\nvar LineStrip = 0;\n\nvar LinePieces = 1;\n\nfunction MeshFaceMaterial( materials ) {\n\n\tconsole.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );\n\treturn materials;\n\n}\n\nfunction MultiMaterial( materials ) {\n\n\tif ( materials === undefined ) materials = [];\n\n\tconsole.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );\n\tmaterials.isMultiMaterial = true;\n\tmaterials.materials = materials;\n\tmaterials.clone = function () {\n\n\t\treturn materials.slice();\n\n\t};\n\treturn materials;\n\n}\n\nfunction PointCloud( geometry, material ) {\n\n\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\treturn new Points( geometry, material );\n\n}\n\nfunction Particle( material ) {\n\n\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\treturn new Sprite( material );\n\n}\n\nfunction ParticleSystem( geometry, material ) {\n\n\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\treturn new Points( geometry, material );\n\n}\n\nfunction PointCloudMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction ParticleBasicMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction ParticleSystemMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction Vertex( x, y, z ) {\n\n\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\treturn new Vector3( x, y, z );\n\n}\n\n//\n\nfunction DynamicBufferAttribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n}\n\nfunction Int8Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\treturn new Int8BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint8Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\treturn new Uint8BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n}\n\nfunction Int16Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\treturn new Int16BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint16Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\treturn new Uint16BufferAttribute( array, itemSize );\n\n}\n\nfunction Int32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\treturn new Int32BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\treturn new Uint32BufferAttribute( array, itemSize );\n\n}\n\nfunction Float32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\treturn new Float32BufferAttribute( array, itemSize );\n\n}\n\nfunction Float64Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\treturn new Float64BufferAttribute( array, itemSize );\n\n}\n\n//\n\nCurve.create = function ( construct, getPoint ) {\n\n\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\tconstruct.prototype = Object.create( Curve.prototype );\n\tconstruct.prototype.constructor = construct;\n\tconstruct.prototype.getPoint = getPoint;\n\n\treturn construct;\n\n};\n\n//\n\nObject.assign( CurvePath.prototype, {\n\n\tcreatePointsGeometry: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\t// generate geometry from path points (for Line or Points objects)\n\n\t\tvar pts = this.getPoints( divisions );\n\t\treturn this.createGeometry( pts );\n\n\t},\n\n\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\t// generate geometry from equidistant sampling along the path\n\n\t\tvar pts = this.getSpacedPoints( divisions );\n\t\treturn this.createGeometry( pts );\n\n\t},\n\n\tcreateGeometry: function ( points ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\tvar geometry = new Geometry();\n\n\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tvar point = points[ i ];\n\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n} );\n\n//\n\nObject.assign( Path.prototype, {\n\n\tfromPoints: function ( points ) {\n\n\t\tconsole.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );\n\t\tthis.setFromPoints( points );\n\n\t}\n\n} );\n\n//\n\nfunction ClosedSplineCurve3( points ) {\n\n\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\tthis.closed = true;\n\n}\n\nClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n//\n\nfunction SplineCurve3( points ) {\n\n\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\n}\n\nSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n//\n\nfunction Spline( points ) {\n\n\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\n}\n\nSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\nObject.assign( Spline.prototype, {\n\n\tinitFromArray: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t},\n\tgetControlPointsArray: function ( /* optionalTarget */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t},\n\treparametrizeByArcLength: function ( /* samplingCoef */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nfunction AxisHelper( size ) {\n\n\tconsole.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );\n\treturn new AxesHelper( size );\n\n}\n\nfunction BoundingBoxHelper( object, color ) {\n\n\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\treturn new BoxHelper( object, color );\n\n}\n\nfunction EdgesHelper( object, hex ) {\n\n\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n}\n\nGridHelper.prototype.setColors = function () {\n\n\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n};\n\nSkeletonHelper.prototype.update = function () {\n\n\tconsole.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );\n\n};\n\nfunction WireframeHelper( object, hex ) {\n\n\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n}\n\n//\n\nObject.assign( Loader.prototype, {\n\n\textractUrlBase: function ( url ) {\n\n\t\tconsole.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );\n\t\treturn LoaderUtils.extractUrlBase( url );\n\n\t}\n\n} );\n\nfunction XHRLoader( manager ) {\n\n\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\treturn new FileLoader( manager );\n\n}\n\nfunction BinaryTextureLoader( manager ) {\n\n\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\treturn new DataTextureLoader( manager );\n\n}\n\n//\n\nObject.assign( Box2.prototype, {\n\n\tcenter: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t},\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tsize: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\treturn this.getSize( optionalTarget );\n\n\t}\n} );\n\nObject.assign( Box3.prototype, {\n\n\tcenter: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t},\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tisIntersectionSphere: function ( sphere ) {\n\n\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\treturn this.intersectsSphere( sphere );\n\n\t},\n\tsize: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\treturn this.getSize( optionalTarget );\n\n\t}\n} );\n\nLine3.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\nObject.assign( _Math, {\n\n\trandom16: function () {\n\n\t\tconsole.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t},\n\n\tnearestPowerOfTwo: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' );\n\t\treturn _Math.floorPowerOfTwo( value );\n\n\t},\n\n\tnextPowerOfTwo: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' );\n\t\treturn _Math.ceilPowerOfTwo( value );\n\n\t}\n\n} );\n\nObject.assign( Matrix3.prototype, {\n\n\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\treturn this.toArray( array, offset );\n\n\t},\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\treturn vector.applyMatrix3( this );\n\n\t},\n\tmultiplyVector3Array: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );\n\n\t},\n\tapplyToBuffer: function ( buffer /*, offset, length */ ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\treturn this.applyToBufferAttribute( buffer );\n\n\t},\n\tapplyToVector3Array: function ( /* array, offset, length */ ) {\n\n\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t}\n\n} );\n\nObject.assign( Matrix4.prototype, {\n\n\textractPosition: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\treturn this.copyPosition( m );\n\n\t},\n\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\treturn this.toArray( array, offset );\n\n\t},\n\tgetPosition: function () {\n\n\t\tvar v1;\n\n\t\treturn function getPosition() {\n\n\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t};\n\n\t}(),\n\tsetRotationFromQuaternion: function ( q ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\treturn this.makeRotationFromQuaternion( q );\n\n\t},\n\tmultiplyToArray: function () {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );\n\n\t},\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\tmultiplyVector4: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\tmultiplyVector3Array: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );\n\n\t},\n\trotateAxis: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\tv.transformDirection( this );\n\n\t},\n\tcrossVector: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\ttranslate: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t},\n\trotateX: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t},\n\trotateY: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t},\n\trotateZ: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t},\n\trotateByAxis: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t},\n\tapplyToBuffer: function ( buffer /*, offset, length */ ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\treturn this.applyToBufferAttribute( buffer );\n\n\t},\n\tapplyToVector3Array: function ( /* array, offset, length */ ) {\n\n\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t},\n\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t}\n\n} );\n\nPlane.prototype.isIntersectionLine = function ( line ) {\n\n\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\treturn this.intersectsLine( line );\n\n};\n\nQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\treturn vector.applyQuaternion( this );\n\n};\n\nObject.assign( Ray.prototype, {\n\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tisIntersectionPlane: function ( plane ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\treturn this.intersectsPlane( plane );\n\n\t},\n\tisIntersectionSphere: function ( sphere ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\treturn this.intersectsSphere( sphere );\n\n\t}\n\n} );\n\nObject.assign( Triangle.prototype, {\n\n\tarea: function () {\n\n\t\tconsole.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );\n\t\treturn this.getArea();\n\n\t},\n\tbarycoordFromPoint: function ( point, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\t\treturn this.getBarycoord( point, target );\n\n\t},\n\tmidpoint: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );\n\t\treturn this.getMidpoint( target );\n\n\t},\n\tnormal: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\t\treturn this.getNormal( target );\n\n\t},\n\tplane: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );\n\t\treturn this.getPlane( target );\n\n\t}\n\n} );\n\nObject.assign( Triangle, {\n\n\tbarycoordFromPoint: function ( point, a, b, c, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\t\treturn Triangle.getBarycoord( point, a, b, c, target );\n\n\t},\n\tnormal: function ( a, b, c, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\t\treturn Triangle.getNormal( a, b, c, target );\n\n\t}\n\n} );\n\nObject.assign( Shape.prototype, {\n\n\textractAllPoints: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );\n\t\treturn this.extractPoints( divisions );\n\n\t},\n\textrude: function ( options ) {\n\n\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\treturn new ExtrudeGeometry( this, options );\n\n\t},\n\tmakeGeometry: function ( options ) {\n\n\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\treturn new ShapeGeometry( this, options );\n\n\t}\n\n} );\n\nObject.assign( Vector2.prototype, {\n\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tdistanceToManhattan: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\t\treturn this.manhattanDistanceTo( v );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\nObject.assign( Vector3.prototype, {\n\n\tsetEulerFromRotationMatrix: function () {\n\n\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t},\n\tsetEulerFromQuaternion: function () {\n\n\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t},\n\tgetPositionFromMatrix: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\treturn this.setFromMatrixPosition( m );\n\n\t},\n\tgetScaleFromMatrix: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\treturn this.setFromMatrixScale( m );\n\n\t},\n\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t},\n\tapplyProjection: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\treturn this.applyMatrix4( m );\n\n\t},\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tdistanceToManhattan: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\t\treturn this.manhattanDistanceTo( v );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\nObject.assign( Vector4.prototype, {\n\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\n//\n\nObject.assign( Geometry.prototype, {\n\n\tcomputeTangents: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t},\n\tcomputeLineDistances: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' );\n\n\t}\n\n} );\n\nObject.assign( Object3D.prototype, {\n\n\tgetChildByName: function ( name ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\treturn this.getObjectByName( name );\n\n\t},\n\trenderDepth: function () {\n\n\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t},\n\ttranslate: function ( distance, axis ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\treturn this.translateOnAxis( axis, distance );\n\n\t},\n\tgetWorldRotation: function () {\n\n\t\tconsole.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );\n\n\t}\n\n} );\n\nObject.defineProperties( Object3D.prototype, {\n\n\teulerOrder: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\treturn this.rotation.order;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\tthis.rotation.order = value;\n\n\t\t}\n\t},\n\tuseQuaternion: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( LOD.prototype, {\n\n\tobjects: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\treturn this.levels;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperty( Skeleton.prototype, 'useVertexTexture', {\n\n\tget: function () {\n\n\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t},\n\tset: function () {\n\n\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t}\n\n} );\n\nObject.defineProperty( Curve.prototype, '__arcLengthDivisions', {\n\n\tget: function () {\n\n\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\treturn this.arcLengthDivisions;\n\n\t},\n\tset: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\tthis.arcLengthDivisions = value;\n\n\t}\n\n} );\n\n//\n\nPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\tthis.setFocalLength( focalLength );\n\n};\n\n//\n\nObject.defineProperties( Light.prototype, {\n\tonlyShadow: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t}\n\t},\n\tshadowCameraFov: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\tthis.shadow.camera.fov = value;\n\n\t\t}\n\t},\n\tshadowCameraLeft: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\tthis.shadow.camera.left = value;\n\n\t\t}\n\t},\n\tshadowCameraRight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\tthis.shadow.camera.right = value;\n\n\t\t}\n\t},\n\tshadowCameraTop: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\tthis.shadow.camera.top = value;\n\n\t\t}\n\t},\n\tshadowCameraBottom: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t}\n\t},\n\tshadowCameraNear: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\tthis.shadow.camera.near = value;\n\n\t\t}\n\t},\n\tshadowCameraFar: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\tthis.shadow.camera.far = value;\n\n\t\t}\n\t},\n\tshadowCameraVisible: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t}\n\t},\n\tshadowBias: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\tthis.shadow.bias = value;\n\n\t\t}\n\t},\n\tshadowDarkness: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t}\n\t},\n\tshadowMapWidth: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t}\n\t},\n\tshadowMapHeight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t}\n\t}\n} );\n\n//\n\nObject.defineProperties( BufferAttribute.prototype, {\n\n\tlength: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\treturn this.array.length;\n\n\t\t}\n\t},\n\tcopyIndicesArray: function ( /* indices */ ) {\n\n\t\tconsole.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );\n\n\t}\n\n} );\n\nObject.assign( BufferGeometry.prototype, {\n\n\taddIndex: function ( index ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\tthis.setIndex( index );\n\n\t},\n\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\tif ( indexOffset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t}\n\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\tthis.addGroup( start, count );\n\n\t},\n\tclearDrawCalls: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\tthis.clearGroups();\n\n\t},\n\tcomputeTangents: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t},\n\tcomputeOffsets: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t}\n\n} );\n\nObject.defineProperties( BufferGeometry.prototype, {\n\n\tdrawcalls: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t},\n\toffsets: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.assign( ExtrudeBufferGeometry.prototype, {\n\n\tgetArrays: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' );\n\n\t},\n\n\taddShapeList: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' );\n\n\t},\n\n\taddShape: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Uniform.prototype, {\n\n\tdynamic: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t}\n\t},\n\tonUpdate: {\n\t\tvalue: function () {\n\n\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\treturn this;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Material.prototype, {\n\n\twrapAround: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t}\n\t},\n\twrapRGB: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapRGB has been removed.' );\n\t\t\treturn new Color();\n\n\t\t}\n\t},\n\n\tshading: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\tthis.flatShading = ( value === FlatShading );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\tmetal: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( ShaderMaterial.prototype, {\n\n\tderivatives: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\treturn this.extensions.derivatives;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\tthis.extensions.derivatives = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.assign( WebGLRenderer.prototype, {\n\n\tanimate: function ( callback ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' );\n\t\tthis.setAnimationLoop( callback );\n\n\t},\n\n\tgetCurrentRenderTarget: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );\n\t\treturn this.getRenderTarget();\n\n\t},\n\n\tgetMaxAnisotropy: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );\n\t\treturn this.capabilities.getMaxAnisotropy();\n\n\t},\n\n\tgetPrecision: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );\n\t\treturn this.capabilities.precision;\n\n\t},\n\n\tresetGLState: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );\n\t\treturn this.state.reset();\n\n\t},\n\n\tsupportsFloatTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t},\n\tsupportsHalfFloatTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t},\n\tsupportsStandardDerivatives: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t},\n\tsupportsCompressedTextureS3TC: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t},\n\tsupportsCompressedTexturePVRTC: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t},\n\tsupportsBlendMinMax: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t},\n\tsupportsVertexTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\treturn this.capabilities.vertexTextures;\n\n\t},\n\tsupportsInstancedArrays: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t},\n\tenableScissorTest: function ( boolean ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\tthis.setScissorTest( boolean );\n\n\t},\n\tinitMaterial: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t},\n\taddPrePlugin: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t},\n\taddPostPlugin: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t},\n\tupdateShadowMap: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t},\n\tsetFaceCulling: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );\n\n\t}\n\n} );\n\nObject.defineProperties( WebGLRenderer.prototype, {\n\n\tshadowMapEnabled: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.enabled;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\tthis.shadowMap.enabled = value;\n\n\t\t}\n\t},\n\tshadowMapType: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\tthis.shadowMap.type = value;\n\n\t\t}\n\t},\n\tshadowMapCullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t}\n} );\n\nObject.defineProperties( WebGLShadowMap.prototype, {\n\n\tcullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* cullFace */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderReverseSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderSingleSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\twrapS: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\treturn this.texture.wrapS;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\tthis.texture.wrapS = value;\n\n\t\t}\n\t},\n\twrapT: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\treturn this.texture.wrapT;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\tthis.texture.wrapT = value;\n\n\t\t}\n\t},\n\tmagFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\treturn this.texture.magFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\tthis.texture.magFilter = value;\n\n\t\t}\n\t},\n\tminFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\treturn this.texture.minFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\tthis.texture.minFilter = value;\n\n\t\t}\n\t},\n\tanisotropy: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\treturn this.texture.anisotropy;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\tthis.texture.anisotropy = value;\n\n\t\t}\n\t},\n\toffset: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\treturn this.texture.offset;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\tthis.texture.offset = value;\n\n\t\t}\n\t},\n\trepeat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\treturn this.texture.repeat;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\tthis.texture.repeat = value;\n\n\t\t}\n\t},\n\tformat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\treturn this.texture.format;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\tthis.texture.format = value;\n\n\t\t}\n\t},\n\ttype: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\treturn this.texture.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\tthis.texture.type = value;\n\n\t\t}\n\t},\n\tgenerateMipmaps: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\treturn this.texture.generateMipmaps;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( WebVRManager.prototype, {\n\n\tstanding: {\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebVRManager: .standing has been removed.' );\n\n\t\t}\n\t}\n\n} );\n\n//\n\nAudio.prototype.load = function ( file ) {\n\n\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\tvar scope = this;\n\tvar audioLoader = new AudioLoader();\n\taudioLoader.load( file, function ( buffer ) {\n\n\t\tscope.setBuffer( buffer );\n\n\t} );\n\treturn this;\n\n};\n\nAudioAnalyser.prototype.getData = function () {\n\n\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\treturn this.getFrequencyData();\n\n};\n\n//\n\nCubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {\n\n\tconsole.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );\n\treturn this.update( renderer, scene );\n\n};\n\n//\n\nvar GeometryUtils = {\n\n\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\tvar matrix;\n\n\t\tif ( geometry2.isMesh ) {\n\n\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\tmatrix = geometry2.matrix;\n\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t}\n\n\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t},\n\n\tcenter: function ( geometry ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\treturn geometry.center();\n\n\t}\n\n};\n\nvar ImageUtils = {\n\n\tcrossOrigin: undefined,\n\n\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\tvar loader = new TextureLoader();\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\treturn texture;\n\n\t},\n\n\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\tvar loader = new CubeTextureLoader();\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\treturn texture;\n\n\t},\n\n\tloadCompressedTexture: function () {\n\n\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t},\n\n\tloadCompressedTextureCube: function () {\n\n\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t}\n\n};\n\n//\n\nfunction Projector() {\n\n\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\tthis.projectVector = function ( vector, camera ) {\n\n\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\tvector.project( camera );\n\n\t};\n\n\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\tvector.unproject( camera );\n\n\t};\n\n\tthis.pickingRay = function () {\n\n\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t};\n\n}\n\n//\n\nfunction CanvasRenderer() {\n\n\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\tthis.clear = function () {};\n\tthis.render = function () {};\n\tthis.setClearColor = function () {};\n\tthis.setSize = function () {};\n\n}\n\n//\n\nvar SceneUtils = {\n\n\tcreateMultiMaterialObject: function ( /* geometry, materials */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );\n\n\t},\n\n\tdetach: function ( /* child, parent, scene */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );\n\n\t},\n\n\tattach: function ( /* child, scene, parent */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );\n\n\t}\n\n};\n\n//\n\nfunction LensFlare() {\n\n\tconsole.error( 'THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js' );\n\n}\n\nexport { WebGLRenderTargetCube, WebGLRenderTarget, WebGLRenderer, ShaderLib, UniformsLib, UniformsUtils, ShaderChunk, FogExp2, Fog, Scene, Sprite, LOD, SkinnedMesh, Skeleton, Bone, Mesh, LineSegments, LineLoop, Line, Points, Group, VideoTexture, DataTexture, CompressedTexture, CubeTexture, CanvasTexture, DepthTexture, Texture, CompressedTextureLoader, DataTextureLoader, CubeTextureLoader, TextureLoader, ObjectLoader, MaterialLoader, BufferGeometryLoader, DefaultLoadingManager, LoadingManager, JSONLoader, ImageLoader, ImageBitmapLoader, FontLoader, FileLoader, Loader, LoaderUtils, Cache, AudioLoader, SpotLightShadow, SpotLight, PointLight, RectAreaLight, HemisphereLight, DirectionalLightShadow, DirectionalLight, AmbientLight, LightShadow, Light, StereoCamera, PerspectiveCamera, OrthographicCamera, CubeCamera, ArrayCamera, Camera, AudioListener, PositionalAudio, AudioContext, AudioAnalyser, Audio, VectorKeyframeTrack, StringKeyframeTrack, QuaternionKeyframeTrack, NumberKeyframeTrack, ColorKeyframeTrack, BooleanKeyframeTrack, PropertyMixer, PropertyBinding, KeyframeTrack, AnimationUtils, AnimationObjectGroup, AnimationMixer, AnimationClip, Uniform, InstancedBufferGeometry, BufferGeometry, Geometry, InterleavedBufferAttribute, InstancedInterleavedBuffer, InterleavedBuffer, InstancedBufferAttribute, Face3, Object3D, Raycaster, Layers, EventDispatcher, Clock, QuaternionLinearInterpolant, LinearInterpolant, DiscreteInterpolant, CubicInterpolant, Interpolant, Triangle, _Math as Math, Spherical, Cylindrical, Plane, Frustum, Sphere, Ray, Matrix4, Matrix3, Box3, Box2, Line3, Euler, Vector4, Vector3, Vector2, Quaternion, Color, ImmediateRenderObject, VertexNormalsHelper, SpotLightHelper, SkeletonHelper, PointLightHelper, RectAreaLightHelper, HemisphereLightHelper, GridHelper, PolarGridHelper, FaceNormalsHelper, DirectionalLightHelper, CameraHelper, BoxHelper, Box3Helper, PlaneHelper, ArrowHelper, AxesHelper, Shape, Path, ShapePath, Font, CurvePath, Curve, ShapeUtils, WebGLUtils, WireframeGeometry, ParametricGeometry, ParametricBufferGeometry, TetrahedronGeometry, TetrahedronBufferGeometry, OctahedronGeometry, OctahedronBufferGeometry, IcosahedronGeometry, IcosahedronBufferGeometry, DodecahedronGeometry, DodecahedronBufferGeometry, PolyhedronGeometry, PolyhedronBufferGeometry, TubeGeometry, TubeBufferGeometry, TorusKnotGeometry, TorusKnotBufferGeometry, TorusGeometry, TorusBufferGeometry, TextGeometry, TextBufferGeometry, SphereGeometry, SphereBufferGeometry, RingGeometry, RingBufferGeometry, PlaneGeometry, PlaneBufferGeometry, LatheGeometry, LatheBufferGeometry, ShapeGeometry, ShapeBufferGeometry, ExtrudeGeometry, ExtrudeBufferGeometry, EdgesGeometry, ConeGeometry, ConeBufferGeometry, CylinderGeometry, CylinderBufferGeometry, CircleGeometry, CircleBufferGeometry, BoxGeometry, BoxBufferGeometry, ShadowMaterial, SpriteMaterial, RawShaderMaterial, ShaderMaterial, PointsMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshPhongMaterial, MeshToonMaterial, MeshNormalMaterial, MeshLambertMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshBasicMaterial, LineDashedMaterial, LineBasicMaterial, Material, Float64BufferAttribute, Float32BufferAttribute, Uint32BufferAttribute, Int32BufferAttribute, Uint16BufferAttribute, Int16BufferAttribute, Uint8ClampedBufferAttribute, Uint8BufferAttribute, Int8BufferAttribute, BufferAttribute, ArcCurve, CatmullRomCurve3, CubicBezierCurve, CubicBezierCurve3, EllipseCurve, LineCurve, LineCurve3, QuadraticBezierCurve, QuadraticBezierCurve3, SplineCurve, REVISION, MOUSE, CullFaceNone, CullFaceBack, CullFaceFront, CullFaceFrontBack, FrontFaceDirectionCW, FrontFaceDirectionCCW, BasicShadowMap, PCFShadowMap, PCFSoftShadowMap, FrontSide, BackSide, DoubleSide, FlatShading, SmoothShading, NoColors, FaceColors, VertexColors, NoBlending, NormalBlending, AdditiveBlending, SubtractiveBlending, MultiplyBlending, CustomBlending, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, ZeroFactor, OneFactor, SrcColorFactor, OneMinusSrcColorFactor, SrcAlphaFactor, OneMinusSrcAlphaFactor, DstAlphaFactor, OneMinusDstAlphaFactor, DstColorFactor, OneMinusDstColorFactor, SrcAlphaSaturateFactor, NeverDepth, AlwaysDepth, LessDepth, LessEqualDepth, EqualDepth, GreaterEqualDepth, GreaterDepth, NotEqualDepth, MultiplyOperation, MixOperation, AddOperation, NoToneMapping, LinearToneMapping, ReinhardToneMapping, Uncharted2ToneMapping, CineonToneMapping, UVMapping, CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping, SphericalReflectionMapping, CubeUVReflectionMapping, CubeUVRefractionMapping, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter, NearestMipMapNearestFilter, NearestMipMapLinearFilter, LinearFilter, LinearMipMapNearestFilter, LinearMipMapLinearFilter, UnsignedByteType, ByteType, ShortType, UnsignedShortType, IntType, UnsignedIntType, FloatType, HalfFloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShort565Type, UnsignedInt248Type, AlphaFormat, RGBFormat, RGBAFormat, LuminanceFormat, LuminanceAlphaFormat, RGBEFormat, DepthFormat, DepthStencilFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, LoopOnce, LoopRepeat, LoopPingPong, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, ZeroCurvatureEnding, ZeroSlopeEnding, WrapAroundEnding, TrianglesDrawMode, TriangleStripDrawMode, TriangleFanDrawMode, LinearEncoding, sRGBEncoding, GammaEncoding, RGBEEncoding, LogLuvEncoding, RGBM7Encoding, RGBM16Encoding, RGBDEncoding, BasicDepthPacking, RGBADepthPacking, BoxGeometry as CubeGeometry, Face4, LineStrip, LinePieces, MeshFaceMaterial, MultiMaterial, PointCloud, Particle, ParticleSystem, PointCloudMaterial, ParticleBasicMaterial, ParticleSystemMaterial, Vertex, DynamicBufferAttribute, Int8Attribute, Uint8Attribute, Uint8ClampedAttribute, Int16Attribute, Uint16Attribute, Int32Attribute, Uint32Attribute, Float32Attribute, Float64Attribute, ClosedSplineCurve3, SplineCurve3, Spline, AxisHelper, BoundingBoxHelper, EdgesHelper, WireframeHelper, XHRLoader, BinaryTextureLoader, GeometryUtils, ImageUtils, Projector, CanvasRenderer, SceneUtils, LensFlare };\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","/**\n* attempt of a simple defer/promise library for mobile development\n* @author Jonathan Gotti < jgotti at jgotti dot net>\n* @since 2012-10\n* @version 0.7.5\n*/\n(function(undef){\n\t\"use strict\";\n\n\tvar nextTick\n\t\t, isFunc = function(f){ return ( typeof f === 'function' ); }\n\t\t, isArray = function(a){ return Array.isArray ? Array.isArray(a) : (a instanceof Array); }\n\t\t, isObjOrFunc = function(o){ return !!(o && (typeof o).match(/function|object/)); }\n\t\t, isNotVal = function(v){ return (v === false || v === undef || v === null); }\n\t\t, slice = function(a, offset){ return [].slice.call(a, offset); }\n\t\t, undefStr = 'undefined'\n\t\t, tErr = typeof TypeError === undefStr ? Error : TypeError\n\t;\n\tif ( (typeof process !== undefStr) && process.nextTick ) {\n\t\tnextTick = process.nextTick;\n\t} else if ( typeof MessageChannel !== undefStr ) {\n\t\tvar ntickChannel = new MessageChannel(), queue = [];\n\t\tntickChannel.port1.onmessage = function(){ queue.length && (queue.shift())(); };\n\t\tnextTick = function(cb){\n\t\t\tqueue.push(cb);\n\t\t\tntickChannel.port2.postMessage(0);\n\t\t};\n\t} else {\n\t\tnextTick = function(cb){ setTimeout(cb, 0); };\n\t}\n\tfunction rethrow(e){ nextTick(function(){ throw e;}); }\n\n\t/**\n\t * a function called on fulfilled promise resolution\n\t * @typedef {function} fulfilled\n\t * @param {*} value promise resolved value\n\t * @returns {*} next promise resolution value\n\t */\n\n\t/**\n\t * a function called on failed promise resolution\n\t * @typedef {function} failed\n\t * @param {*} reason promise rejection reason\n\t * @returns {*} next promise resolution value or rethrow the reason\n\t */\n\n\t//-- defining unenclosed promise methods --//\n\t/**\n\t * same as then without failed callback\n\t * @param {fulfilled} fulfilled callback\n\t * @returns {promise} a new promise\n\t */\n\tfunction promise_success(fulfilled){ return this.then(fulfilled, undef); }\n\n\t/**\n\t * same as then with only a failed callback\n\t * @param {failed} failed callback\n\t * @returns {promise} a new promise\n\t */\n\tfunction promise_error(failed){ return this.then(undef, failed); }\n\n\n\t/**\n\t * same as then but fulfilled callback will receive multiple parameters when promise is fulfilled with an Array\n\t * @param {fulfilled} fulfilled callback\n\t * @param {failed} failed callback\n\t * @returns {promise} a new promise\n\t */\n\tfunction promise_apply(fulfilled, failed){\n\t\treturn this.then(\n\t\t\tfunction(a){\n\t\t\t\treturn isFunc(fulfilled) ? fulfilled.apply(null, isArray(a) ? a : [a]) : (defer.onlyFuncs ? a : fulfilled);\n\t\t\t}\n\t\t\t, failed || undef\n\t\t);\n\t}\n\n\t/**\n\t * cleanup method which will be always executed regardless fulfillment or rejection\n\t * @param {function} cb a callback called regardless of the fulfillment or rejection of the promise which will be called\n\t * when the promise is not pending anymore\n\t * @returns {promise} the same promise untouched\n\t */\n\tfunction promise_ensure(cb){\n\t\tfunction _cb(){ cb(); }\n\t\tthis.then(_cb, _cb);\n\t\treturn this;\n\t}\n\n\t/**\n\t * take a single callback which wait for an error as first parameter. other resolution values are passed as with the apply/spread method\n\t * @param {function} cb a callback called regardless of the fulfillment or rejection of the promise which will be called\n\t * when the promise is not pending anymore with error as first parameter if any as in node style\n\t * callback. Rest of parameters will be applied as with the apply method.\n\t * @returns {promise} a new promise\n\t */\n\tfunction promise_nodify(cb){\n\t\treturn this.then(\n\t\t\tfunction(a){\n\t\t\t\treturn isFunc(cb) ? cb.apply(null, isArray(a) ? a.splice(0,0,undefined) && a : [undefined,a]) : (defer.onlyFuncs ? a : cb);\n\t\t\t}\n\t\t\t, function(e){\n\t\t\t\treturn cb(e);\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t *\n\t * @param {function} [failed] without parameter will only rethrow promise rejection reason outside of the promise library on next tick\n\t * if passed a failed method then will call failed on rejection and throw the error again if failed didn't\n\t * @returns {promise} a new promise\n\t */\n\tfunction promise_rethrow(failed){\n\t\treturn this.then(\n\t\t\tundef\n\t\t\t, failed ? function(e){ failed(e); throw e; } : rethrow\n\t\t);\n\t}\n\n\t/**\n\t* return a defer object\n\t* @param {boolean} [alwaysAsync] if set force the async resolution for this promise independantly of the D.alwaysAsync option\n\t* @returns {deferred} defered object with property 'promise' and methods reject,fulfill,resolve (fulfill being an alias for resolve)\n\t*/\n\tvar defer = function (alwaysAsync){\n\t\tvar alwaysAsyncFn = (undef !== alwaysAsync ? alwaysAsync : defer.alwaysAsync) ? nextTick : function(fn){fn();}\n\t\t\t, status = 0 // -1 failed | 1 fulfilled\n\t\t\t, pendings = []\n\t\t\t, value\n\t\t\t/**\n\t\t\t * @typedef promise\n\t\t\t */\n\t\t\t, _promise = {\n\t\t\t\t/**\n\t\t\t\t * @param {fulfilled|function} fulfilled callback\n\t\t\t\t * @param {failed|function} failed callback\n\t\t\t\t * @returns {promise} a new promise\n\t\t\t\t */\n\t\t\t\tthen: function(fulfilled, failed){\n\t\t\t\t\tvar d = defer();\n\t\t\t\t\tpendings.push([\n\t\t\t\t\t\tfunction(value){\n\t\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\t\tif( isNotVal(fulfilled)){\n\t\t\t\t\t\t\t\t\td.resolve(value);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\td.resolve(isFunc(fulfilled) ? fulfilled(value) : (defer.onlyFuncs ? value : fulfilled));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t\t\td.reject(e);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t, function(err){\n\t\t\t\t\t\t\tif ( isNotVal(failed) || ((!isFunc(failed)) && defer.onlyFuncs) ) {\n\t\t\t\t\t\t\t\td.reject(err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( failed ) {\n\t\t\t\t\t\t\t\ttry{ d.resolve(isFunc(failed) ? failed(err) : failed); }catch(e){ d.reject(e);}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]);\n\t\t\t\t\tstatus !== 0 && alwaysAsyncFn(execCallbacks);\n\t\t\t\t\treturn d.promise;\n\t\t\t\t}\n\n\t\t\t\t, success: promise_success\n\n\t\t\t\t, error: promise_error\n\t\t\t\t, otherwise: promise_error\n\n\t\t\t\t, apply: promise_apply\n\t\t\t\t, spread: promise_apply\n\n\t\t\t\t, ensure: promise_ensure\n\n\t\t\t\t, nodify: promise_nodify\n\n\t\t\t\t, rethrow: promise_rethrow\n\n\t\t\t\t, isPending: function(){ return status === 0; }\n\n\t\t\t\t, getStatus: function(){ return status; }\n\t\t\t}\n\t\t;\n\t\t_promise.toSource = _promise.toString = _promise.valueOf = function(){return value === undef ? this : value; };\n\n\n\t\tfunction execCallbacks(){\n\t\t\t/*jshint bitwise:false*/\n\t\t\tif ( status === 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar cbs = pendings, i = 0, l = cbs.length, cbIndex = ~status ? 0 : 1, cb;\n\t\t\tpendings = [];\n\t\t\tfor( ; i < l; i++ ){\n\t\t\t\t(cb = cbs[i][cbIndex]) && cb(value);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * fulfill deferred with given value\n\t\t * @param {*} val\n\t\t * @returns {deferred} this for method chaining\n\t\t */\n\t\tfunction _resolve(val){\n\t\t\tvar done = false;\n\t\t\tfunction once(f){\n\t\t\t\treturn function(x){\n\t\t\t\t\tif (done) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\treturn f(x);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ( status ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tvar then = isObjOrFunc(val) && val.then;\n\t\t\t\tif ( isFunc(then) ) { // managing a promise\n\t\t\t\t\tif( val === _promise ){\n\t\t\t\t\t\tthrow new tErr(\"Promise can't resolve itself\");\n\t\t\t\t\t}\n\t\t\t\t\tthen.call(val, once(_resolve), once(_reject));\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tonce(_reject)(e);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\talwaysAsyncFn(function(){\n\t\t\t\tvalue = val;\n\t\t\t\tstatus = 1;\n\t\t\t\texecCallbacks();\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * reject deferred with given reason\n\t\t * @param {*} Err\n\t\t * @returns {deferred} this for method chaining\n\t\t */\n\t\tfunction _reject(Err){\n\t\t\tstatus || alwaysAsyncFn(function(){\n\t\t\t\ttry{ throw(Err); }catch(e){ value = e; }\n\t\t\t\tstatus = -1;\n\t\t\t\texecCallbacks();\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\t\treturn /**@type deferred */ {\n\t\t\tpromise:_promise\n\t\t\t,resolve:_resolve\n\t\t\t,fulfill:_resolve // alias\n\t\t\t,reject:_reject\n\t\t};\n\t};\n\n\tdefer.deferred = defer.defer = defer;\n\tdefer.nextTick = nextTick;\n\tdefer.alwaysAsync = true; // setting this will change default behaviour. use it only if necessary as asynchronicity will force some delay between your promise resolutions and is not always what you want.\n\t/**\n\t* setting onlyFuncs to false will break promises/A+ conformity by allowing you to pass non undefined/null values instead of callbacks\n\t* instead of just ignoring any non function parameters to then,success,error... it will accept non null|undefined values.\n\t* this will allow you shortcuts like promise.then('val','handled error'')\n\t* to be equivalent of promise.then(function(){ return 'val';},function(){ return 'handled error'})\n\t*/\n\tdefer.onlyFuncs = true;\n\n\t/**\n\t * return a fulfilled promise of given value (always async resolution)\n\t * @param {*} value\n\t * @returns {promise}\n\t */\n\tdefer.resolve = defer.resolved = defer.fulfilled = function(value){ return defer(true).resolve(value).promise; };\n\n\t/**\n\t * return a rejected promise with given reason of rejection (always async rejection)\n\t * @param {*} reason\n\t * @returns {promise}\n\t */\n\tdefer.reject = defer.rejected = function(reason){ return defer(true).reject(reason).promise; };\n\n\t/**\n\t * return a promise with no resolution value which will be resolved in time ms (using setTimeout)\n\t * @param {int} [time] in ms default to 0\n\t * @returns {promise}\n\t */\n\tdefer.wait = function(time){\n\t\tvar d = defer();\n\t\tsetTimeout(d.resolve, time || 0);\n\t\treturn d.promise;\n\t};\n\n\t/**\n\t * return a promise for the return value of function call which will be fulfilled in delay ms or rejected if given fn throw an error\n\t * @param {*} fn to execute or value to return after given delay\n\t * @param {int} [delay] in ms default to 0\n\t * @returns {promise}\n\t */\n\tdefer.delay = function(fn, delay){\n\t\tvar d = defer();\n\t\tsetTimeout(function(){ try{ d.resolve(isFunc(fn) ? fn.apply(null) : fn); }catch(e){ d.reject(e); } }, delay || 0);\n\t\treturn d.promise;\n\t};\n\n\t/**\n\t * if given value is not a promise return a fulfilled promise resolved to given value\n\t * @param {*} promise a value or a promise\n\t * @returns {promise}\n\t */\n\tdefer.promisify = function(promise){\n\t\tif ( promise && isFunc(promise.then) ) { return promise;}\n\t\treturn defer.resolved(promise);\n\t};\n\n\tfunction multiPromiseResolver(callerArguments, returnPromises){\n\t\tvar promises = slice(callerArguments);\n\t\tif ( promises.length === 1 && isArray(promises[0]) ) {\n\t\t\tif(! promises[0].length ){\n\t\t\t\treturn defer.fulfilled([]);\n\t\t\t}\n\t\t\tpromises = promises[0];\n\t\t}\n\t\tvar args = []\n\t\t\t, d = defer()\n\t\t\t, c = promises.length\n\t\t;\n\t\tif ( !c ) {\n\t\t\td.resolve(args);\n\t\t} else {\n\t\t\tvar resolver = function(i){\n\t\t\t\tpromises[i] = defer.promisify(promises[i]);\n\t\t\t\tpromises[i].then(\n\t\t\t\t\tfunction(v){\n\t\t\t\t\t\targs[i] = returnPromises ? promises[i] : v;\n\t\t\t\t\t\t(--c) || d.resolve(args);\n\t\t\t\t\t}\n\t\t\t\t\t, function(e){\n\t\t\t\t\t\tif( ! returnPromises ){\n\t\t\t\t\t\t\td.reject(e);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs[i] = promises[i];\n\t\t\t\t\t\t\t(--c) || d.resolve(args);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t};\n\t\t\tfor( var i = 0, l = c; i < l; i++ ){\n\t\t\t\tresolver(i);\n\t\t\t}\n\t\t}\n\t\treturn d.promise;\n\t}\n\n\tfunction sequenceZenifier(promise, zenValue){\n\t\treturn promise.then(isFunc(zenValue) ? zenValue : function(){return zenValue;});\n\t}\n\tfunction sequencePromiseResolver(callerArguments){\n\t\tvar funcs = slice(callerArguments);\n\t\tif ( funcs.length === 1 && isArray(funcs[0]) ) {\n\t\t\tfuncs = funcs[0];\n\t\t}\n\t\tvar d = defer(), i=0, l=funcs.length, promise = defer.resolved();\n\t\tfor(; i<l; i++){\n\t\t\tpromise = sequenceZenifier(promise, funcs[i]);\n\t\t}\n\t\td.resolve(promise);\n\t\treturn d.promise;\n\t}\n\n\t/**\n\t * return a promise for all given promises / values.\n\t * the returned promises will be fulfilled with a list of resolved value.\n\t * if any given promise is rejected then on the first rejection the returned promised will be rejected with the same reason\n\t * @param {array|...*} [promise] can be a single array of promise/values as first parameter or a list of direct parameters promise/value\n\t * @returns {promise} of a list of given promise resolution value\n\t */\n\tdefer.all = function(){ return multiPromiseResolver(arguments,false); };\n\n\t/**\n\t * return an always fulfilled promise of array<promise> list of promises/values regardless they resolve fulfilled or rejected\n\t * @param {array|...*} [promise] can be a single array of promise/values as first parameter or a list of direct parameters promise/value\n\t * (non promise values will be promisified)\n\t * @returns {promise} of the list of given promises\n\t */\n\tdefer.resolveAll = function(){ return multiPromiseResolver(arguments,true); };\n\n\t/**\n\t* execute given function in sequence passing their returned values to the next one in sequence.\n\t* You can pass values or promise instead of functions they will be passed in the sequence as if a function returned them.\n\t* if any function throw an error or a rejected promise the final returned promise will be rejected with that reason.\n\t* @param {array|...*} [function] list of function to call in sequence receiving previous one as a parameter\n\t* (non function values will be treated as if returned by a function)\n\t* @returns {promise} of the list of given promises\n\t*/\n\tdefer.sequence = function(){ return sequencePromiseResolver(arguments); };\n\n\t/**\n\t * transform a typical nodejs async method awaiting a callback as last parameter, receiving error as first parameter to a function that\n\t * will return a promise instead. the returned promise will resolve with normal callback value minus the first error parameter on\n\t * fulfill and will be rejected with that error as reason in case of error.\n\t * @param {object} [subject] optional subject of the method to encapsulate\n\t * @param {function} fn the function to encapsulate if the normal callback should receive more than a single parameter (minus the error)\n\t * the promise will resolve with the list or parameters as fulfillment value. If only one parameter is sent to the\n\t * callback then it will be used as the resolution value.\n\t * @returns {Function}\n\t */\n\tdefer.nodeCapsule = function(subject, fn){\n\t\tif ( !fn ) {\n\t\t\tfn = subject;\n\t\t\tsubject = void(0);\n\t\t}\n\t\treturn function(){\n\t\t\tvar d = defer(), args = slice(arguments);\n\t\t\targs.push(function(err, res){\n\t\t\t\terr ? d.reject(err) : d.resolve(arguments.length > 2 ? slice(arguments, 1) : res);\n\t\t\t});\n\t\t\ttry{\n\t\t\t\tfn.apply(subject, args);\n\t\t\t}catch(e){\n\t\t\t\td.reject(e);\n\t\t\t}\n\t\t\treturn d.promise;\n\t\t};\n\t};\n\n\t/*global define*/\n\tif ( typeof define === 'function' && define.amd ) {\n\t\tdefine('D.js', [], function(){ return defer; });\n\t} else if ( typeof module !== undefStr && module.exports ) {\n\t\tmodule.exports = defer;\n\t} else if ( typeof window !== undefStr ) {\n\t\tvar oldD = window.D;\n\t\t/**\n\t\t * restore global D variable to its previous value and return D to the user\n\t\t * @returns {Function}\n\t\t */\n\t\tdefer.noConflict = function(){\n\t\t\twindow.D = oldD;\n\t\t\treturn defer;\n\t\t};\n\t\twindow.D = defer;\n\t}\n})();\n","/*!\n * uEvent - to make any js object an event emitter\n * Copyright 2011 Jerome Etienne (http://jetienne.com)\n * Copyright 2015-2016 Damien \"Mistic\" Sorel (http://www.strangeplanet.fr)\n * Licensed under MIT (http://opensource.org/licenses/MIT)\n */\n\n(function(root, factory) {\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = factory();\n }\n else if (typeof define === 'function' && define.amd) {\n define([], factory);\n }\n else {\n root.uEvent = factory();\n }\n}(this, function() {\n \"use strict\";\n\n var returnTrue = function() {\n return true;\n };\n var returnFalse = function() {\n return false;\n };\n\n var uEvent = function() {\n };\n\n /**\n * Event object used to stop propagations and prevent default\n */\n uEvent.Event = function(type, args) {\n var typeReadOnly = type;\n var argsReadonly = args;\n\n Object.defineProperties(this, {\n 'type': {\n get: function() {\n return typeReadOnly;\n },\n set: function(value) {\n },\n enumerable: true\n },\n 'args': {\n get: function() {\n return argsReadonly;\n },\n set: function(value) {\n },\n enumerable: true\n }\n });\n };\n\n uEvent.Event.prototype = {\n constructor: uEvent.Event,\n\n isDefaultPrevented: returnFalse,\n isPropagationStopped: returnFalse,\n\n preventDefault: function() {\n this.isDefaultPrevented = returnTrue;\n },\n stopPropagation: function() {\n this.isPropagationStopped = returnTrue;\n }\n };\n\n uEvent.prototype = {\n constructor: uEvent,\n\n /**\n * Add one or many event handlers\n *\n * obj.on('event', callback)\n * obj.on('event', listener) -- listener has an handleEvent method\n * obj.on('event1 event2', callback)\n * obj.on({ event1: callback1, event2: callback2 })\n *\n * @param {String,Object} events\n * @param {Function,optional} callback\n * @return {Object} main object\n */\n on: function(events, callback) {\n this.__events = this.__events || {};\n\n if (typeof events === 'object') {\n for (var event in events) {\n if (events.hasOwnProperty(event)) {\n this.__events[event] = this.__events[event] || [];\n this.__events[event].push(events[event]);\n }\n }\n }\n else {\n events.split(' ').forEach(function(event) {\n this.__events[event] = this.__events[event] || [];\n this.__events[event].push(callback);\n }, this);\n }\n\n return this;\n },\n\n /**\n * Remove one or many or all event handlers\n *\n * obj.off('event')\n * obj.off('event', callback)\n * obj.off('event1 event2')\n * obj.off({ event1: callback1, event2: callback2 })\n * obj.off()\n *\n * @param {String|Object,optional} events\n * @param {Function,optional} callback\n * @return {Object} main object\n */\n off: function(events, callback) {\n this.__events = this.__events || {};\n\n if (typeof events === 'object') {\n for (var event in events) {\n if (events.hasOwnProperty(event) && (event in this.__events)) {\n var index = this.__events[event].indexOf(events[event]);\n if (index !== -1) this.__events[event].splice(index, 1);\n }\n }\n }\n else if (!!events) {\n events.split(' ').forEach(function(event) {\n if (event in this.__events) {\n if (callback) {\n var index = this.__events[event].indexOf(callback);\n if (index !== -1) this.__events[event].splice(index, 1);\n }\n else {\n this.__events[event].length = 0;\n }\n }\n }, this);\n }\n else {\n this.__events = {};\n }\n\n return this;\n },\n\n /**\n * Add one or many event handlers that will be called only once\n * This handlers are only applicable to \"trigger\", not \"change\"\n *\n * obj.once('event', callback)\n * obj.once('event1 event2', callback)\n * obj.once({ event1: callback1, event2: callback2 })\n *\n * @param {String|Object} events\n * @param {Function,optional} callback\n * @return {Object} main object\n */\n once: function(events, callback) {\n this.__once = this.__once || {};\n\n if (typeof events === 'object') {\n for (var event in events) {\n if (events.hasOwnProperty(event)) {\n this.__once[event] = this.__once[event] || [];\n this.__once[event].push(events[event]);\n }\n }\n }\n else {\n events.split(' ').forEach(function(event) {\n this.__once[event] = this.__once[event] || [];\n this.__once[event].push(callback);\n }, this);\n }\n\n return this;\n },\n\n /**\n * Trigger all handlers for an event\n *\n * @param {String} event name\n * @param {mixed...,optional} arguments\n * @return {uEvent.Event}\n */\n trigger: function(event /* , args... */) {\n var args = Array.prototype.slice.call(arguments, 1);\n var e = new uEvent.Event(event, args);\n var i, l, f;\n\n args.push(e);\n\n if (this.__events && event in this.__events) {\n for (i = 0, l = this.__events[event].length; i < l; i++) {\n f = this.__events[event][i];\n if (typeof f === 'object') {\n f.handleEvent(e);\n }\n else {\n f.apply(this, args);\n }\n if (e.isPropagationStopped()) {\n return e;\n }\n }\n }\n\n if (this.__once && event in this.__once) {\n for (i = 0, l = this.__once[event].length; i < l; i++) {\n f = this.__once[event][i];\n if (typeof f === 'object') {\n f.handleEvent(e);\n }\n else {\n f.apply(this, args);\n }\n if (e.isPropagationStopped()) {\n delete this.__once[event];\n return e;\n }\n }\n delete this.__once[event];\n }\n\n return e;\n },\n\n /**\n * Trigger all modificators for an event, each handler must return a value\n *\n * @param {String} event name\n * @param {mixed} event value\n * @param {mixed...,optional} arguments\n * @return {mixed} modified value\n */\n change: function(event, value /* , args... */) {\n var args = Array.prototype.slice.call(arguments, 1);\n var e = new uEvent.Event(event, args);\n var i, l, f;\n\n args.push(e);\n\n if (this.__events && event in this.__events) {\n for (i = 0, l = this.__events[event].length; i < l; i++) {\n args[0] = value;\n f = this.__events[event][i];\n if (typeof f === 'object') {\n value = f.handleEvent(e);\n }\n else {\n value = f.apply(this, args);\n }\n if (e.isPropagationStopped()) {\n return value;\n }\n }\n }\n\n return value;\n }\n };\n\n /**\n * Copy all uEvent functions in the destination object\n *\n * @param {Object} target, the object which will support uEvent\n * @param {Object,optional} names, strings map to rename methods\n */\n uEvent.mixin = function(target, names) {\n names = names || {};\n target = typeof target === 'function' ? target.prototype : target;\n\n ['on', 'off', 'once', 'trigger', 'change'].forEach(function(name) {\n var method = names[name] || name;\n target[method] = uEvent.prototype[name];\n });\n\n Object.defineProperties(target, {\n '__events': {\n value: null,\n writable: true\n },\n '__once': {\n value: null,\n writable: true\n }\n });\n };\n\n return uEvent;\n}));\n","// doT.js\n// 2011-2014, Laura Doktorova, https://github.com/olado/doT\n// Licensed under the MIT license.\n\n(function () {\n\t\"use strict\";\n\n\tvar doT = {\n\t\tname: \"doT\",\n\t\tversion: \"1.1.1\",\n\t\ttemplateSettings: {\n\t\t\tevaluate: /\\{\\{([\\s\\S]+?(\\}?)+)\\}\\}/g,\n\t\t\tinterpolate: /\\{\\{=([\\s\\S]+?)\\}\\}/g,\n\t\t\tencode: /\\{\\{!([\\s\\S]+?)\\}\\}/g,\n\t\t\tuse: /\\{\\{#([\\s\\S]+?)\\}\\}/g,\n\t\t\tuseParams: /(^|[^\\w$])def(?:\\.|\\[[\\'\\\"])([\\w$\\.]+)(?:[\\'\\\"]\\])?\\s*\\:\\s*([\\w$\\.]+|\\\"[^\\\"]+\\\"|\\'[^\\']+\\'|\\{[^\\}]+\\})/g,\n\t\t\tdefine: /\\{\\{##\\s*([\\w\\.$]+)\\s*(\\:|=)([\\s\\S]+?)#\\}\\}/g,\n\t\t\tdefineParams:/^\\s*([\\w$]+):([\\s\\S]+)/,\n\t\t\tconditional: /\\{\\{\\?(\\?)?\\s*([\\s\\S]*?)\\s*\\}\\}/g,\n\t\t\titerate: /\\{\\{~\\s*(?:\\}\\}|([\\s\\S]+?)\\s*\\:\\s*([\\w$]+)\\s*(?:\\:\\s*([\\w$]+))?\\s*\\}\\})/g,\n\t\t\tvarname:\t\"it\",\n\t\t\tstrip:\t\ttrue,\n\t\t\tappend:\t\ttrue,\n\t\t\tselfcontained: false,\n\t\t\tdoNotSkipEncoded: false\n\t\t},\n\t\ttemplate: undefined, //fn, compile template\n\t\tcompile: undefined, //fn, for express\n\t\tlog: true\n\t}, _globals;\n\n\tdoT.encodeHTMLSource = function(doNotSkipEncoded) {\n\t\tvar encodeHTMLRules = { \"&\": \"&#38;\", \"<\": \"&#60;\", \">\": \"&#62;\", '\"': \"&#34;\", \"'\": \"&#39;\", \"/\": \"&#47;\" },\n\t\t\tmatchHTML = doNotSkipEncoded ? /[&<>\"'\\/]/g : /&(?!#?\\w+;)|<|>|\"|'|\\//g;\n\t\treturn function(code) {\n\t\t\treturn code ? code.toString().replace(matchHTML, function(m) {return encodeHTMLRules[m] || m;}) : \"\";\n\t\t};\n\t};\n\n\t_globals = (function(){ return this || (0,eval)(\"this\"); }());\n\n\t/* istanbul ignore else */\n\tif (typeof module !== \"undefined\" && module.exports) {\n\t\tmodule.exports = doT;\n\t} else if (typeof define === \"function\" && define.amd) {\n\t\tdefine(function(){return doT;});\n\t} else {\n\t\t_globals.doT = doT;\n\t}\n\n\tvar startend = {\n\t\tappend: { start: \"'+(\", end: \")+'\", startencode: \"'+encodeHTML(\" },\n\t\tsplit: { start: \"';out+=(\", end: \");out+='\", startencode: \"';out+=encodeHTML(\" }\n\t}, skip = /$^/;\n\n\tfunction resolveDefs(c, block, def) {\n\t\treturn ((typeof block === \"string\") ? block : block.toString())\n\t\t.replace(c.define || skip, function(m, code, assign, value) {\n\t\t\tif (code.indexOf(\"def.\") === 0) {\n\t\t\t\tcode = code.substring(4);\n\t\t\t}\n\t\t\tif (!(code in def)) {\n\t\t\t\tif (assign === \":\") {\n\t\t\t\t\tif (c.defineParams) value.replace(c.defineParams, function(m, param, v) {\n\t\t\t\t\t\tdef[code] = {arg: param, text: v};\n\t\t\t\t\t});\n\t\t\t\t\tif (!(code in def)) def[code]= value;\n\t\t\t\t} else {\n\t\t\t\t\tnew Function(\"def\", \"def['\"+code+\"']=\" + value)(def);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn \"\";\n\t\t})\n\t\t.replace(c.use || skip, function(m, code) {\n\t\t\tif (c.useParams) code = code.replace(c.useParams, function(m, s, d, param) {\n\t\t\t\tif (def[d] && def[d].arg && param) {\n\t\t\t\t\tvar rw = (d+\":\"+param).replace(/'|\\\\/g, \"_\");\n\t\t\t\t\tdef.__exp = def.__exp || {};\n\t\t\t\t\tdef.__exp[rw] = def[d].text.replace(new RegExp(\"(^|[^\\\\w$])\" + def[d].arg + \"([^\\\\w$])\", \"g\"), \"$1\" + param + \"$2\");\n\t\t\t\t\treturn s + \"def.__exp['\"+rw+\"']\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tvar v = new Function(\"def\", \"return \" + code)(def);\n\t\t\treturn v ? resolveDefs(c, v, def) : v;\n\t\t});\n\t}\n\n\tfunction unescape(code) {\n\t\treturn code.replace(/\\\\('|\\\\)/g, \"$1\").replace(/[\\r\\t\\n]/g, \" \");\n\t}\n\n\tdoT.template = function(tmpl, c, def) {\n\t\tc = c || doT.templateSettings;\n\t\tvar cse = c.append ? startend.append : startend.split, needhtmlencode, sid = 0, indv,\n\t\t\tstr = (c.use || c.define) ? resolveDefs(c, tmpl, def || {}) : tmpl;\n\n\t\tstr = (\"var out='\" + (c.strip ? str.replace(/(^|\\r|\\n)\\t* +| +\\t*(\\r|\\n|$)/g,\" \")\n\t\t\t\t\t.replace(/\\r|\\n|\\t|\\/\\*[\\s\\S]*?\\*\\//g,\"\"): str)\n\t\t\t.replace(/'|\\\\/g, \"\\\\$&\")\n\t\t\t.replace(c.interpolate || skip, function(m, code) {\n\t\t\t\treturn cse.start + unescape(code) + cse.end;\n\t\t\t})\n\t\t\t.replace(c.encode || skip, function(m, code) {\n\t\t\t\tneedhtmlencode = true;\n\t\t\t\treturn cse.startencode + unescape(code) + cse.end;\n\t\t\t})\n\t\t\t.replace(c.conditional || skip, function(m, elsecase, code) {\n\t\t\t\treturn elsecase ?\n\t\t\t\t\t(code ? \"';}else if(\" + unescape(code) + \"){out+='\" : \"';}else{out+='\") :\n\t\t\t\t\t(code ? \"';if(\" + unescape(code) + \"){out+='\" : \"';}out+='\");\n\t\t\t})\n\t\t\t.replace(c.iterate || skip, function(m, iterate, vname, iname) {\n\t\t\t\tif (!iterate) return \"';} } out+='\";\n\t\t\t\tsid+=1; indv=iname || \"i\"+sid; iterate=unescape(iterate);\n\t\t\t\treturn \"';var arr\"+sid+\"=\"+iterate+\";if(arr\"+sid+\"){var \"+vname+\",\"+indv+\"=-1,l\"+sid+\"=arr\"+sid+\".length-1;while(\"+indv+\"<l\"+sid+\"){\"\n\t\t\t\t\t+vname+\"=arr\"+sid+\"[\"+indv+\"+=1];out+='\";\n\t\t\t})\n\t\t\t.replace(c.evaluate || skip, function(m, code) {\n\t\t\t\treturn \"';\" + unescape(code) + \"out+='\";\n\t\t\t})\n\t\t\t+ \"';return out;\")\n\t\t\t.replace(/\\n/g, \"\\\\n\").replace(/\\t/g, '\\\\t').replace(/\\r/g, \"\\\\r\")\n\t\t\t.replace(/(\\s|;|\\}|^|\\{)out\\+='';/g, '$1').replace(/\\+''/g, \"\");\n\t\t\t//.replace(/(\\s|;|\\}|^|\\{)out\\+=''\\+/g,'$1out+=');\n\n\t\tif (needhtmlencode) {\n\t\t\tif (!c.selfcontained && _globals && !_globals._encodeHTML) _globals._encodeHTML = doT.encodeHTMLSource(c.doNotSkipEncoded);\n\t\t\tstr = \"var encodeHTML = typeof _encodeHTML !== 'undefined' ? _encodeHTML : (\"\n\t\t\t\t+ doT.encodeHTMLSource.toString() + \"(\" + (c.doNotSkipEncoded || '') + \"));\"\n\t\t\t\t+ str;\n\t\t}\n\t\ttry {\n\t\t\treturn new Function(c.varname, str);\n\t\t} catch (e) {\n\t\t\t/* istanbul ignore else */\n\t\t\tif (typeof console !== \"undefined\") console.log(\"Could not create a template function: \" + str);\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\tdoT.compile = function(tmpl, def) {\n\t\treturn doT.template(tmpl, null, def);\n\t};\n}());\n","/*!\n * Photo Sphere Viewer 3.3.3\n * Copyright (c) 2014-2015 Jérémy Heleine\n * Copyright (c) 2015-2018 Damien \"Mistic\" Sorel\n * Licensed under MIT (https://opensource.org/licenses/MIT)\n */\n(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(['three', 'd.js', 'uevent', 'dot/doT'], factory);\n }\n else if (typeof module === 'object' && module.exports) {\n module.exports = factory(require('three'), require('d.js'), require('uevent'), require('dot/doT'));\n }\n else {\n root.PhotoSphereViewer = factory(root.THREE, root.D, root.uEvent, root.doT);\n }\n}(this, function(THREE, D, uEvent, doT) {\n\"use strict\";\n\n/**\n * @typedef {Object} PhotoSphereViewer.Point\n * @summary Object defining a point\n * @property {int} x\n * @property {int} y\n */\n\n/**\n * @typedef {Object} PhotoSphereViewer.Size\n * @summary Object defining a size\n * @property {int} width\n * @property {int} height\n */\n\n/**\n * @typedef {Object} PhotoSphereViewer.CssSize\n * @summary Object defining a size in CSS (px, % or auto)\n * @property {string} [width]\n * @property {string} [height]\n */\n\n/**\n * @typedef {Object} PhotoSphereViewer.Position\n * @summary Object defining a spherical position\n * @property {float} longitude\n * @property {float} latitude\n */\n\n/**\n * @typedef {Object} PhotoSphereViewer.ExtendedPosition\n * @summary Object defining a spherical or texture position\n * @description A position that can be expressed either in spherical coordinates (radians or degrees) or in texture coordinates (pixels)\n * @property {float} longitude\n * @property {float} latitude\n * @property {int} x\n * @property {int} y\n */\n\n/**\n * @typedef {Object} PhotoSphereViewer.CacheItem\n * @summary An entry in the memory cache\n * @property {string} panorama\n * @property {THREE.Texture} image\n * @property {PhotoSphereViewer.PanoData} pano_data\n */\n\n/**\n * @typedef {Object} PhotoSphereViewer.PanoData\n * @summary Crop information of the panorama\n * @property {int} full_width\n * @property {int} full_height\n * @property {int} cropped_width\n * @property {int} cropped_height\n * @property {int} cropped_x\n * @property {int} cropped_y\n */\n\n/**\n * @typedef {Object} PhotoSphereViewer.ClickData\n * @summary Data of the `click` event\n * @property {int} client_x - position in the browser window\n * @property {int} client_y - position in the browser window\n * @property {int} viewer_x - position in the viewer\n * @property {int} viewer_y - position in the viewer\n * @property {float} longitude - position in spherical coordinates\n * @property {float} latitude - position in spherical coordinates\n * @property {int} texture_x - position on the texture\n * @property {int} texture_y - position on the texture\n * @property {PSVMarker} [marker] - clicked marker\n */\n\n/**\n * Viewer class\n * @param {Object} options - see {@link http://photo-sphere-viewer.js.org/#options}\n * @constructor\n * @fires PhotoSphereViewer.ready\n * @throws {PSVError} when the configuration is incorrect\n */\nfunction PhotoSphereViewer(options) {\n // return instance if called as a function\n if (!(this instanceof PhotoSphereViewer)) {\n return new PhotoSphereViewer(options);\n }\n\n // init global system variables\n if (!PhotoSphereViewer.SYSTEM.loaded) {\n PhotoSphereViewer._loadSystem();\n }\n\n /**\n * @summary Configuration object\n * @member {Object}\n * @readonly\n */\n this.config = PSVUtils.clone(PhotoSphereViewer.DEFAULTS);\n PSVUtils.deepmerge(this.config, options);\n\n // check container\n if (!options.container) {\n throw new PSVError('No value given for container.');\n }\n\n // must support canvas\n if (!PhotoSphereViewer.SYSTEM.isCanvasSupported) {\n throw new PSVError('Canvas is not supported.');\n }\n\n // additional scripts if webgl not supported/disabled\n if ((!PhotoSphereViewer.SYSTEM.isWebGLSupported || !this.config.webgl) && !PSVUtils.checkTHREE('CanvasRenderer', 'Projector')) {\n throw new PSVError('Missing Three.js components: CanvasRenderer, Projector. Get them from three.js-examples package.');\n }\n\n // longitude range must have two values\n if (this.config.longitude_range && this.config.longitude_range.length !== 2) {\n this.config.longitude_range = null;\n console.warn('PhotoSphereViewer: longitude_range must have exactly two elements.');\n }\n\n if (this.config.latitude_range) {\n // latitude range must have two values\n if (this.config.latitude_range.length !== 2) {\n this.config.latitude_range = null;\n console.warn('PhotoSphereViewer: latitude_range must have exactly two elements.');\n }\n // latitude range must be ordered\n else if (this.config.latitude_range[0] > this.config.latitude_range[1]) {\n this.config.latitude_range = [this.config.latitude_range[1], this.config.latitude_range[0]];\n console.warn('PhotoSphereViewer: latitude_range values must be ordered.');\n }\n }\n // migrate legacy tilt_up_max and tilt_down_max\n else if (this.config.tilt_up_max !== undefined || this.config.tilt_down_max !== undefined) {\n this.config.latitude_range = [\n this.config.tilt_down_max !== undefined ? this.config.tilt_down_max - Math.PI / 4 : -PSVUtils.HalfPI,\n this.config.tilt_up_max !== undefined ? this.config.tilt_up_max + Math.PI / 4 : PSVUtils.HalfPI\n ];\n console.warn('PhotoSphereViewer: tilt_up_max and tilt_down_max are deprecated, use latitude_range instead.');\n }\n\n // min_fov and max_fov must be ordered\n if (this.config.max_fov < this.config.min_fov) {\n var temp_fov = this.config.max_fov;\n this.config.max_fov = this.config.min_fov;\n this.config.min_fov = temp_fov;\n console.warn('PhotoSphereViewer: max_fov cannot be lower than min_fov.');\n }\n\n if (this.config.cache_texture && (!PSVUtils.isInteger(this.config.cache_texture) || this.config.cache_texture < 0)) {\n this.config.cache_texture = PhotoSphereViewer.DEFAULTS.cache_texture;\n console.warn('PhotoSphereViewer: invalid value for cache_texture');\n }\n\n if ('panorama_roll' in this.config) {\n this.config.sphere_correction.roll = this.config.panorama_roll;\n console.warn('PhotoSphereViewer: panorama_roll is deprecated, use sphere_correction.roll instead');\n }\n\n // min_fov/max_fov between 1 and 179\n this.config.min_fov = PSVUtils.bound(this.config.min_fov, 1, 179);\n this.config.max_fov = PSVUtils.bound(this.config.max_fov, 1, 179);\n\n // default default_fov is middle point between min_fov and max_fov\n if (this.config.default_fov === null) {\n this.config.default_fov = this.config.max_fov / 2 + this.config.min_fov / 2;\n }\n // default_fov between min_fov and max_fov\n else {\n this.config.default_fov = PSVUtils.bound(this.config.default_fov, this.config.min_fov, this.config.max_fov);\n }\n\n // parse default_long, is between 0 and 2*PI\n this.config.default_long = PSVUtils.parseAngle(this.config.default_long);\n\n // parse default_lat, is between -PI/2 and PI/2\n this.config.default_lat = PSVUtils.parseAngle(this.config.default_lat, true);\n\n // parse camera_correction, is between -PI/2 and PI/2\n this.config.sphere_correction.pan = PSVUtils.parseAngle(this.config.sphere_correction.pan, true);\n this.config.sphere_correction.tilt = PSVUtils.parseAngle(this.config.sphere_correction.tilt, true);\n this.config.sphere_correction.roll = PSVUtils.parseAngle(this.config.sphere_correction.roll, true);\n\n // default anim_lat is default_lat\n if (this.config.anim_lat === null) {\n this.config.anim_lat = this.config.default_lat;\n }\n // parse anim_lat, is between -PI/2 and PI/2\n else {\n this.config.anim_lat = PSVUtils.parseAngle(this.config.anim_lat, true);\n }\n\n // parse longitude_range, between 0 and 2*PI\n if (this.config.longitude_range) {\n this.config.longitude_range = this.config.longitude_range.map(function(angle) {\n return PSVUtils.parseAngle(angle);\n });\n }\n\n // parse latitude_range, between -PI/2 and PI/2\n if (this.config.latitude_range) {\n this.config.latitude_range = this.config.latitude_range.map(function(angle) {\n return PSVUtils.parseAngle(angle, true);\n });\n }\n\n // parse anim_speed\n this.config.anim_speed = PSVUtils.parseSpeed(this.config.anim_speed);\n\n // reactivate the navbar if the caption is provided\n if (this.config.caption && !this.config.navbar) {\n this.config.navbar = ['caption'];\n }\n\n // translate boolean fisheye to amount\n if (this.config.fisheye === true) {\n this.config.fisheye = 1;\n }\n else if (this.config.fisheye === false) {\n this.config.fisheye = 0;\n }\n\n /**\n * @summary Top most parent\n * @member {HTMLElement}\n * @readonly\n */\n this.parent = (typeof options.container === 'string') ? document.getElementById(options.container) : options.container;\n\n /**\n * @summary Main container\n * @member {HTMLElement}\n * @readonly\n */\n this.container = null;\n\n /**\n * @member {module:components.PSVLoader}\n * @readonly\n */\n this.loader = null;\n\n /**\n * @member {module:components.PSVNavBar}\n * @readonly\n */\n this.navbar = null;\n\n /**\n * @member {module:components.PSVHUD}\n * @readonly\n */\n this.hud = null;\n\n /**\n * @member {module:components.PSVPanel}\n * @readonly\n */\n this.panel = null;\n\n /**\n * @member {module:components.PSVTooltip}\n * @readonly\n */\n this.tooltip = null;\n\n /**\n * @member {HTMLElement}\n * @readonly\n * @private\n */\n this.canvas_container = null;\n\n /**\n * @member {THREE.WebGLRenderer | THREE.CanvasRenderer}\n * @readonly\n * @private\n */\n this.renderer = null;\n\n /**\n * @member {THREE.Scene}\n * @readonly\n * @private\n */\n this.scene = null;\n\n /**\n * @member {THREE.PerspectiveCamera}\n * @readonly\n * @private\n */\n this.camera = null;\n\n /**\n * @member {THREE.Mesh}\n * @readonly\n * @private\n */\n this.mesh = null;\n\n /**\n * @member {THREE.Raycaster}\n * @readonly\n * @private\n */\n this.raycaster = null;\n\n /**\n * @member {THREE.DeviceOrientationControls}\n * @readonly\n * @private\n */\n this.doControls = null;\n\n /**\n * @summary Internal properties\n * @member {Object}\n * @readonly\n * @property {boolean} isCubemap - if the panorama is a cubemap\n * @property {float} longitude - current longitude of the center\n * @property {float} longitude - current latitude of the center\n * @property {THREE.Vector3} direction - direction of the camera\n * @property {float} anim_speed - parsed animation speed (rad/sec)\n * @property {int} zoom_lvl - current zoom level\n * @property {float} vFov - vertical FOV\n * @property {float} hFov - horizontal FOV\n * @property {float} aspect - viewer aspect ratio\n * @property {float} move_speed - move speed (computed with pixel ratio and configuration move_speed)\n * @property {boolean} moving - is the user moving\n * @property {boolean} zooming - is the user zooming\n * @property {int} start_mouse_x - start x position of the click/touch\n * @property {int} start_mouse_y - start y position of the click/touch\n * @property {int} mouse_x - current x position of the cursor\n * @property {int} mouse_y - current y position of the cursor\n * @property {Array[]} mouse_history - list of latest positions of the cursor, [time, x, y]\n * @property {int} gyro_alpha_offset - current alpha offset for gyroscope controls\n * @property {int} pinch_dist - distance between fingers when zooming\n * @property orientation_reqid - animationRequest id of the device orientation\n * @property autorotate_reqid - animationRequest id of the automatic rotation\n * @property {Promise} animation_promise - promise of the current animation (either go to position or image transition)\n * @property {Promise} loading_promise - promise of the setPanorama method\n * @property start_timeout - timeout id of the automatic rotation delay\n * @property {PhotoSphereViewer.ClickData} dblclick_data - temporary storage of click data between two clicks\n * @property dblclick_timeout - timeout id for double click\n * @property {PhotoSphereViewer.CacheItem[]} cache - cached panoramas\n * @property {Size} size - size of the container\n * @property {PhotoSphereViewer.PanoData} pano_data - panorama metadata\n */\n this.prop = {\n isCubemap: undefined,\n longitude: 0,\n latitude: 0,\n direction: null,\n anim_speed: 0,\n zoom_lvl: 0,\n vFov: 0,\n hFov: 0,\n aspect: 0,\n move_speed: 0.1,\n moving: false,\n zooming: false,\n start_mouse_x: 0,\n start_mouse_y: 0,\n mouse_x: 0,\n mouse_y: 0,\n mouse_history: [],\n gyro_alpha_offset: 0,\n pinch_dist: 0,\n orientation_reqid: null,\n autorotate_reqid: null,\n animation_promise: null,\n loading_promise: null,\n start_timeout: null,\n dblclick_data: null,\n dblclick_timeout: null,\n cache: [],\n size: {\n width: 0,\n height: 0\n },\n pano_data: {\n full_width: 0,\n full_height: 0,\n cropped_width: 0,\n cropped_height: 0,\n cropped_x: 0,\n cropped_y: 0\n }\n };\n\n // init templates\n Object.keys(PhotoSphereViewer.TEMPLATES).forEach(function(tpl) {\n if (!this.config.templates[tpl]) {\n this.config.templates[tpl] = PhotoSphereViewer.TEMPLATES[tpl];\n }\n if (typeof this.config.templates[tpl] === 'string') {\n this.config.templates[tpl] = doT.template(this.config.templates[tpl]);\n }\n }, this);\n\n // init\n this.parent.photoSphereViewer = this;\n\n // create actual container\n this.container = document.createElement('div');\n this.container.classList.add('psv-container');\n this.parent.appendChild(this.container);\n\n // apply container size\n if (this.config.size !== null) {\n this._setViewerSize(this.config.size);\n }\n this._onResize();\n\n // apply default zoom level\n var tempZoom = Math.round((this.config.default_fov - this.config.min_fov) / (this.config.max_fov - this.config.min_fov) * 100);\n this.zoom(tempZoom - 2 * (tempZoom - 50), false);\n\n // actual move speed depends on pixel-ratio\n this.prop.move_speed = THREE.Math.degToRad(this.config.move_speed / PhotoSphereViewer.SYSTEM.pixelRatio);\n\n // set default position\n this.rotate({\n longitude: this.config.default_long,\n latitude: this.config.default_lat\n }, false);\n\n // load loader (!!)\n this.loader = new PSVLoader(this);\n this.loader.hide();\n\n // load navbar\n this.navbar = new PSVNavBar(this);\n this.navbar.hide();\n\n // load hud\n this.hud = new PSVHUD(this);\n this.hud.hide();\n\n // load side panel\n this.panel = new PSVPanel(this);\n\n // load hud tooltip\n this.tooltip = new PSVTooltip(this.hud);\n\n // attach event handlers\n this._bindEvents();\n\n // load panorama\n if (this.config.panorama) {\n this.load();\n }\n\n // enable GUI after first render\n this.once('render', function() {\n if (this.config.navbar) {\n this.container.classList.add('psv-container--has-navbar');\n this.navbar.show();\n }\n\n this.hud.show();\n\n if (this.config.markers) {\n this.config.markers.forEach(function(marker) {\n this.hud.addMarker(marker, false);\n }, this);\n\n this.hud.renderMarkers();\n }\n\n // Queue animation\n if (this.config.time_anim !== false) {\n this.prop.start_timeout = window.setTimeout(this.startAutorotate.bind(this), this.config.time_anim);\n }\n\n /**\n * @event ready\n * @memberof PhotoSphereViewer\n * @summary Triggered when the panorama image has been loaded and the viewer is ready to perform the first render\n */\n setTimeout(this.trigger.bind(this, 'ready'), 0);\n }.bind(this));\n}\n\n/**\n * @summary Triggers an event on the viewer\n * @function trigger\n * @memberof PhotoSphereViewer\n * @instance\n * @param {string} name\n * @param {...*} [arguments]\n * @returns {uEvent.Event}\n */\n\n/**\n * @summary Triggers an event on the viewer and returns the modified value\n * @function change\n * @memberof PhotoSphereViewer\n * @instance\n * @param {string} name\n * @param {*} value\n * @param {...*} [arguments]\n * @returns {*}\n */\n\n/**\n * @summary Attaches an event listener on the viewer\n * @function on\n * @memberof PhotoSphereViewer\n * @instance\n * @param {string|Object.<string, function>} name - event name or events map\n * @param {function} [callback]\n * @returns {PhotoSphereViewer}\n */\n\n/**\n * @summary Removes an event listener from the viewer\n * @function off\n * @memberof PhotoSphereViewer\n * @instance\n * @param {string|Object.<string, function>} name - event name or events map\n * @param {function} [callback]\n * @returns {PhotoSphereViewer}\n */\n\n/**\n * @summary Attaches an event listener called once on the viewer\n * @function once\n * @memberof PhotoSphereViewer\n * @instance\n * @param {string|Object.<string, function>} name - event name or events map\n * @param {function} [callback]\n * @returns {PhotoSphereViewer}\n */\n\nuEvent.mixin(PhotoSphereViewer);\n\n\n/**\n * @summary Loads the XMP data with AJAX\n * @param {string} panorama\n * @returns {Promise.<PhotoSphereViewer.PanoData>}\n * @throws {PSVError} when the image cannot be loaded\n * @private\n */\nPhotoSphereViewer.prototype._loadXMP = function(panorama) {\n if (!this.config.usexmpdata) {\n return D.resolved(null);\n }\n\n var defer = D();\n var xhr = new XMLHttpRequest();\n var progress = 0;\n\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n if (xhr.status === 200 || xhr.status === 201 || xhr.status === 202 || xhr.status === 0) {\n this.loader.setProgress(100);\n\n var binary = xhr.responseText;\n var a = binary.indexOf('<x:xmpmeta'), b = binary.indexOf('</x:xmpmeta>');\n var data = binary.substring(a, b);\n\n // No data retrieved\n if (a === -1 || b === -1 || data.indexOf('GPano:') === -1) {\n defer.resolve(null);\n }\n else {\n var pano_data = {\n full_width: parseInt(PSVUtils.getXMPValue(data, 'FullPanoWidthPixels')),\n full_height: parseInt(PSVUtils.getXMPValue(data, 'FullPanoHeightPixels')),\n cropped_width: parseInt(PSVUtils.getXMPValue(data, 'CroppedAreaImageWidthPixels')),\n cropped_height: parseInt(PSVUtils.getXMPValue(data, 'CroppedAreaImageHeightPixels')),\n cropped_x: parseInt(PSVUtils.getXMPValue(data, 'CroppedAreaLeftPixels')),\n cropped_y: parseInt(PSVUtils.getXMPValue(data, 'CroppedAreaTopPixels'))\n };\n\n if (!pano_data.full_width || !pano_data.full_height || !pano_data.cropped_width || !pano_data.cropped_height) {\n console.warn('PhotoSphereViewer: invalid XMP data');\n defer.resolve(null);\n }\n else {\n defer.resolve(pano_data);\n }\n }\n }\n else {\n this.container.textContent = 'Cannot load image';\n throw new PSVError('Cannot load image');\n }\n }\n else if (xhr.readyState === 3) {\n this.loader.setProgress(progress += 10);\n }\n }.bind(this);\n\n xhr.onprogress = function(e) {\n if (e.lengthComputable) {\n var new_progress = parseInt(e.loaded / e.total * 100);\n if (new_progress > progress) {\n progress = new_progress;\n this.loader.setProgress(progress);\n }\n }\n }.bind(this);\n\n xhr.onerror = function() {\n this.container.textContent = 'Cannot load image';\n throw new PSVError('Cannot load image');\n }.bind(this);\n\n xhr.open('GET', panorama, true);\n xhr.send(null);\n\n return defer.promise;\n};\n\n/**\n * @summary Loads the panorama texture(s)\n * @param {string|string[]} panorama\n * @returns {Promise.<THREE.Texture|THREE.Texture[]>}\n * @fires PhotoSphereViewer.panorama-load-progress\n * @throws {PSVError} when the image cannot be loaded\n * @private\n */\nPhotoSphereViewer.prototype._loadTexture = function(panorama) {\n var tempPanorama = [];\n\n if (Array.isArray(panorama)) {\n if (panorama.length !== 6) {\n throw new PSVError('Must provide exactly 6 image paths when using cubemap.');\n }\n\n // reorder images\n for (var i = 0; i < 6; i++) {\n tempPanorama[i] = panorama[PhotoSphereViewer.CUBE_MAP[i]];\n }\n panorama = tempPanorama;\n }\n else if (typeof panorama === 'object') {\n if (!PhotoSphereViewer.CUBE_HASHMAP.every(function(side) {\n return !!panorama[side];\n })) {\n throw new PSVError('Must provide exactly left, front, right, back, top, bottom when using cubemap.');\n }\n\n // transform into array\n PhotoSphereViewer.CUBE_HASHMAP.forEach(function(side, i) {\n tempPanorama[i] = panorama[side];\n });\n panorama = tempPanorama;\n }\n\n if (Array.isArray(panorama)) {\n\n\n if (this.prop.isCubemap === false) {\n throw new PSVError('The viewer was initialized with an equirectangular panorama, cannot switch to cubemap.');\n }\n\n if (this.config.fisheye) {\n console.warn('PhotoSphereViewer: fisheye effect with cubemap texture can generate distorsions.');\n }\n\n if (this.config.cache_texture === PhotoSphereViewer.DEFAULTS.cache_texture) {\n this.config.cache_texture *= 6;\n }\n\n this.prop.isCubemap = true;\n\n return this._loadCubemapTexture(panorama);\n }\n else {\n if (this.prop.isCubemap === true) {\n throw new PSVError('The viewer was initialized with an cubemap, cannot switch to equirectangular panorama.');\n }\n\n this.prop.isCubemap = false;\n\n return this._loadEquirectangularTexture(panorama);\n }\n};\n\n/**\n * @summary Loads the sphere texture\n * @param {string} panorama\n * @returns {Promise.<THREE.Texture>}\n * @fires PhotoSphereViewer.panorama-load-progress\n * @throws {PSVError} when the image cannot be loaded\n * @private\n */\nPhotoSphereViewer.prototype._loadEquirectangularTexture = function(panorama) {\n if (this.config.cache_texture) {\n var cache = this.getPanoramaCache(panorama);\n\n if (cache) {\n this.prop.pano_data = cache.pano_data;\n\n return D.resolved(cache.image);\n }\n }\n\n return this._loadXMP(panorama).then(function(pano_data) {\n var defer = D();\n var loader = new THREE.ImageLoader();\n var progress = pano_data ? 100 : 0;\n\n loader.setCrossOrigin('anonymous');\n\n var onload = function(img) {\n progress = 100;\n\n this.loader.setProgress(progress);\n\n /**\n * @event panorama-load-progress\n * @memberof PhotoSphereViewer\n * @summary Triggered while a panorama image is loading\n * @param {string} panorama\n * @param {int} progress\n */\n this.trigger('panorama-load-progress', panorama, progress);\n\n // Config XMP data\n if (!pano_data && this.config.pano_data) {\n pano_data = PSVUtils.clone(this.config.pano_data);\n }\n\n // Default XMP data\n if (!pano_data) {\n pano_data = {\n full_width: img.width,\n full_height: img.height,\n cropped_width: img.width,\n cropped_height: img.height,\n cropped_x: 0,\n cropped_y: 0\n };\n }\n\n this.prop.pano_data = pano_data;\n\n var texture;\n\n var ratio = Math.min(pano_data.full_width, PhotoSphereViewer.SYSTEM.maxTextureWidth) / pano_data.full_width;\n\n // resize image / fill cropped parts with black\n if (ratio !== 1 || pano_data.cropped_width !== pano_data.full_width || pano_data.cropped_height !== pano_data.full_height) {\n var resized_pano_data = PSVUtils.clone(pano_data);\n\n resized_pano_data.full_width *= ratio;\n resized_pano_data.full_height *= ratio;\n resized_pano_data.cropped_width *= ratio;\n resized_pano_data.cropped_height *= ratio;\n resized_pano_data.cropped_x *= ratio;\n resized_pano_data.cropped_y *= ratio;\n\n img.width = resized_pano_data.cropped_width;\n img.height = resized_pano_data.cropped_height;\n\n var buffer = document.createElement('canvas');\n buffer.width = resized_pano_data.full_width;\n buffer.height = resized_pano_data.full_height;\n\n var ctx = buffer.getContext('2d');\n ctx.drawImage(img, resized_pano_data.cropped_x, resized_pano_data.cropped_y, resized_pano_data.cropped_width, resized_pano_data.cropped_height);\n\n texture = new THREE.Texture(buffer);\n }\n else {\n texture = new THREE.Texture(img);\n }\n\n texture.needsUpdate = true;\n texture.minFilter = THREE.LinearFilter;\n texture.generateMipmaps = false;\n\n if (this.config.cache_texture) {\n this._putPanoramaCache({\n panorama: panorama,\n image: texture,\n pano_data: pano_data\n });\n }\n\n defer.resolve(texture);\n };\n\n var onprogress = function(e) {\n if (e.lengthComputable) {\n var new_progress = parseInt(e.loaded / e.total * 100);\n\n if (new_progress > progress) {\n progress = new_progress;\n this.loader.setProgress(progress);\n this.trigger('panorama-load-progress', panorama, progress);\n }\n }\n };\n\n var onerror = function(e) {\n this.container.textContent = 'Cannot load image';\n defer.reject(e);\n throw new PSVError('Cannot load image');\n };\n\n loader.load(panorama, onload.bind(this), onprogress.bind(this), onerror.bind(this));\n\n return defer.promise;\n }.bind(this));\n};\n\n/**\n * @summary Load the six textures of the cube\n * @param {string[]} panorama\n * @returns {Promise.<THREE.Texture[]>}\n * @fires PhotoSphereViewer.panorama-load-progress\n * @throws {PSVError} when the image cannot be loaded\n * @private\n */\nPhotoSphereViewer.prototype._loadCubemapTexture = function(panorama) {\n var defer = D();\n var loader = new THREE.ImageLoader();\n var progress = [0, 0, 0, 0, 0, 0];\n var loaded = [];\n var done = 0;\n\n loader.setCrossOrigin('anonymous');\n\n var onend = function() {\n loaded.forEach(function(img) {\n img.needsUpdate = true;\n img.minFilter = THREE.LinearFilter;\n img.generateMipmaps = false;\n });\n\n defer.resolve(loaded);\n };\n\n var onload = function(i, img) {\n done++;\n progress[i] = 100;\n\n this.loader.setProgress(PSVUtils.sum(progress) / 6);\n this.trigger('panorama-load-progress', panorama[i], progress[i]);\n\n var ratio = Math.min(img.width, PhotoSphereViewer.SYSTEM.maxTextureWidth / 2) / img.width;\n\n // resize image\n if (ratio !== 1) {\n var buffer = document.createElement('canvas');\n buffer.width = img.width * ratio;\n buffer.height = img.height * ratio;\n\n var ctx = buffer.getContext('2d');\n ctx.drawImage(img, 0, 0, buffer.width, buffer.height);\n\n loaded[i] = new THREE.Texture(buffer);\n }\n else {\n loaded[i] = new THREE.Texture(img);\n }\n\n if (this.config.cache_texture) {\n this._putPanoramaCache({\n panorama: panorama[i],\n image: loaded[i]\n });\n }\n\n if (done === 6) {\n onend();\n }\n };\n\n var onprogress = function(i, e) {\n if (e.lengthComputable) {\n var new_progress = parseInt(e.loaded / e.total * 100);\n\n if (new_progress > progress[i]) {\n progress[i] = new_progress;\n this.loader.setProgress(PSVUtils.sum(progress) / 6);\n this.trigger('panorama-load-progress', panorama[i], progress[i]);\n }\n }\n };\n\n var onerror = function(i, e) {\n this.container.textContent = 'Cannot load image';\n defer.reject(e);\n throw new PSVError('Cannot load image ' + i);\n };\n\n for (var i = 0; i < 6; i++) {\n if (this.config.cache_texture) {\n var cache = this.getPanoramaCache(panorama[i]);\n\n if (cache) {\n done++;\n progress[i] = 100;\n loaded[i] = cache.image;\n continue;\n }\n }\n\n loader.load(panorama[i], onload.bind(this, i), onprogress.bind(this, i), onerror.bind(this, i));\n }\n\n if (done === 6) {\n defer.resolve(loaded);\n }\n\n return defer.promise;\n};\n\n/**\n * @summary Applies the texture to the scene, creates the scene if needed\n * @param {THREE.Texture|THREE.Texture[]} texture\n * @fires PhotoSphereViewer.panorama-loaded\n * @private\n */\nPhotoSphereViewer.prototype._setTexture = function(texture) {\n if (!this.scene) {\n this._createScene();\n }\n\n if (this.prop.isCubemap) {\n for (var i = 0; i < 6; i++) {\n if (this.mesh.material[i].map) {\n this.mesh.material[i].map.dispose();\n }\n\n this.mesh.material[i].map = texture[i];\n }\n }\n else {\n if (this.mesh.material.map) {\n this.mesh.material.map.dispose();\n }\n\n this.mesh.material.map = texture;\n }\n\n /**\n * @event panorama-loaded\n * @memberof PhotoSphereViewer\n * @summary Triggered when a panorama image has been loaded\n */\n this.trigger('panorama-loaded');\n\n this.render();\n};\n\n/**\n * @summary Creates the 3D scene and GUI components\n * @private\n */\nPhotoSphereViewer.prototype._createScene = function() {\n this.raycaster = new THREE.Raycaster();\n\n this.renderer = PhotoSphereViewer.SYSTEM.isWebGLSupported && this.config.webgl ? new THREE.WebGLRenderer() : new THREE.CanvasRenderer();\n this.renderer.setSize(this.prop.size.width, this.prop.size.height);\n this.renderer.setPixelRatio(PhotoSphereViewer.SYSTEM.pixelRatio);\n\n var cameraDistance = PhotoSphereViewer.SPHERE_RADIUS;\n if (this.prop.isCubemap) {\n cameraDistance *= Math.sqrt(3);\n }\n if (this.config.fisheye) {\n cameraDistance += PhotoSphereViewer.SPHERE_RADIUS;\n }\n\n this.camera = new THREE.PerspectiveCamera(this.config.default_fov, this.prop.size.width / this.prop.size.height, 1, cameraDistance);\n this.camera.position.set(0, 0, 0);\n\n if (this.config.gyroscope && PSVUtils.checkTHREE('DeviceOrientationControls')) {\n this.doControls = new THREE.DeviceOrientationControls(this.camera);\n }\n\n this.scene = new THREE.Scene();\n this.scene.add(this.camera);\n\n if (this.prop.isCubemap) {\n this._createCubemap();\n }\n else {\n this._createSphere();\n }\n\n // create canvas container\n this.canvas_container = document.createElement('div');\n this.canvas_container.className = 'psv-canvas-container';\n this.renderer.domElement.className = 'psv-canvas';\n this.container.appendChild(this.canvas_container);\n this.canvas_container.appendChild(this.renderer.domElement);\n};\n\n/**\n * @summary Creates the sphere mesh\n * @private\n */\nPhotoSphereViewer.prototype._createSphere = function() {\n // The middle of the panorama is placed at longitude=0\n var geometry = new THREE.SphereGeometry(\n PhotoSphereViewer.SPHERE_RADIUS,\n PhotoSphereViewer.SPHERE_VERTICES,\n PhotoSphereViewer.SPHERE_VERTICES,\n -PSVUtils.HalfPI\n );\n\n var material = new THREE.MeshBasicMaterial({\n side: THREE.DoubleSide, // needs to be DoubleSide for CanvasRenderer\n overdraw: PhotoSphereViewer.SYSTEM.isWebGLSupported && this.config.webgl ? 0 : 1\n });\n\n this.mesh = new THREE.Mesh(geometry, material);\n this.mesh.scale.x = -1;\n this.mesh.rotation.x = this.config.sphere_correction.tilt;\n this.mesh.rotation.y = this.config.sphere_correction.pan;\n this.mesh.rotation.z = this.config.sphere_correction.roll;\n\n this.scene.add(this.mesh);\n};\n\n/**\n * @summary Creates the cube mesh\n * @private\n */\nPhotoSphereViewer.prototype._createCubemap = function() {\n var geometry = new THREE.BoxGeometry(\n PhotoSphereViewer.SPHERE_RADIUS * 2, PhotoSphereViewer.SPHERE_RADIUS * 2, PhotoSphereViewer.SPHERE_RADIUS * 2,\n PhotoSphereViewer.CUBE_VERTICES, PhotoSphereViewer.CUBE_VERTICES, PhotoSphereViewer.CUBE_VERTICES\n );\n\n var materials = [];\n for (var i = 0; i < 6; i++) {\n materials.push(new THREE.MeshBasicMaterial({\n side: THREE.BackSide,\n overdraw: PhotoSphereViewer.SYSTEM.isWebGLSupported && this.config.webgl ? 0 : 1\n }));\n }\n\n this.mesh = new THREE.Mesh(geometry, materials);\n this.mesh.position.x -= PhotoSphereViewer.SPHERE_RADIUS;\n this.mesh.position.y -= PhotoSphereViewer.SPHERE_RADIUS;\n this.mesh.position.z -= PhotoSphereViewer.SPHERE_RADIUS;\n this.mesh.applyMatrix(new THREE.Matrix4().makeScale(1, 1, -1));\n\n this.scene.add(this.mesh);\n};\n\n/**\n * @summary Performs transition between the current and a new texture\n * @param {THREE.Texture} texture\n * @param {PhotoSphereViewer.Position} [position]\n * @returns {Promise}\n * @private\n * @throws {PSVError} if the panorama is a cubemap\n */\nPhotoSphereViewer.prototype._transition = function(texture, position) {\n if (this.prop.isCubemap) {\n throw new PSVError('Transition is not available with cubemap.');\n }\n\n // create a new sphere with the new texture\n var geometry = new THREE.SphereGeometry(\n PhotoSphereViewer.SPHERE_RADIUS * 0.9,\n PhotoSphereViewer.SPHERE_VERTICES,\n PhotoSphereViewer.SPHERE_VERTICES,\n -PSVUtils.HalfPI\n );\n\n var material = new THREE.MeshBasicMaterial({\n side: THREE.DoubleSide,\n overdraw: PhotoSphereViewer.SYSTEM.isWebGLSupported && this.config.webgl ? 0 : 1,\n map: texture,\n transparent: true,\n opacity: 0\n });\n\n var mesh = new THREE.Mesh(geometry, material);\n mesh.scale.x = -1;\n\n // rotate the new sphere to make the target position face the camera\n if (position) {\n // Longitude rotation along the vertical axis\n mesh.rotateY(position.longitude - this.prop.longitude);\n\n // Latitude rotation along the camera horizontal axis\n var axis = new THREE.Vector3(0, 1, 0).cross(this.camera.getWorldDirection()).normalize();\n var q = new THREE.Quaternion().setFromAxisAngle(axis, position.latitude - this.prop.latitude);\n mesh.quaternion.multiplyQuaternions(q, mesh.quaternion);\n }\n\n this.scene.add(mesh);\n this.render();\n\n return PSVUtils.animation({\n properties: {\n opacity: { start: 0.0, end: 1.0 }\n },\n duration: this.config.transition.duration,\n easing: 'outCubic',\n onTick: function(properties) {\n material.opacity = properties.opacity;\n\n this.render();\n }.bind(this)\n })\n .then(function() {\n // remove temp sphere and transfer the texture to the main sphere\n this.mesh.material.map.dispose();\n this.mesh.material.map = texture;\n\n this.scene.remove(mesh);\n\n mesh.geometry.dispose();\n mesh.geometry = null;\n mesh.material.dispose();\n mesh.material = null;\n\n // actually rotate the camera\n if (position) {\n // FIXME: find a better way to handle ranges\n if (this.config.latitude_range || this.config.longitude_range) {\n this.config.longitude_range = this.config.latitude_range = null;\n console.warn('PhotoSphereViewer: trying to perform transition with longitude_range and/or latitude_range, ranges cleared.');\n }\n\n this.rotate(position);\n }\n else {\n this.render();\n }\n }.bind(this));\n};\n\n/**\n * @summary Reverses autorotate direction with smooth transition\n * @private\n */\nPhotoSphereViewer.prototype._reverseAutorotate = function() {\n var self = this;\n var newSpeed = -this.config.anim_speed;\n var range = this.config.longitude_range;\n this.config.longitude_range = null;\n\n PSVUtils.animation({\n properties: {\n speed: { start: this.config.anim_speed, end: 0 }\n },\n duration: 300,\n easing: 'inSine',\n onTick: function(properties) {\n self.config.anim_speed = properties.speed;\n }\n })\n .then(function() {\n return PSVUtils.animation({\n properties: {\n speed: { start: 0, end: newSpeed }\n },\n duration: 300,\n easing: 'outSine',\n onTick: function(properties) {\n self.config.anim_speed = properties.speed;\n }\n });\n })\n .then(function() {\n self.config.longitude_range = range;\n self.config.anim_speed = newSpeed;\n });\n};\n\n/**\n * @summary Adds a panorama to the cache\n * @param {PhotoSphereViewer.CacheItem} cache\n * @fires PhotoSphereViewer.panorama-cached\n * @throws {PSVError} when the cache is disabled\n * @private\n */\nPhotoSphereViewer.prototype._putPanoramaCache = function(cache) {\n if (!this.config.cache_texture) {\n throw new PSVError('Cannot add panorama to cache, cache_texture is disabled');\n }\n\n var existingCache = this.getPanoramaCache(cache.panorama);\n\n if (existingCache) {\n existingCache.image = cache.image;\n existingCache.pano_data = cache.pano_data;\n }\n else {\n this.prop.cache = this.prop.cache.slice(0, this.config.cache_texture - 1); // remove most ancient elements\n this.prop.cache.unshift(cache);\n }\n\n /**\n * @event panorama-cached\n * @memberof PhotoSphereViewer\n * @summary Triggered when a panorama is stored in the cache\n * @param {string} panorama\n */\n this.trigger('panorama-cached', cache.panorama);\n};\n\n/**\n * @summary Stops all current animations\n * @private\n */\nPhotoSphereViewer.prototype._stopAll = function() {\n this.stopAutorotate();\n this.stopAnimation();\n this.stopGyroscopeControl();\n};\n\n\n/**\n * @summary Number of pixels bellow which a mouse move will be considered as a click\n * @type {int}\n * @readonly\n * @private\n */\nPhotoSphereViewer.MOVE_THRESHOLD = 4;\n\n/**\n * @summary Angle in radians bellow which two angles are considered identical\n * @type {float}\n * @readonly\n * @private\n */\nPhotoSphereViewer.ANGLE_THRESHOLD = 0.003;\n\n/**\n * @summary Delay in milliseconds between two clicks to consider a double click\n * @type {int}\n * @readonly\n * @private\n */\nPhotoSphereViewer.DBLCLICK_DELAY = 300;\n\n/**\n * @summary Time size of the mouse position history used to compute inertia\n * @type {int}\n * @readonly\n * @private\n */\nPhotoSphereViewer.INERTIA_WINDOW = 300;\n\n/**\n * @summary Radius of the THREE.SphereGeometry\n * Half-length of the THREE.BoxGeometry\n * @type {int}\n * @readonly\n * @private\n */\nPhotoSphereViewer.SPHERE_RADIUS = 100;\n\n/**\n * @summary Number of vertice of the THREE.SphereGeometry\n * @type {int}\n * @readonly\n * @private\n */\nPhotoSphereViewer.SPHERE_VERTICES = 64;\n\n/**\n * @summary Number of vertices of each side of the THREE.BoxGeometry\n * @type {int}\n * @readonly\n * @private\n */\nPhotoSphereViewer.CUBE_VERTICES = 8;\n\n/**\n * @summary Order of cube textures for arrays\n * @type {int[]}\n * @readonly\n * @private\n */\nPhotoSphereViewer.CUBE_MAP = [0, 2, 4, 5, 3, 1];\n\n/**\n * @summary Order of cube textures for maps\n * @type {string[]}\n * @readonly\n * @private\n */\nPhotoSphereViewer.CUBE_HASHMAP = ['left', 'right', 'top', 'bottom', 'back', 'front'];\n\n/**\n * @summary Map between keyboard events `keyCode|which` and `key`\n * @type {Object.<int, string>}\n * @readonly\n * @private\n */\nPhotoSphereViewer.KEYMAP = {\n 33: 'PageUp',\n 34: 'PageDown',\n 37: 'ArrowLeft',\n 38: 'ArrowUp',\n 39: 'ArrowRight',\n 40: 'ArrowDown',\n 107: '+',\n 109: '-'\n};\n\n/**\n * @summary System properties\n * @type {Object}\n * @readonly\n * @private\n */\nPhotoSphereViewer.SYSTEM = {\n loaded: false,\n pixelRatio: 1,\n isWebGLSupported: false,\n isCanvasSupported: false,\n deviceOrientationSupported: null,\n maxTextureWidth: 0,\n mouseWheelEvent: null,\n fullscreenEvent: null\n};\n\n/**\n * @summary SVG icons sources\n * @type {Object.<string, string>}\n * @readonly\n */\nPhotoSphereViewer.ICONS = {};\n\n/**\n * @summary Default options, see {@link http://photo-sphere-viewer.js.org/#options}\n * @type {Object}\n * @readonly\n */\nPhotoSphereViewer.DEFAULTS = {\n panorama: null,\n container: null,\n caption: null,\n usexmpdata: true,\n pano_data: null,\n webgl: true,\n min_fov: 30,\n max_fov: 90,\n default_fov: null,\n default_long: 0,\n default_lat: 0,\n sphere_correction: {\n pan: 0,\n tilt: 0,\n roll: 0\n },\n longitude_range: null,\n latitude_range: null,\n move_speed: 1,\n time_anim: 2000,\n anim_speed: '2rpm',\n anim_lat: null,\n fisheye: false,\n navbar: [\n 'autorotate',\n 'zoom',\n 'download',\n 'markers',\n 'caption',\n 'gyroscope',\n 'fullscreen'\n ],\n tooltip: {\n offset: 5,\n arrow_size: 7,\n delay: 100\n },\n lang: {\n autorotate: 'Automatic rotation',\n zoom: 'Zoom',\n zoomOut: 'Zoom out',\n zoomIn: 'Zoom in',\n download: 'Download',\n fullscreen: 'Fullscreen',\n markers: 'Markers',\n gyroscope: 'Gyroscope'\n },\n mousewheel: true,\n mousewheel_factor: 1,\n mousemove: true,\n mousemove_hover: false,\n keyboard: true,\n gyroscope: false,\n move_inertia: true,\n click_event_on_marker: false,\n transition: {\n duration: 1500,\n loader: true\n },\n loading_img: null,\n loading_txt: 'Loading...',\n size: null,\n cache_texture: 0,\n templates: {},\n markers: []\n};\n\n/**\n * @summary doT.js templates\n * @type {Object.<string, string>}\n * @readonly\n */\nPhotoSphereViewer.TEMPLATES = {\n markersList: '\\\n<div class=\"psv-markers-list-container\"> \\\n <h1 class=\"psv-markers-list-title\">{{= it.config.lang.markers }}</h1> \\\n <ul class=\"psv-markers-list\"> \\\n {{~ it.markers: marker }} \\\n <li data-psv-marker=\"{{= marker.id }}\" class=\"psv-markers-list-item {{? marker.className }}{{= marker.className }}{{?}}\"> \\\n {{? marker.image }}<img class=\"psv-markers-list-image\" src=\"{{= marker.image }}\"/>{{?}} \\\n <p class=\"psv-markers-list-name\">{{? marker.tooltip }}{{= marker.tooltip.content }}{{?? marker.html }}{{= marker.html }}{{??}}{{= marker.id }}{{?}}</p> \\\n </li> \\\n {{~}} \\\n </ul> \\\n</div>'\n};\n\n\n/**\n * @summary Adds all needed event listeners\n * @private\n */\nPhotoSphereViewer.prototype._bindEvents = function() {\n window.addEventListener('resize', this);\n\n // all interation events are binded to the HUD only\n if (this.config.mousemove) {\n this.hud.container.style.cursor = 'move';\n\n if (this.config.mousemove_hover) {\n this.hud.container.addEventListener('mouseenter', this);\n this.hud.container.addEventListener('mouseleave', this);\n }\n else {\n this.hud.container.addEventListener('mousedown', this);\n window.addEventListener('mouseup', this);\n }\n\n this.hud.container.addEventListener('touchstart', this);\n window.addEventListener('touchend', this);\n\n this.hud.container.addEventListener('mousemove', this);\n this.hud.container.addEventListener('touchmove', this);\n }\n\n if (PhotoSphereViewer.SYSTEM.fullscreenEvent) {\n document.addEventListener(PhotoSphereViewer.SYSTEM.fullscreenEvent, this);\n }\n\n if (this.config.mousewheel) {\n this.hud.container.addEventListener(PhotoSphereViewer.SYSTEM.mouseWheelEvent, this);\n }\n\n this.on('_side-reached', function(side) {\n if (this.isAutorotateEnabled()) {\n if (side === 'left' || side === 'right') {\n this._reverseAutorotate();\n }\n }\n });\n};\n\n/**\n * @summary Removes all event listeners\n * @private\n */\nPhotoSphereViewer.prototype._unbindEvents = function() {\n window.removeEventListener('resize', this);\n\n if (this.config.mousemove) {\n this.hud.container.removeEventListener('mousedown', this);\n this.hud.container.removeEventListener('mouseenter', this);\n this.hud.container.removeEventListener('touchstart', this);\n window.removeEventListener('mouseup', this);\n window.removeEventListener('touchend', this);\n this.hud.container.removeEventListener('mouseleave', this);\n this.hud.container.removeEventListener('mousemove', this);\n this.hud.container.removeEventListener('touchmove', this);\n }\n\n if (PhotoSphereViewer.SYSTEM.fullscreenEvent) {\n document.removeEventListener(PhotoSphereViewer.SYSTEM.fullscreenEvent, this);\n }\n\n if (this.config.mousewheel) {\n this.hud.container.removeEventListener(PhotoSphereViewer.SYSTEM.mouseWheelEvent, this);\n }\n\n this.off('_side-reached');\n};\n\n/**\n * @summary Handles events\n * @param {Event} evt\n * @private\n */\nPhotoSphereViewer.prototype.handleEvent = function(evt) {\n switch (evt.type) {\n // @formatter:off\n case 'resize': PSVUtils.throttle(this._onResize(), 50); break;\n case 'keydown': this._onKeyDown(evt); break;\n case 'mousedown': this._onMouseDown(evt); break;\n case 'mouseenter': this._onMouseDown(evt); break;\n case 'touchstart': this._onTouchStart(evt); break;\n case 'mouseup': this._onMouseUp(evt); break;\n case 'mouseleave': this._onMouseUp(evt); break;\n case 'touchend': this._onTouchEnd(evt); break;\n case 'mousemove': this._onMouseMove(evt); break;\n case 'touchmove': this._onTouchMove(evt); break;\n case PhotoSphereViewer.SYSTEM.fullscreenEvent: this._fullscreenToggled(); break;\n case PhotoSphereViewer.SYSTEM.mouseWheelEvent: this._onMouseWheel(evt); break;\n // @formatter:on\n }\n};\n\n/**\n * @summary Resizes the canvas when the window is resized\n * @fires PhotoSphereViewer.size-updated\n * @private\n */\nPhotoSphereViewer.prototype._onResize = function() {\n if (this.container.clientWidth !== this.prop.size.width || this.container.clientHeight !== this.prop.size.height) {\n this.prop.size.width = parseInt(this.container.clientWidth);\n this.prop.size.height = parseInt(this.container.clientHeight);\n this.prop.aspect = this.prop.size.width / this.prop.size.height;\n\n if (this.renderer) {\n this.renderer.setSize(this.prop.size.width, this.prop.size.height);\n this.render();\n }\n\n /**\n * @event size-updated\n * @memberof PhotoSphereViewer\n * @summary Triggered when the viewer size changes\n * @param {PhotoSphereViewer.Size} size\n */\n this.trigger('size-updated', this.getSize());\n }\n};\n\n/**\n * @summary Handles keyboard events\n * @param {KeyboardEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._onKeyDown = function(evt) {\n var dLong = 0;\n var dLat = 0;\n var dZoom = 0;\n\n var key = evt.key || PhotoSphereViewer.KEYMAP[evt.keyCode || evt.which];\n\n switch (key) {\n // @formatter:off\n case 'ArrowUp': dLat = 0.01; break;\n case 'ArrowDown': dLat = -0.01; break;\n case 'ArrowRight': dLong = 0.01; break;\n case 'ArrowLeft': dLong = -0.01; break;\n case 'PageUp':case '+': dZoom = 1; break;\n case 'PageDown':case '-': dZoom = -1; break;\n // @formatter:on\n }\n\n if (dZoom !== 0) {\n this.zoom(this.prop.zoom_lvl + dZoom);\n }\n else if (dLat !== 0 || dLong !== 0) {\n this.rotate({\n longitude: this.prop.longitude + dLong * this.prop.move_speed * this.prop.hFov,\n latitude: this.prop.latitude + dLat * this.prop.move_speed * this.prop.vFov\n });\n }\n};\n\n/**\n * @summary Handles mouse button events\n * @param {MouseEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._onMouseDown = function(evt) {\n this._startMove(evt);\n};\n\n/**\n * @summary Handles mouse buttons events\n * @param {MouseEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._onMouseUp = function(evt) {\n this._stopMove(evt);\n};\n\n/**\n * @summary Handles mouse move events\n * @param {MouseEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._onMouseMove = function(evt) {\n if (evt.buttons !== 0) {\n evt.preventDefault();\n this._move(evt);\n }\n else if (this.config.mousemove_hover) {\n this._moveAbsolute(evt);\n }\n};\n\n/**\n * @summary Handles touch events\n * @param {TouchEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._onTouchStart = function(evt) {\n if (evt.touches.length === 1) {\n this._startMove(evt.touches[0]);\n }\n else if (evt.touches.length === 2) {\n this._startZoom(evt);\n }\n};\n\n/**\n * @summary Handles touch events\n * @param {TouchEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._onTouchEnd = function(evt) {\n this._stopMove(evt.changedTouches[0]);\n};\n\n/**\n * @summary Handles touch move events\n * @param {TouchEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._onTouchMove = function(evt) {\n if (evt.touches.length === 1) {\n evt.preventDefault();\n this._move(evt.touches[0]);\n }\n else if (evt.touches.length === 2) {\n evt.preventDefault();\n this._zoom(evt);\n }\n};\n\n/**\n * @summary Initializes the movement\n * @param {MouseEvent|Touch} evt\n * @private\n */\nPhotoSphereViewer.prototype._startMove = function(evt) {\n this.stopAutorotate();\n this.stopAnimation();\n\n this.prop.mouse_x = this.prop.start_mouse_x = parseInt(evt.clientX);\n this.prop.mouse_y = this.prop.start_mouse_y = parseInt(evt.clientY);\n this.prop.moving = true;\n this.prop.zooming = false;\n\n this.prop.mouse_history.length = 0;\n this._logMouseMove(evt);\n};\n\n/**\n * @summary Initializes the zoom\n * @param {TouchEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._startZoom = function(evt) {\n var t = [\n { x: parseInt(evt.touches[0].clientX), y: parseInt(evt.touches[0].clientY) },\n { x: parseInt(evt.touches[1].clientX), y: parseInt(evt.touches[1].clientY) }\n ];\n\n this.prop.pinch_dist = Math.sqrt(Math.pow(t[0].x - t[1].x, 2) + Math.pow(t[0].y - t[1].y, 2));\n this.prop.moving = false;\n this.prop.zooming = true;\n};\n\n/**\n * @summary Stops the movement\n * @description If the move threshold was not reached a click event is triggered, otherwise an animation is launched to simulate inertia\n * @param {MouseEvent|Touch} evt\n * @private\n */\nPhotoSphereViewer.prototype._stopMove = function(evt) {\n if (!PSVUtils.getClosest(evt.target, '.psv-hud')) {\n return;\n }\n\n if (this.prop.moving) {\n // move threshold to trigger a click\n if (Math.abs(evt.clientX - this.prop.start_mouse_x) < PhotoSphereViewer.MOVE_THRESHOLD && Math.abs(evt.clientY - this.prop.start_mouse_y) < PhotoSphereViewer.MOVE_THRESHOLD) {\n this._click(evt);\n this.prop.moving = false;\n }\n // inertia animation\n else if (this.config.move_inertia && !this.isGyroscopeEnabled()) {\n this._logMouseMove(evt);\n this._stopMoveInertia(evt);\n }\n else {\n this.prop.moving = false;\n }\n\n this.prop.mouse_history.length = 0;\n }\n\n this.prop.zooming = false;\n};\n\n/**\n * @summary Performs an animation to simulate inertia when the movement stops\n * @param {MouseEvent|Touch} evt\n * @private\n */\nPhotoSphereViewer.prototype._stopMoveInertia = function(evt) {\n var direction = {\n x: evt.clientX - this.prop.mouse_history[0][1],\n y: evt.clientY - this.prop.mouse_history[0][2]\n };\n\n var norm = Math.sqrt(direction.x * direction.x + direction.y * direction.y);\n\n this.prop.animation_promise = PSVUtils.animation({\n properties: {\n clientX: { start: evt.clientX, end: evt.clientX + direction.x },\n clientY: { start: evt.clientY, end: evt.clientY + direction.y }\n },\n duration: norm * PhotoSphereViewer.INERTIA_WINDOW / 100,\n easing: 'outCirc',\n onTick: function(properties) {\n this._move(properties, false);\n }.bind(this)\n })\n .ensure(function() {\n this.prop.moving = false;\n }.bind(this));\n};\n\n/**\n * @summary Triggers an event with all coordinates when a simple click is performed\n * @param {MouseEvent|Touch} evt\n * @fires PhotoSphereViewer.click\n * @fires PhotoSphereViewer.dblclick\n * @private\n */\nPhotoSphereViewer.prototype._click = function(evt) {\n var boundingRect = this.container.getBoundingClientRect();\n\n var data = {\n target: evt.target,\n client_x: evt.clientX,\n client_y: evt.clientY,\n viewer_x: parseInt(evt.clientX - boundingRect.left),\n viewer_y: parseInt(evt.clientY - boundingRect.top)\n };\n\n var intersect = this.viewerCoordsToVector3({ x: data.viewer_x, y: data.viewer_y });\n\n if (intersect) {\n var sphericalCoords = this.vector3ToSphericalCoords(intersect);\n data.longitude = sphericalCoords.longitude;\n data.latitude = sphericalCoords.latitude;\n\n // TODO: for cubemap, computes texture's index and coordinates\n if (!this.prop.isCubemap) {\n var textureCoords = this.sphericalCoordsToTextureCoords({ longitude: data.longitude, latitude: data.latitude });\n data.texture_x = textureCoords.x;\n data.texture_y = textureCoords.y;\n }\n\n if (!this.prop.dblclick_timeout) {\n /**\n * @event click\n * @memberof PhotoSphereViewer\n * @summary Triggered when the user clicks on the viewer (everywhere excluding the navbar and the side panel)\n * @param {PhotoSphereViewer.ClickData} data\n */\n this.trigger('click', data);\n\n this.prop.dblclick_data = PSVUtils.clone(data);\n this.prop.dblclick_timeout = setTimeout(function() {\n this.prop.dblclick_timeout = null;\n this.prop.dblclick_data = null;\n }.bind(this), PhotoSphereViewer.DBLCLICK_DELAY);\n }\n else {\n if (Math.abs(this.prop.dblclick_data.client_x - data.client_x) < PhotoSphereViewer.MOVE_THRESHOLD &&\n Math.abs(this.prop.dblclick_data.client_y - data.client_y) < PhotoSphereViewer.MOVE_THRESHOLD) {\n /**\n * @event dblclick\n * @memberof PhotoSphereViewer\n * @summary Triggered when the user double clicks on the viewer. The simple `click` event is always fired before `dblclick`\n * @param {PhotoSphereViewer.ClickData} data\n */\n this.trigger('dblclick', this.prop.dblclick_data);\n }\n\n clearTimeout(this.prop.dblclick_timeout);\n this.prop.dblclick_timeout = null;\n this.prop.dblclick_data = null;\n }\n }\n};\n\n/**\n * @summary Performs movement\n * @param {MouseEvent|Touch} evt\n * @param {boolean} [log=true]\n * @private\n */\nPhotoSphereViewer.prototype._move = function(evt, log) {\n if (this.prop.moving) {\n var x = parseInt(evt.clientX);\n var y = parseInt(evt.clientY);\n\n var rotation = {\n longitude: (x - this.prop.mouse_x) / this.prop.size.width * this.prop.move_speed * this.prop.hFov * PhotoSphereViewer.SYSTEM.pixelRatio,\n latitude: (y - this.prop.mouse_y) / this.prop.size.height * this.prop.move_speed * this.prop.vFov * PhotoSphereViewer.SYSTEM.pixelRatio\n };\n\n if (this.isGyroscopeEnabled()) {\n this.prop.gyro_alpha_offset += rotation.longitude;\n }\n else {\n this.rotate({\n longitude: this.prop.longitude - rotation.longitude,\n latitude: this.prop.latitude + rotation.latitude\n });\n }\n\n this.prop.mouse_x = x;\n this.prop.mouse_y = y;\n\n if (log !== false) {\n this._logMouseMove(evt);\n }\n }\n};\n\n/**\n * @summary Performs movement absolute to cursor position in viewer\n * @param {MouseEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._moveAbsolute = function(evt) {\n if (this.prop.moving) {\n this.rotate({\n longitude: ((evt.clientX - this.container.offsetLeft) / this.container.offsetWidth - 0.5) * PSVUtils.TwoPI,\n latitude: -((evt.clientY - this.container.offsetTop) / this.container.offsetHeight - 0.5) * Math.PI\n });\n }\n};\n\n/**\n * @summary Perfoms zoom\n * @param {TouchEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._zoom = function(evt) {\n if (this.prop.zooming) {\n var t = [\n { x: parseInt(evt.touches[0].clientX), y: parseInt(evt.touches[0].clientY) },\n { x: parseInt(evt.touches[1].clientX), y: parseInt(evt.touches[1].clientY) }\n ];\n\n var p = Math.sqrt(Math.pow(t[0].x - t[1].x, 2) + Math.pow(t[0].y - t[1].y, 2));\n var delta = 80 * (p - this.prop.pinch_dist) / this.prop.size.width;\n\n this.zoom(this.prop.zoom_lvl + delta);\n\n this.prop.pinch_dist = p;\n }\n};\n\n/**\n * @summary Handles mouse wheel events\n * @param {MouseWheelEvent} evt\n * @private\n */\nPhotoSphereViewer.prototype._onMouseWheel = function(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n\n var delta = PSVUtils.normalizeWheel(evt).spinY * 5;\n\n if (delta !== 0) {\n this.zoom(this.prop.zoom_lvl - delta * this.config.mousewheel_factor);\n }\n};\n\n/**\n * @summary Handles fullscreen events\n * @fires PhotoSphereViewer.fullscreen-updated\n * @private\n */\nPhotoSphereViewer.prototype._fullscreenToggled = function() {\n var enabled = this.isFullscreenEnabled();\n\n if (this.config.keyboard) {\n if (enabled) {\n this.startKeyboardControl();\n }\n else {\n this.stopKeyboardControl();\n }\n }\n\n /**\n * @event fullscreen-updated\n * @memberof PhotoSphereViewer\n * @summary Triggered when the fullscreen mode is enabled/disabled\n * @param {boolean} enabled\n */\n this.trigger('fullscreen-updated', enabled);\n};\n\n/**\n * @summary Stores each mouse position during a mouse move\n * @description Positions older than \"INERTIA_WINDOW\" are removed<br>\n * Positions before a pause of \"INERTIA_WINDOW\" / 10 are removed\n * @param {MouseEvent|Touch} evt\n * @private\n */\nPhotoSphereViewer.prototype._logMouseMove = function(evt) {\n var now = Date.now();\n this.prop.mouse_history.push([now, evt.clientX, evt.clientY]);\n\n var previous = null;\n\n for (var i = 0; i < this.prop.mouse_history.length;) {\n if (this.prop.mouse_history[0][i] < now - PhotoSphereViewer.INERTIA_WINDOW) {\n this.prop.mouse_history.splice(i, 1);\n }\n else if (previous && this.prop.mouse_history[0][i] - previous > PhotoSphereViewer.INERTIA_WINDOW / 10) {\n this.prop.mouse_history.splice(0, i);\n i = 0;\n previous = this.prop.mouse_history[0][i];\n }\n else {\n i++;\n previous = this.prop.mouse_history[0][i];\n }\n }\n};\n\n\n/**\n * @summary Starts to load the panorama\n * @returns {Promise}\n * @throws {PSVError} when the panorama is not configured\n */\nPhotoSphereViewer.prototype.load = function() {\n if (!this.config.panorama) {\n throw new PSVError('No value given for panorama.');\n }\n\n return this.setPanorama(this.config.panorama, false);\n};\n\n/**\n * @summary Returns the current position of the camera\n * @returns {PhotoSphereViewer.Position}\n */\nPhotoSphereViewer.prototype.getPosition = function() {\n return {\n longitude: this.prop.longitude,\n latitude: this.prop.latitude\n };\n};\n\n/**\n * @summary Returns the current zoom level\n * @returns {int}\n */\nPhotoSphereViewer.prototype.getZoomLevel = function() {\n return this.prop.zoom_lvl;\n};\n\n/**\n * @summary Returns the current viewer size\n * @returns {PhotoSphereViewer.Size}\n */\nPhotoSphereViewer.prototype.getSize = function() {\n return {\n width: this.prop.size.width,\n height: this.prop.size.height\n };\n};\n\n/**\n * @summary Checks if the automatic rotation is enabled\n * @returns {boolean}\n */\nPhotoSphereViewer.prototype.isAutorotateEnabled = function() {\n return !!this.prop.autorotate_reqid;\n};\n\n/**\n * @summary Checks if the gyroscope is enabled\n * @returns {boolean}\n */\nPhotoSphereViewer.prototype.isGyroscopeEnabled = function() {\n return !!this.prop.orientation_reqid;\n};\n\n/**\n * @summary Checks if the viewer is in fullscreen\n * @returns {boolean}\n */\nPhotoSphereViewer.prototype.isFullscreenEnabled = function() {\n return PSVUtils.isFullscreenEnabled(this.container);\n};\n\n/**\n * @summary Performs a render\n * @param {boolean} [updateDirection=true] - should update camera direction\n * @fires PhotoSphereViewer.render\n */\nPhotoSphereViewer.prototype.render = function(updateDirection) {\n if (updateDirection !== false) {\n this.prop.direction = this.sphericalCoordsToVector3(this.prop);\n }\n\n this.camera.position.set(0, 0, 0);\n this.camera.lookAt(this.prop.direction);\n\n if (this.config.fisheye) {\n this.camera.position.copy(this.prop.direction).multiplyScalar(this.config.fisheye / 2).negate();\n }\n\n this.camera.aspect = this.prop.aspect;\n this.camera.fov = this.prop.vFov;\n this.camera.updateProjectionMatrix();\n\n this.renderer.render(this.scene, this.camera);\n\n /**\n * @event render\n * @memberof PhotoSphereViewer\n * @summary Triggered on each viewer render, **this event is triggered very often**\n */\n this.trigger('render');\n};\n\n/**\n * @summary Destroys the viewer\n * @description The memory used by the ThreeJS context is not totally cleared. This will be fixed as soon as possible.\n */\nPhotoSphereViewer.prototype.destroy = function() {\n this._stopAll();\n this.stopKeyboardControl();\n\n if (this.isFullscreenEnabled()) {\n PSVUtils.exitFullscreen();\n }\n\n // remove listeners\n this._unbindEvents();\n\n // destroy components\n if (this.tooltip) {\n this.tooltip.destroy();\n }\n if (this.hud) {\n this.hud.destroy();\n }\n if (this.loader) {\n this.loader.destroy();\n }\n if (this.navbar) {\n this.navbar.destroy();\n }\n if (this.panel) {\n this.panel.destroy();\n }\n if (this.doControls) {\n this.doControls.disconnect();\n }\n\n // destroy ThreeJS view\n if (this.scene) {\n PSVUtils.cleanTHREEScene(this.scene);\n }\n\n // remove container\n if (this.canvas_container) {\n this.container.removeChild(this.canvas_container);\n }\n this.parent.removeChild(this.container);\n\n delete this.parent.photoSphereViewer;\n\n // clean references\n delete this.parent;\n delete this.container;\n delete this.loader;\n delete this.navbar;\n delete this.hud;\n delete this.panel;\n delete this.tooltip;\n delete this.canvas_container;\n delete this.renderer;\n delete this.scene;\n delete this.camera;\n delete this.mesh;\n delete this.doControls;\n delete this.raycaster;\n delete this.passes;\n delete this.config;\n this.prop.cache.length = 0;\n};\n\n/**\n * @summary Loads a new panorama file\n * @description Loads a new panorama file, optionally changing the camera position and activating the transition animation.<br>\n * If the \"position\" is not defined, the camera will not move and the ongoing animation will continue<br>\n * \"config.transition\" must be configured for \"transition\" to be taken in account\n * @param {string|string[]} path - URL of the new panorama file\n * @param {PhotoSphereViewer.ExtendedPosition} [position]\n * @param {boolean} [transition=false]\n * @returns {Promise}\n * @throws {PSVError} when another panorama is already loading\n */\nPhotoSphereViewer.prototype.setPanorama = function(path, position, transition) {\n if (this.prop.loading_promise !== null) {\n throw new PSVError('Loading already in progress');\n }\n\n if (typeof position === 'boolean') {\n transition = position;\n position = undefined;\n }\n\n if (transition && this.prop.isCubemap) {\n throw new PSVError('Transition is not available with cubemap.');\n }\n\n if (position) {\n this.cleanPosition(position);\n\n this._stopAll();\n }\n\n this.config.panorama = path;\n\n if (!transition || !this.config.transition || !this.scene) {\n this.loader.show();\n if (this.canvas_container) {\n this.canvas_container.style.opacity = 0;\n }\n\n this.prop.loading_promise = this._loadTexture(this.config.panorama)\n .then(function(texture) {\n this._setTexture(texture);\n\n if (position) {\n this.rotate(position);\n }\n }.bind(this))\n .ensure(function() {\n this.loader.hide();\n this.canvas_container.style.opacity = 1;\n\n this.prop.loading_promise = null;\n }.bind(this))\n .rethrow();\n }\n else {\n if (this.config.transition.loader) {\n this.loader.show();\n }\n\n this.prop.loading_promise = this._loadTexture(this.config.panorama)\n .then(function(texture) {\n this.loader.hide();\n\n return this._transition(texture, position);\n }.bind(this))\n .ensure(function() {\n this.loader.hide();\n\n this.prop.loading_promise = null;\n }.bind(this))\n .rethrow();\n }\n\n return this.prop.loading_promise;\n};\n\n/**\n * @summary Starts the automatic rotation\n * @fires PhotoSphereViewer.autorotate\n */\nPhotoSphereViewer.prototype.startAutorotate = function() {\n this._stopAll();\n\n var last;\n var elapsed;\n\n var run = function (timestamp) {\n if (timestamp) {\n elapsed = last === undefined ? 0 : timestamp - last;\n last = timestamp;\n\n this.rotate({\n longitude: this.prop.longitude + this.config.anim_speed * elapsed / 1000,\n latitude: this.prop.latitude - (this.prop.latitude - this.config.anim_lat) / 200\n });\n }\n\n this.prop.autorotate_reqid = window.requestAnimationFrame(run);\n }.bind(this);\n\n run();\n\n /**\n * @event autorotate\n * @memberof PhotoSphereViewer\n * @summary Triggered when the automatic rotation is enabled/disabled\n * @param {boolean} enabled\n */\n this.trigger('autorotate', true);\n};\n\n/**\n * @summary Stops the automatic rotation\n * @fires PhotoSphereViewer.autorotate\n */\nPhotoSphereViewer.prototype.stopAutorotate = function() {\n if (this.prop.start_timeout) {\n window.clearTimeout(this.prop.start_timeout);\n this.prop.start_timeout = null;\n }\n\n if (this.prop.autorotate_reqid) {\n window.cancelAnimationFrame(this.prop.autorotate_reqid);\n this.prop.autorotate_reqid = null;\n\n this.trigger('autorotate', false);\n }\n};\n\n/**\n * @summary Starts or stops the automatic rotation\n */\nPhotoSphereViewer.prototype.toggleAutorotate = function() {\n if (this.isAutorotateEnabled()) {\n this.stopAutorotate();\n }\n else {\n this.startAutorotate();\n }\n};\n\n/**\n * @summary Enables the gyroscope navigation if available\n * @fires PhotoSphereViewer.gyroscope-updated\n */\nPhotoSphereViewer.prototype.startGyroscopeControl = function() {\n if (!this.doControls || !this.doControls.enabled) {\n console.warn('PhotoSphereViewer: gyroscope disabled');\n return;\n }\n\n PhotoSphereViewer.SYSTEM.deviceOrientationSupported.then(\n PhotoSphereViewer.prototype._startGyroscopeControl.bind(this),\n function() {\n console.warn('PhotoSphereViewer: gyroscope not available');\n }\n );\n};\n\n/**\n * @summary Immediately enables the gyroscope navigation\n * @description Do not call this method directly, call `startGyroscopeControl` instead\n * @fires PhotoSphereViewer.gyroscope-updated\n * @private\n */\nPhotoSphereViewer.prototype._startGyroscopeControl = function() {\n this._stopAll();\n\n // compute the alpha offset to keep the current orientation\n this.doControls.alphaOffset = this.prop.longitude;\n this.doControls.update();\n\n var direction = this.camera.getWorldDirection(new THREE.Vector3());\n var sphericalCoords = this.vector3ToSphericalCoords(direction);\n\n this.prop.gyro_alpha_offset = sphericalCoords.longitude;\n\n var run = function() {\n this.doControls.alphaOffset = this.prop.gyro_alpha_offset;\n this.doControls.update();\n\n this.camera.getWorldDirection(this.prop.direction);\n this.prop.direction.multiplyScalar(PhotoSphereViewer.SPHERE_RADIUS);\n\n var sphericalCoords = this.vector3ToSphericalCoords(this.prop.direction);\n this.prop.longitude = sphericalCoords.longitude;\n this.prop.latitude = sphericalCoords.latitude;\n\n this.render(false);\n\n this.prop.orientation_reqid = window.requestAnimationFrame(run);\n }.bind(this);\n\n run();\n\n /**\n * @event gyroscope-updated\n * @memberof PhotoSphereViewer\n * @summary Triggered when the gyroscope mode is enabled/disabled\n * @param {boolean} enabled\n */\n this.trigger('gyroscope-updated', true);\n};\n\n/**\n * @summary Disables the gyroscope navigation\n * @fires PhotoSphereViewer.gyroscope-updated\n */\nPhotoSphereViewer.prototype.stopGyroscopeControl = function() {\n if (this.prop.orientation_reqid) {\n window.cancelAnimationFrame(this.prop.orientation_reqid);\n this.prop.orientation_reqid = null;\n\n this.trigger('gyroscope-updated', false);\n\n this.render();\n }\n};\n\n/**\n * @summary Enables or disables the gyroscope navigation\n */\nPhotoSphereViewer.prototype.toggleGyroscopeControl = function() {\n if (this.isGyroscopeEnabled()) {\n this.stopGyroscopeControl();\n }\n else {\n this.startGyroscopeControl();\n }\n};\n\n/**\n * @summary Rotates the view to specific longitude and latitude\n * @param {PhotoSphereViewer.ExtendedPosition} position\n * @param {boolean} [render=true]\n * @fires PhotoSphereViewer._side-reached\n * @fires PhotoSphereViewer.position-updated\n */\nPhotoSphereViewer.prototype.rotate = function(position, render) {\n this.cleanPosition(position);\n\n /**\n * @event _side-reached\n * @memberof PhotoSphereViewer\n * @param {string} side\n * @private\n */\n this.applyRanges(position).forEach(\n this.trigger.bind(this, '_side-reached')\n );\n\n this.prop.longitude = position.longitude;\n this.prop.latitude = position.latitude;\n\n if (render !== false && this.renderer) {\n this.render();\n\n /**\n * @event position-updated\n * @memberof PhotoSphereViewer\n * @summary Triggered when the view longitude and/or latitude changes\n * @param {PhotoSphereViewer.Position} position\n */\n this.trigger('position-updated', this.getPosition());\n }\n};\n\n/**\n * @summary Rotates the view to specific longitude and latitude with a smooth animation\n * @param {PhotoSphereViewer.ExtendedPosition} position\n * @param {string|int} duration - animation speed or duration (in milliseconds)\n * @returns {Promise}\n */\nPhotoSphereViewer.prototype.animate = function(position, duration) {\n this._stopAll();\n\n this.cleanPosition(position);\n\n if (!duration || Math.abs(position.longitude - this.prop.longitude) < PhotoSphereViewer.ANGLE_THRESHOLD && Math.abs(position.latitude - this.prop.latitude) < PhotoSphereViewer.ANGLE_THRESHOLD) {\n this.rotate(position);\n\n return D.resolved();\n }\n\n this.applyRanges(position).forEach(\n this.trigger.bind(this, '_side-reached')\n );\n\n if (!duration && typeof duration !== 'number') {\n // desired radial speed\n duration = duration ? PSVUtils.parseSpeed(duration) : this.config.anim_speed;\n // get the angle between current position and target\n var angle = Math.acos(\n Math.cos(this.prop.latitude) * Math.cos(position.latitude) * Math.cos(this.prop.longitude - position.longitude) +\n Math.sin(this.prop.latitude) * Math.sin(position.latitude)\n );\n // compute duration\n duration = angle / duration * 1000;\n }\n\n // longitude offset for shortest arc\n var tOffset = PSVUtils.getShortestArc(this.prop.longitude, position.longitude);\n\n this.prop.animation_promise = PSVUtils.animation({\n properties: {\n longitude: { start: this.prop.longitude, end: this.prop.longitude + tOffset },\n latitude: { start: this.prop.latitude, end: position.latitude }\n },\n duration: duration,\n easing: 'inOutSine',\n onTick: this.rotate.bind(this)\n });\n\n return this.prop.animation_promise;\n};\n\n/**\n * @summary Stops the ongoing animation\n */\nPhotoSphereViewer.prototype.stopAnimation = function() {\n if (this.prop.animation_promise) {\n this.prop.animation_promise.cancel();\n this.prop.animation_promise = null;\n }\n};\n\n/**\n * @summary Zooms to a specific level between `max_fov` and `min_fov`\n * @param {int} level - new zoom level from 0 to 100\n * @param {boolean} [render=true]\n * @fires PhotoSphereViewer.zoom-updated\n */\nPhotoSphereViewer.prototype.zoom = function(level, render) {\n this.prop.zoom_lvl = PSVUtils.bound(Math.round(level), 0, 100);\n this.prop.vFov = this.config.max_fov + (this.prop.zoom_lvl / 100) * (this.config.min_fov - this.config.max_fov);\n this.prop.hFov = THREE.Math.radToDeg(2 * Math.atan(Math.tan(THREE.Math.degToRad(this.prop.vFov) / 2) * this.prop.aspect));\n\n if (render !== false && this.renderer) {\n this.render();\n\n /**\n * @event zoom-updated\n * @memberof PhotoSphereViewer\n * @summary Triggered when the zoom level changes\n * @param {int} zoomLevel\n */\n this.trigger('zoom-updated', this.getZoomLevel());\n }\n};\n\n/**\n * @summary Increases the zoom level by 1\n */\nPhotoSphereViewer.prototype.zoomIn = function() {\n if (this.prop.zoom_lvl < 100) {\n this.zoom(this.prop.zoom_lvl + 1);\n }\n};\n\n/**\n * @summary Decreases the zoom level by 1\n */\nPhotoSphereViewer.prototype.zoomOut = function() {\n if (this.prop.zoom_lvl > 0) {\n this.zoom(this.prop.zoom_lvl - 1);\n }\n};\n\n/**\n * @summary Resizes the viewer\n * @param {PhotoSphereViewer.CssSize} size\n */\nPhotoSphereViewer.prototype.resize = function(size) {\n if (size.width) {\n this.container.style.width = size.width;\n }\n if (size.height) {\n this.container.style.height = size.height;\n }\n\n this._onResize();\n};\n\n/**\n * @summary Enters or exits the fullscreen mode\n */\nPhotoSphereViewer.prototype.toggleFullscreen = function() {\n if (!this.isFullscreenEnabled()) {\n PSVUtils.requestFullscreen(this.container);\n }\n else {\n PSVUtils.exitFullscreen();\n }\n};\n\n/**\n * @summary Enables the keyboard controls (done automatically when entering fullscreen)\n */\nPhotoSphereViewer.prototype.startKeyboardControl = function() {\n window.addEventListener('keydown', this);\n};\n\n/**\n * @summary Disables the keyboard controls (done automatically when exiting fullscreen)\n */\nPhotoSphereViewer.prototype.stopKeyboardControl = function() {\n window.removeEventListener('keydown', this);\n};\n\n/**\n * @summary Preload a panorama file without displaying it\n * @param {string} panorama\n * @returns {Promise}\n * @throws {PSVError} when the cache is disabled\n */\nPhotoSphereViewer.prototype.preloadPanorama = function(panorama) {\n if (!this.config.cache_texture) {\n throw new PSVError('Cannot preload panorama, cache_texture is disabled');\n }\n\n return this._loadTexture(panorama);\n};\n\n/**\n * @summary Removes a panorama from the cache or clears the entire cache\n * @param {string} [panorama]\n * @throws {PSVError} when the cache is disabled\n */\nPhotoSphereViewer.prototype.clearPanoramaCache = function(panorama) {\n if (!this.config.cache_texture) {\n throw new PSVError('Cannot clear cache, cache_texture is disabled');\n }\n\n if (panorama) {\n for (var i = 0, l = this.prop.cache.length; i < l; i++) {\n if (this.prop.cache[i].panorama === panorama) {\n this.prop.cache.splice(i, 1);\n break;\n }\n }\n }\n else {\n this.prop.cache.length = 0;\n }\n};\n\n/**\n * @summary Retrieves the cache for a panorama\n * @param {string} panorama\n * @returns {PhotoSphereViewer.CacheItem}\n * @throws {PSVError} when the cache is disabled\n */\nPhotoSphereViewer.prototype.getPanoramaCache = function(panorama) {\n if (!this.config.cache_texture) {\n throw new PSVError('Cannot query cache, cache_texture is disabled');\n }\n\n return this.prop.cache.filter(function(cache) {\n return cache.panorama === panorama;\n }).shift();\n};\n\n\n/**\n * @summary Inits the global SYSTEM var with generic support information\n * @private\n */\nPhotoSphereViewer._loadSystem = function() {\n var S = PhotoSphereViewer.SYSTEM;\n S.loaded = true;\n S.pixelRatio = window.devicePixelRatio || 1;\n S.isWebGLSupported = PSVUtils.isWebGLSupported();\n S.isCanvasSupported = PSVUtils.isCanvasSupported();\n S.maxTextureWidth = S.isWebGLSupported ? PSVUtils.getMaxTextureWidth() : 4096;\n S.mouseWheelEvent = PSVUtils.mouseWheelEvent();\n S.fullscreenEvent = PSVUtils.fullscreenEvent();\n S.deviceOrientationSupported = PSVUtils.isDeviceOrientationSupported();\n};\n\n/**\n * @summary Sets the viewer size\n * @param {PhotoSphereViewer.Size} size\n * @private\n */\nPhotoSphereViewer.prototype._setViewerSize = function(size) {\n ['width', 'height'].forEach(function(dim) {\n if (size[dim]) {\n if (/^[0-9.]+$/.test(size[dim])) {\n size[dim] += 'px';\n }\n this.parent.style[dim] = size[dim];\n }\n }, this);\n};\n\n/**\n * @summary Converts pixel texture coordinates to spherical radians coordinates\n * @param {PhotoSphereViewer.Point} point\n * @returns {PhotoSphereViewer.Position}\n */\nPhotoSphereViewer.prototype.textureCoordsToSphericalCoords = function(point) {\n if (this.prop.isCubemap) {\n throw new PSVError('Unable to use texture coords with cubemap.');\n }\n\n var relativeX = (point.x + this.prop.pano_data.cropped_x) / this.prop.pano_data.full_width * PSVUtils.TwoPI;\n var relativeY = (point.y + this.prop.pano_data.cropped_y) / this.prop.pano_data.full_height * Math.PI;\n\n return {\n longitude: relativeX >= Math.PI ? relativeX - Math.PI : relativeX + Math.PI,\n latitude: PSVUtils.HalfPI - relativeY\n };\n};\n\n/**\n * @summary Converts spherical radians coordinates to pixel texture coordinates\n * @param {PhotoSphereViewer.Position} position\n * @returns {PhotoSphereViewer.Point}\n */\nPhotoSphereViewer.prototype.sphericalCoordsToTextureCoords = function(position) {\n if (this.prop.isCubemap) {\n throw new PSVError('Unable to use texture coords with cubemap.');\n }\n\n var relativeLong = position.longitude / PSVUtils.TwoPI * this.prop.pano_data.full_width;\n var relativeLat = position.latitude / Math.PI * this.prop.pano_data.full_height;\n\n return {\n x: parseInt(position.longitude < Math.PI ? relativeLong + this.prop.pano_data.full_width / 2 : relativeLong - this.prop.pano_data.full_width / 2) - this.prop.pano_data.cropped_x,\n y: parseInt(this.prop.pano_data.full_height / 2 - relativeLat) - this.prop.pano_data.cropped_y\n };\n};\n\n/**\n * @summary Converts spherical radians coordinates to a THREE.Vector3\n * @param {PhotoSphereViewer.Position} position\n * @returns {THREE.Vector3}\n */\nPhotoSphereViewer.prototype.sphericalCoordsToVector3 = function(position) {\n return new THREE.Vector3(\n PhotoSphereViewer.SPHERE_RADIUS * -Math.cos(position.latitude) * Math.sin(position.longitude),\n PhotoSphereViewer.SPHERE_RADIUS * Math.sin(position.latitude),\n PhotoSphereViewer.SPHERE_RADIUS * Math.cos(position.latitude) * Math.cos(position.longitude)\n );\n};\n\n/**\n * @summary Converts a THREE.Vector3 to spherical radians coordinates\n * @param {THREE.Vector3} vector\n * @returns {PhotoSphereViewer.Position}\n */\nPhotoSphereViewer.prototype.vector3ToSphericalCoords = function(vector) {\n var phi = Math.acos(vector.y / Math.sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z));\n var theta = Math.atan2(vector.x, vector.z);\n\n return {\n longitude: theta < 0 ? -theta : PSVUtils.TwoPI - theta,\n latitude: PSVUtils.HalfPI - phi\n };\n};\n\n/**\n * @summary Converts position on the viewer to a THREE.Vector3\n * @param {PhotoSphereViewer.Point} viewerPoint\n * @returns {THREE.Vector3}\n */\nPhotoSphereViewer.prototype.viewerCoordsToVector3 = function(viewerPoint) {\n var screen = new THREE.Vector2(\n 2 * viewerPoint.x / this.prop.size.width - 1,\n -2 * viewerPoint.y / this.prop.size.height + 1\n );\n\n this.raycaster.setFromCamera(screen, this.camera);\n\n var intersects = this.raycaster.intersectObjects(this.scene.children);\n\n if (intersects.length === 1) {\n return intersects[0].point;\n }\n else {\n return null;\n }\n};\n\n/**\n * @summary Converts a THREE.Vector3 to position on the viewer\n * @param {THREE.Vector3} vector\n * @returns {PhotoSphereViewer.Point}\n */\nPhotoSphereViewer.prototype.vector3ToViewerCoords = function(vector) {\n vector = vector.clone();\n vector.project(this.camera);\n\n return {\n x: parseInt((vector.x + 1) / 2 * this.prop.size.width),\n y: parseInt((1 - vector.y) / 2 * this.prop.size.height)\n };\n};\n\n/**\n * @summary Converts x/y to latitude/longitude if present and ensure boundaries\n * @param {PhotoSphereViewer.ExtendedPosition} position - mutated\n * @private\n */\nPhotoSphereViewer.prototype.cleanPosition = function(position) {\n if (position.hasOwnProperty('x') && position.hasOwnProperty('y')) {\n PSVUtils.deepmerge(position, this.textureCoordsToSphericalCoords(position));\n }\n\n position.longitude = PSVUtils.parseAngle(position.longitude);\n position.latitude = PSVUtils.parseAngle(position.latitude, true);\n};\n\n/**\n * @summary Apply \"longitude_range\" and \"latitude_range\"\n * @param {PhotoSphereViewer.Position} position - mutated\n * @returns {string[]} list of sides that were reached\n * @private\n */\nPhotoSphereViewer.prototype.applyRanges = function(position) {\n var range, offset, sidesReached = [];\n\n if (this.config.longitude_range) {\n range = PSVUtils.clone(this.config.longitude_range);\n offset = THREE.Math.degToRad(this.prop.hFov) / 2;\n\n range[0] = PSVUtils.parseAngle(range[0] + offset);\n range[1] = PSVUtils.parseAngle(range[1] - offset);\n\n if (range[0] > range[1]) { // when the range cross longitude 0\n if (position.longitude > range[1] && position.longitude < range[0]) {\n if (position.longitude > (range[0] / 2 + range[1] / 2)) { // detect which side we are closer too\n position.longitude = range[0];\n sidesReached.push('left');\n }\n else {\n position.longitude = range[1];\n sidesReached.push('right');\n }\n }\n }\n else {\n if (position.longitude < range[0]) {\n position.longitude = range[0];\n sidesReached.push('left');\n }\n else if (position.longitude > range[1]) {\n position.longitude = range[1];\n sidesReached.push('right');\n }\n }\n }\n\n if (this.config.latitude_range) {\n range = PSVUtils.clone(this.config.latitude_range);\n offset = THREE.Math.degToRad(this.prop.vFov) / 2;\n\n range[0] = PSVUtils.parseAngle(Math.min(range[0] + offset, range[1]), true);\n range[1] = PSVUtils.parseAngle(Math.max(range[1] - offset, range[0]), true);\n\n if (position.latitude < range[0]) {\n position.latitude = range[0];\n sidesReached.push('bottom');\n }\n else if (position.latitude > range[1]) {\n position.latitude = range[1];\n sidesReached.push('top');\n }\n }\n\n return sidesReached;\n};\n\n\n/**\n * @module components\n */\n\n/**\n * Base sub-component class\n * @param {PhotoSphereViewer | module:components.PSVComponent} parent\n * @constructor\n * @memberof module:components\n */\nfunction PSVComponent(parent) {\n /**\n * @member {PhotoSphereViewer}\n * @readonly\n */\n this.psv = parent instanceof PhotoSphereViewer ? parent : parent.psv;\n\n /**\n * @member {PhotoSphereViewer|module:components.PSVComponent}\n * @readonly\n */\n this.parent = parent;\n\n /**\n * @member {HTMLElement}\n * @readonly\n */\n this.container = null;\n\n // expose some methods to the viewer\n if (this.constructor.publicMethods) {\n this.constructor.publicMethods.forEach(function(method) {\n this.psv[method] = this[method].bind(this);\n }, this);\n }\n}\n\n/**\n * @summary CSS class added to the component's container\n * @member {string}\n * @readonly\n */\nPSVComponent.className = null;\n\n/**\n * @summary List of component's methods which are bound the the main viewer\n * @member {string[]}\n * @readonly\n */\nPSVComponent.publicMethods = [];\n\n/**\n * @summary Creates the component\n * @protected\n */\nPSVComponent.prototype.create = function() {\n this.container = document.createElement('div');\n\n if (this.constructor.className) {\n this.container.className = this.constructor.className;\n }\n\n this.parent.container.appendChild(this.container);\n};\n\n/**\n * @summary Destroys the component\n * @protected\n */\nPSVComponent.prototype.destroy = function() {\n this.parent.container.removeChild(this.container);\n\n if (this.constructor.publicMethods) {\n this.constructor.publicMethods.forEach(function(method) {\n delete this.psv[method];\n }, this);\n }\n\n delete this.container;\n delete this.psv;\n delete this.parent;\n};\n\n/**\n * @summary Hides the component\n * @protected\n */\nPSVComponent.prototype.hide = function() {\n this.container.style.display = 'none';\n};\n\n/**\n * @summary Displays the component\n * @protected\n */\nPSVComponent.prototype.show = function() {\n this.container.style.display = '';\n};\n\n\n/**\n * HUD class\n * @param {PhotoSphereViewer} psv\n * @constructor\n * @extends module:components.PSVComponent\n * @memberof module:components\n */\nfunction PSVHUD(psv) {\n PSVComponent.call(this, psv);\n\n /**\n * @member {SVGElement}\n * @readonly\n */\n this.svgContainer = null;\n\n /**\n * @summary All registered markers\n * @member {Object.<string, PSVMarker>}\n */\n this.markers = {};\n\n /**\n * @summary Last selected marker\n * @member {PSVMarker}\n * @readonly\n */\n this.currentMarker = null;\n\n /**\n * @summary Marker under the cursor\n * @member {PSVMarker}\n * @readonly\n */\n this.hoveringMarker = null;\n\n /**\n * @member {Object}\n * @private\n */\n this.prop = {\n panelOpened: false,\n panelOpening: false,\n markersButton: this.psv.navbar.getNavbarButton('markers', true)\n };\n\n this.create();\n}\n\nPSVHUD.prototype = Object.create(PSVComponent.prototype);\nPSVHUD.prototype.constructor = PSVHUD;\n\nPSVHUD.className = 'psv-hud';\nPSVHUD.publicMethods = [\n 'addMarker',\n 'removeMarker',\n 'updateMarker',\n 'clearMarkers',\n 'getMarker',\n 'getCurrentMarker',\n 'gotoMarker',\n 'hideMarker',\n 'showMarker',\n 'toggleMarker',\n 'toggleMarkersList',\n 'showMarkersList',\n 'hideMarkersList'\n];\n\n/**\n * @override\n */\nPSVHUD.prototype.create = function() {\n PSVComponent.prototype.create.call(this);\n\n this.svgContainer = document.createElementNS(PSVUtils.svgNS, 'svg');\n this.svgContainer.setAttribute('class', 'psv-hud-svg-container');\n this.container.appendChild(this.svgContainer);\n\n // Markers events via delegation\n this.container.addEventListener('mouseenter', this, true);\n this.container.addEventListener('mouseleave', this, true);\n this.container.addEventListener('mousemove', this, true);\n\n // Viewer events\n this.psv.on('click', this);\n this.psv.on('dblclick', this);\n this.psv.on('render', this);\n this.psv.on('open-panel', this);\n this.psv.on('close-panel', this);\n};\n\n/**\n * @override\n */\nPSVHUD.prototype.destroy = function() {\n this.clearMarkers(false);\n\n this.container.removeEventListener('mouseenter', this);\n this.container.removeEventListener('mouseleave', this);\n this.container.removeEventListener('mousemove', this);\n\n this.psv.off('click', this);\n this.psv.off('dblclick', this);\n this.psv.off('render', this);\n this.psv.off('open-panel', this);\n this.psv.off('close-panel', this);\n\n delete this.svgContainer;\n\n PSVComponent.prototype.destroy.call(this);\n};\n\n/**\n * @summary Handles events\n * @param {Event} e\n * @private\n */\nPSVHUD.prototype.handleEvent = function(e) {\n switch (e.type) {\n // @formatter:off\n case 'mouseenter': this._onMouseEnter(e); break;\n case 'mouseleave': this._onMouseLeave(e); break;\n case 'mousemove': this._onMouseMove(e); break;\n case 'click': this._onClick(e.args[0], e, false); break;\n case 'dblclick': this._onClick(e.args[0], e, true); break;\n case 'render': this.renderMarkers(); break;\n case 'open-panel': this._onPanelOpened(); break;\n case 'close-panel': this._onPanelClosed(); break;\n // @formatter:on\n }\n};\n\n/**\n * @summary Adds a new marker to viewer\n * @param {Object} properties - see {@link http://photo-sphere-viewer.js.org/markers.html#config}\n * @param {boolean} [render=true] - renders the marker immediately\n * @returns {PSVMarker}\n * @throws {PSVError} when the marker's id is missing or already exists\n */\nPSVHUD.prototype.addMarker = function(properties, render) {\n if (!properties.id) {\n throw new PSVError('missing marker id');\n }\n\n if (this.markers[properties.id]) {\n throw new PSVError('marker \"' + properties.id + '\" already exists');\n }\n\n var marker = new PSVMarker(properties, this.psv);\n\n if (marker.isNormal()) {\n this.container.appendChild(marker.$el);\n }\n else {\n this.svgContainer.appendChild(marker.$el);\n }\n\n this.markers[marker.id] = marker;\n\n if (render !== false) {\n this.renderMarkers();\n }\n\n return marker;\n};\n\n/**\n * @summary Returns the internal marker object for a marker id\n * @param {*} markerId\n * @returns {PSVMarker}\n * @throws {PSVError} when the marker cannot be found\n */\nPSVHUD.prototype.getMarker = function(markerId) {\n var id = typeof markerId === 'object' ? markerId.id : markerId;\n\n if (!this.markers[id]) {\n throw new PSVError('cannot find marker \"' + id + '\"');\n }\n\n return this.markers[id];\n};\n\n/**\n * @summary Returns the last marker selected by the user\n * @returns {PSVMarker}\n */\nPSVHUD.prototype.getCurrentMarker = function() {\n return this.currentMarker;\n};\n\n/**\n * @summary Updates the existing marker with the same id\n * @description Every property can be changed but you can't change its type (Eg: `image` to `html`).\n * @param {Object|PSVMarker} properties\n * @param {boolean} [render=true] - renders the marker immediately\n * @returns {PSVMarker}\n */\nPSVHUD.prototype.updateMarker = function(properties, render) {\n var marker = this.getMarker(properties);\n\n marker.update(properties);\n\n if (render !== false) {\n this.renderMarkers();\n }\n\n return marker;\n};\n\n/**\n * @summary Removes a marker from the viewer\n * @param {*} marker\n * @param {boolean} [render=true] - renders the marker immediately\n */\nPSVHUD.prototype.removeMarker = function(marker, render) {\n marker = this.getMarker(marker);\n\n if (marker.isNormal()) {\n this.container.removeChild(marker.$el);\n }\n else {\n this.svgContainer.removeChild(marker.$el);\n }\n\n if (this.hoveringMarker === marker) {\n this.psv.tooltip.hideTooltip();\n }\n\n marker.destroy();\n delete this.markers[marker.id];\n\n if (render !== false) {\n this.renderMarkers();\n }\n};\n\n/**\n * @summary Removes all markers\n * @param {boolean} [render=true] - renders the markers immediately\n */\nPSVHUD.prototype.clearMarkers = function(render) {\n Object.keys(this.markers).forEach(function(marker) {\n this.removeMarker(marker, false);\n }, this);\n\n if (render !== false) {\n this.renderMarkers();\n }\n};\n\n/**\n * @summary Rotate the view to face the marker\n * @param {*} marker\n * @param {string|int} [duration] - rotates smoothy, see {@link PhotoSphereViewer#animate}\n * @fires module:components.PSVHUD.goto-marker-done\n * @return {Promise} A promise that will be resolved when the animation finishes\n */\nPSVHUD.prototype.gotoMarker = function(marker, duration) {\n marker = this.getMarker(marker);\n\n return this.psv.animate(marker, duration)\n .then(function() {\n /**\n * @event goto-marker-done\n * @memberof module:components.PSVHUD\n * @summary Triggered when the animation to a marker is done\n * @param {PSVMarker} marker\n */\n this.psv.trigger('goto-marker-done', marker);\n }.bind(this));\n};\n\n/**\n * @summary Hides a marker\n * @param {*} marker\n */\nPSVHUD.prototype.hideMarker = function(marker) {\n this.getMarker(marker).visible = false;\n this.renderMarkers();\n};\n\n/**\n * @summary Shows a marker\n * @param {*} marker\n */\nPSVHUD.prototype.showMarker = function(marker) {\n this.getMarker(marker).visible = true;\n this.renderMarkers();\n};\n\n/**\n * @summary Toggles a marker\n * @param {*} marker\n */\nPSVHUD.prototype.toggleMarker = function(marker) {\n this.getMarker(marker).visible ^= true;\n this.renderMarkers();\n};\n\n/**\n * @summary Toggles the visibility of markers list\n */\nPSVHUD.prototype.toggleMarkersList = function() {\n if (this.prop.panelOpened) {\n this.hideMarkersList();\n }\n else {\n this.showMarkersList();\n }\n};\n\n/**\n * @summary Opens side panel with list of markers\n * @fires module:components.PSVHUD.filter:render-markers-list\n */\nPSVHUD.prototype.showMarkersList = function() {\n var markers = [];\n PSVUtils.forEach(this.markers, function(marker) {\n markers.push(marker);\n });\n\n /**\n * @event filter:render-markers-list\n * @memberof module:components.PSVHUD\n * @summary Used to alter the list of markers displayed on the side-panel\n * @param {PSVMarker[]} markers\n * @returns {PSVMarker[]}\n */\n var html = this.psv.config.templates.markersList({\n markers: this.psv.change('render-markers-list', markers),\n config: this.psv.config\n });\n\n this.prop.panelOpening = true;\n this.psv.panel.showPanel(html, true);\n\n this.psv.panel.container.querySelector('.psv-markers-list').addEventListener('click', this._onClickItem.bind(this));\n};\n\n/**\n * @summary Closes side panel if it contains the list of markers\n */\nPSVHUD.prototype.hideMarkersList = function() {\n if (this.prop.panelOpened) {\n this.psv.panel.hidePanel();\n }\n};\n\n/**\n * @summary Updates the visibility and the position of all markers\n */\nPSVHUD.prototype.renderMarkers = function() {\n var rotation = !this.psv.isGyroscopeEnabled() ? 0 : THREE.Math.radToDeg(this.psv.camera.rotation.z);\n\n PSVUtils.forEach(this.markers, function(marker) {\n var isVisible = marker.visible;\n\n if (isVisible && marker.isPoly()) {\n var positions = this._getPolyPositions(marker);\n isVisible = positions.length > (marker.isPolygon() ? 2 : 1);\n\n if (isVisible) {\n marker.position2D = this._getPolyDimensions(marker, positions);\n\n var points = positions.map(function(pos) {\n return pos.x + ',' + pos.y;\n }).join(' ');\n\n marker.$el.setAttributeNS(null, 'points', points);\n }\n }\n else if (isVisible) {\n var position = this._getMarkerPosition(marker);\n isVisible = this._isMarkerVisible(marker, position);\n\n if (isVisible) {\n marker.position2D = position;\n\n var scale = marker.getScale(this.psv.getZoomLevel());\n\n if (marker.isSvg()) {\n marker.$el.setAttributeNS(null, 'transform',\n 'translate(' + position.x + ', ' + position.y + ')' +\n (scale !== 1 ? ' scale(' + scale + ', ' + scale + ')' : '') +\n (!marker.lockRotation && rotation ? ' rotate(' + rotation + ')' : '')\n );\n }\n else {\n marker.$el.style.transform = 'translate3D(' + position.x + 'px, ' + position.y + 'px, 0px)' +\n (scale !== 1 ? ' scale(' + scale + ', ' + scale + ')' : '') +\n (!marker.lockRotation && rotation ? ' rotateZ(' + rotation + 'deg)' : '');\n }\n }\n }\n\n PSVUtils.toggleClass(marker.$el, 'psv-marker--visible', isVisible);\n }.bind(this));\n};\n\n/**\n * @summary Determines if a point marker is visible<br>\n * It tests if the point is in the general direction of the camera, then check if it's in the viewport\n * @param {PSVMarker} marker\n * @param {PhotoSphereViewer.Point} position\n * @returns {boolean}\n * @private\n */\nPSVHUD.prototype._isMarkerVisible = function(marker, position) {\n return marker.position3D.dot(this.psv.prop.direction) > 0 &&\n position.x + marker.width >= 0 &&\n position.x - marker.width <= this.psv.prop.size.width &&\n position.y + marker.height >= 0 &&\n position.y - marker.height <= this.psv.prop.size.height;\n};\n\n/**\n * @summary Computes HUD coordinates of a marker\n * @param {PSVMarker} marker\n * @returns {PhotoSphereViewer.Point}\n * @private\n */\nPSVHUD.prototype._getMarkerPosition = function(marker) {\n if (marker._dynamicSize) {\n // make the marker visible to get it's size\n PSVUtils.toggleClass(marker.$el, 'psv-marker--transparent', true);\n var transform = marker.$el.style.transform;\n marker.$el.style.transform = null;\n\n var rect = marker.$el.getBoundingClientRect();\n\n marker.$el.style.transform = transform;\n PSVUtils.toggleClass(marker.$el, 'psv-marker--transparent', false);\n\n marker.width = rect.right - rect.left;\n marker.height = rect.bottom - rect.top;\n }\n\n var position = this.psv.vector3ToViewerCoords(marker.position3D);\n\n position.x -= marker.width * marker.anchor.left;\n position.y -= marker.height * marker.anchor.top;\n\n return position;\n};\n\n/**\n * @summary Computes HUD coordinates of each point of a polygon/polyline<br>\n * It handles points behind the camera by creating intermediary points suitable for the projector\n * @param {PSVMarker} marker\n * @returns {PhotoSphereViewer.Point[]}\n * @private\n */\nPSVHUD.prototype._getPolyPositions = function(marker) {\n var nbVectors = marker.positions3D.length;\n\n // compute if each vector is visible\n var positions3D = marker.positions3D.map(function(vector) {\n return {\n vector: vector,\n visible: vector.dot(this.psv.prop.direction) > 0\n };\n }, this);\n\n // get pairs of visible/invisible vectors for each invisible vector connected to a visible vector\n var toBeComputed = [];\n positions3D.forEach(function(pos, i) {\n if (!pos.visible) {\n var neighbours = [\n i === 0 ? positions3D[nbVectors - 1] : positions3D[i - 1],\n i === nbVectors - 1 ? positions3D[0] : positions3D[i + 1]\n ];\n\n neighbours.forEach(function(neighbour) {\n if (neighbour.visible) {\n toBeComputed.push({\n visible: neighbour,\n invisible: pos,\n index: i\n });\n }\n });\n }\n });\n\n // compute intermediary vector for each pair (the loop is reversed for splice to insert at the right place)\n toBeComputed.reverse().forEach(function(pair) {\n positions3D.splice(pair.index, 0, {\n vector: this._getPolyIntermediaryPoint(pair.visible.vector, pair.invisible.vector),\n visible: true\n });\n }, this);\n\n // translate vectors to screen pos\n return positions3D\n .filter(function(pos) {\n return pos.visible;\n })\n .map(function(pos) {\n return this.psv.vector3ToViewerCoords(pos.vector);\n }, this);\n};\n\n/**\n * Given one point in the same direction of the camera and one point behind the camera,\n * computes an intermediary point on the great circle delimiting the half sphere visible by the camera.\n * The point is shifted by .01 rad because the projector cannot handle points exactly on this circle.\n * {@link http://math.stackexchange.com/a/1730410/327208}\n * @param P1 {THREE.Vector3}\n * @param P2 {THREE.Vector3}\n * @returns {THREE.Vector3}\n * @private\n */\nPSVHUD.prototype._getPolyIntermediaryPoint = function(P1, P2) {\n var C = this.psv.prop.direction.clone().normalize();\n var N = new THREE.Vector3().crossVectors(P1, P2).normalize();\n var V = new THREE.Vector3().crossVectors(N, P1).normalize();\n var H = new THREE.Vector3().addVectors(P1.clone().multiplyScalar(-C.dot(V)), V.clone().multiplyScalar(C.dot(P1))).normalize();\n var a = new THREE.Vector3().crossVectors(H, C);\n return H.applyAxisAngle(a, 0.01).multiplyScalar(PhotoSphereViewer.SPHERE_RADIUS);\n};\n\n/**\n * @summary Computes the boundaries positions of a polygon/polyline marker\n * @param {PSVMarker} marker - alters width and height\n * @param {PhotoSphereViewer.Point[]} positions\n * @returns {PhotoSphereViewer.Point}\n * @private\n */\nPSVHUD.prototype._getPolyDimensions = function(marker, positions) {\n var minX = +Infinity;\n var minY = +Infinity;\n var maxX = -Infinity;\n var maxY = -Infinity;\n\n positions.forEach(function(pos) {\n minX = Math.min(minX, pos.x);\n minY = Math.min(minY, pos.y);\n maxX = Math.max(maxX, pos.x);\n maxY = Math.max(maxY, pos.y);\n });\n\n marker.width = maxX - minX;\n marker.height = maxY - minY;\n\n return {\n x: minX,\n y: minY\n };\n};\n\n/**\n * @summary Handles mouse enter events, show the tooltip for non polygon markers\n * @param {MouseEvent} e\n * @fires module:components.PSVHUD.over-marker\n * @private\n */\nPSVHUD.prototype._onMouseEnter = function(e) {\n var marker;\n if (e.target && (marker = e.target.psvMarker) && !marker.isPoly()) {\n this.hoveringMarker = marker;\n\n /**\n * @event over-marker\n * @memberof module:components.PSVHUD\n * @summary Triggered when the user puts the cursor hover a marker\n * @param {PSVMarker} marker\n */\n this.psv.trigger('over-marker', marker);\n\n if (marker.tooltip) {\n this.psv.tooltip.showTooltip({\n content: marker.tooltip.content,\n position: marker.tooltip.position,\n left: marker.position2D.x,\n top: marker.position2D.y,\n box: {\n width: marker.width,\n height: marker.height\n }\n });\n }\n }\n};\n\n/**\n * @summary Handles mouse leave events, hide the tooltip\n * @param {MouseEvent} e\n * @fires module:components.PSVHUD.leave-marker\n * @private\n */\nPSVHUD.prototype._onMouseLeave = function(e) {\n var marker;\n if (e.target && (marker = e.target.psvMarker)) {\n // do not hide if we enter the tooltip itself while hovering a polygon\n if (marker.isPoly() && e.relatedTarget && PSVUtils.hasParent(e.relatedTarget, this.psv.tooltip.container)) {\n return;\n }\n\n /**\n * @event leave-marker\n * @memberof module:components.PSVHUD\n * @summary Triggered when the user puts the cursor away from a marker\n * @param {PSVMarker} marker\n */\n this.psv.trigger('leave-marker', marker);\n\n this.hoveringMarker = null;\n\n this.psv.tooltip.hideTooltip();\n }\n};\n\n/**\n * @summary Handles mouse move events, refresh the tooltip for polygon markers\n * @param {MouseEvent} e\n * @fires module:components.PSVHUD.leave-marker\n * @fires module:components.PSVHUD.over-marker\n * @private\n */\nPSVHUD.prototype._onMouseMove = function(e) {\n if (!this.psv.prop.moving) {\n var marker;\n\n // do not hide if we enter the tooltip itself while hovering a polygon\n if (e.target && (marker = e.target.psvMarker) && marker.isPoly() ||\n e.target && PSVUtils.hasParent(e.target, this.psv.tooltip.container) && (marker = this.hoveringMarker)) {\n\n if (!this.hoveringMarker) {\n this.psv.trigger('over-marker', marker);\n\n this.hoveringMarker = marker;\n }\n\n var boundingRect = this.psv.container.getBoundingClientRect();\n\n if (marker.tooltip) {\n this.psv.tooltip.showTooltip({\n content: marker.tooltip.content,\n position: marker.tooltip.position,\n top: e.clientY - boundingRect.top - this.psv.config.tooltip.arrow_size / 2,\n left: e.clientX - boundingRect.left - this.psv.config.tooltip.arrow_size,\n box: { // separate the tooltip from the cursor\n width: this.psv.config.tooltip.arrow_size * 2,\n height: this.psv.config.tooltip.arrow_size * 2\n }\n });\n }\n }\n else if (this.hoveringMarker && this.hoveringMarker.isPoly()) {\n this.psv.trigger('leave-marker', this.hoveringMarker);\n\n this.hoveringMarker = null;\n\n this.psv.tooltip.hideTooltip();\n }\n }\n};\n\n/**\n * @summary Handles mouse click events, select the marker and open the panel if necessary\n * @param {Object} data\n * @param {Event} e\n * @param {boolean} dblclick\n * @fires module:components.PSVHUD.select-marker\n * @fires module:components.PSVHUD.unselect-marker\n * @private\n */\nPSVHUD.prototype._onClick = function(data, e, dblclick) {\n var marker;\n if (data.target && (marker = PSVUtils.getClosest(data.target, '.psv-marker')) && marker.psvMarker) {\n this.currentMarker = marker.psvMarker;\n\n /**\n * @event select-marker\n * @memberof module:components.PSVHUD\n * @summary Triggered when the user clicks on a marker. The marker can be retrieved from outside the event handler\n * with {@link module:components.PSVHUD.getCurrentMarker}\n * @param {PSVMarker} marker\n * @param {boolean} dblclick - the simple click is always fired before the double click\n */\n this.psv.trigger('select-marker', this.currentMarker, dblclick);\n\n if (this.psv.config.click_event_on_marker) {\n // add the marker to event data\n data.marker = marker.psvMarker;\n }\n else {\n e.stopPropagation();\n }\n }\n else if (this.currentMarker) {\n /**\n * @event unselect-marker\n * @memberof module:components.PSVHUD\n * @summary Triggered when a marker was selected and the user clicks elsewhere\n * @param {PSVMarker} marker\n */\n this.psv.trigger('unselect-marker', this.currentMarker);\n\n this.currentMarker = null;\n }\n\n if (marker && marker.psvMarker && marker.psvMarker.content) {\n this.psv.panel.showPanel(marker.psvMarker.content);\n }\n else if (this.psv.panel.prop.opened) {\n e.stopPropagation();\n this.psv.panel.hidePanel();\n }\n};\n\n/**\n * @summary Clicks on an item\n * @param {MouseEvent} e\n * @fires module:components.PSVHUD.select-marker-list\n * @private\n */\nPSVHUD.prototype._onClickItem = function(e) {\n var li;\n if (e.target && (li = PSVUtils.getClosest(e.target, 'li')) && li.dataset.psvMarker) {\n var marker = this.getMarker(li.dataset.psvMarker);\n\n /**\n * @event select-marker-list\n * @memberof module:components.PSVHUD\n * @summary Triggered when a marker is selected from the side panel\n * @param {PSVMarker} marker\n */\n this.psv.trigger('select-marker-list', marker);\n\n this.gotoMarker(marker, 1000);\n this.psv.panel.hidePanel();\n }\n};\n\n/**\n * @summary Updates status when the panel is updated\n * @private\n */\nPSVHUD.prototype._onPanelOpened = function() {\n if (this.prop.panelOpening) {\n this.prop.panelOpening = false;\n this.prop.panelOpened = true;\n }\n else {\n this.prop.panelOpened = false;\n }\n\n if (this.prop.markersButton) {\n this.prop.markersButton.toggleActive(this.prop.panelOpened);\n }\n};\n\n/**\n * @summary Updates status when the panel is updated\n * @private\n */\nPSVHUD.prototype._onPanelClosed = function() {\n this.prop.panelOpened = false;\n this.prop.panelOpening = false;\n\n if (this.prop.markersButton) {\n this.prop.markersButton.toggleActive(false);\n }\n};\n\n\n/**\n * Loader class\n * @param {PhotoSphereViewer} psv\n * @constructor\n * @extends module:components.PSVComponent\n * @memberof module:components\n */\nfunction PSVLoader(psv) {\n PSVComponent.call(this, psv);\n\n /**\n * @summary Animation canvas\n * @member {HTMLCanvasElement}\n * @readonly\n * @private\n */\n this.canvas = null;\n\n /**\n * @summary Inner container for vertical center\n * @member {HTMLElement}\n * @readonly\n * @private\n */\n this.loader = null;\n\n this.create();\n}\n\nPSVLoader.prototype = Object.create(PSVComponent.prototype);\nPSVLoader.prototype.constructor = PSVLoader;\n\nPSVLoader.className = 'psv-loader-container';\n\n/**\n * @override\n */\nPSVLoader.prototype.create = function() {\n PSVComponent.prototype.create.call(this);\n\n var pixelRatio = PhotoSphereViewer.SYSTEM.pixelRatio;\n\n this.loader = document.createElement('div');\n this.loader.className = 'psv-loader';\n this.container.appendChild(this.loader);\n\n this.canvas = document.createElement('canvas');\n this.canvas.className = 'psv-loader-canvas';\n\n this.canvas.width = this.loader.clientWidth * pixelRatio;\n this.canvas.height = this.loader.clientWidth * pixelRatio;\n this.loader.appendChild(this.canvas);\n\n this.tickness = (this.loader.offsetWidth - this.loader.clientWidth) / 2 * pixelRatio;\n\n var inner;\n if (this.psv.config.loading_img) {\n inner = document.createElement('img');\n inner.className = 'psv-loader-image';\n inner.src = this.psv.config.loading_img;\n }\n else if (this.psv.config.loading_txt) {\n inner = document.createElement('div');\n inner.className = 'psv-loader-text';\n inner.innerHTML = this.psv.config.loading_txt;\n }\n if (inner) {\n var a = Math.round(Math.sqrt(2 * Math.pow((this.canvas.width / 2 - this.tickness / 2) / pixelRatio, 2)));\n inner.style.maxWidth = a + 'px';\n inner.style.maxHeight = a + 'px';\n this.loader.appendChild(inner);\n }\n};\n\n/**\n * @override\n */\nPSVLoader.prototype.destroy = function() {\n delete this.loader;\n delete this.canvas;\n\n PSVComponent.prototype.destroy.call(this);\n};\n\n/**\n * @summary Sets the loader progression\n * @param {int} value - from 0 to 100\n */\nPSVLoader.prototype.setProgress = function(value) {\n var context = this.canvas.getContext('2d');\n\n context.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n context.lineWidth = this.tickness;\n context.strokeStyle = PSVUtils.getStyle(this.loader, 'color');\n\n context.beginPath();\n context.arc(\n this.canvas.width / 2, this.canvas.height / 2,\n this.canvas.width / 2 - this.tickness / 2,\n -Math.PI / 2, value / 100 * 2 * Math.PI - Math.PI / 2\n );\n context.stroke();\n};\n\n\n/**\n * Navigation bar class\n * @param {PhotoSphereViewer} psv\n * @constructor\n * @extends module:components.PSVComponent\n * @memberof module:components\n */\nfunction PSVNavBar(psv) {\n PSVComponent.call(this, psv);\n\n /**\n * @member {Object}\n * @readonly\n * @private\n */\n this.config = this.psv.config.navbar;\n\n /**\n * @summary List of buttons of the navbar\n * @member {Array.<module:components/buttons.PSVNavBarButton>}\n * @readonly\n */\n this.items = [];\n\n // all buttons\n if (this.config === true) {\n this.config = PSVUtils.clone(PhotoSphereViewer.DEFAULTS.navbar);\n }\n // space separated list\n else if (typeof this.config === 'string') {\n this.config = this.config.split(' ');\n }\n // migration from object\n else if (!Array.isArray(this.config)) {\n console.warn('PhotoSphereViewer: hashmap form of \"navbar\" is deprecated, use an array instead.');\n\n var config = this.config;\n this.config = [];\n\n PSVUtils.forEach(config, function(enabled, key) {\n if (enabled) {\n this.config.push(key);\n }\n }.bind(this));\n\n this.config.sort(function(a, b) {\n return PhotoSphereViewer.DEFAULTS.navbar.indexOf(a) - PhotoSphereViewer.DEFAULTS.navbar.indexOf(b);\n });\n }\n\n this.create();\n}\n\nPSVNavBar.prototype = Object.create(PSVComponent.prototype);\nPSVNavBar.prototype.constructor = PSVNavBar;\n\nPSVNavBar.className = 'psv-navbar psv-navbar--open';\nPSVNavBar.publicMethods = ['showNavbar', 'hideNavbar', 'toggleNavbar', 'getNavbarButton'];\n\n/**\n * @override\n * @throws {PSVError} when the configuration is incorrect\n */\nPSVNavBar.prototype.create = function() {\n PSVComponent.prototype.create.call(this);\n\n this.config.forEach(function(button) {\n if (typeof button === 'object') {\n this.items.push(new PSVNavBarCustomButton(this, button));\n }\n else {\n switch (button) {\n case PSVNavBarAutorotateButton.id:\n this.items.push(new PSVNavBarAutorotateButton(this));\n break;\n\n case PSVNavBarZoomButton.id:\n this.items.push(new PSVNavBarZoomButton(this));\n break;\n\n case PSVNavBarDownloadButton.id:\n this.items.push(new PSVNavBarDownloadButton(this));\n break;\n\n case PSVNavBarMarkersButton.id:\n this.items.push(new PSVNavBarMarkersButton(this));\n break;\n\n case PSVNavBarFullscreenButton.id:\n this.items.push(new PSVNavBarFullscreenButton(this));\n break;\n\n case PSVNavBarGyroscopeButton.id:\n if (this.psv.config.gyroscope) {\n this.items.push(new PSVNavBarGyroscopeButton(this));\n }\n break;\n\n case 'caption':\n this.items.push(new PSVNavBarCaption(this, this.psv.config.caption));\n break;\n\n case 'spacer':\n button = 'spacer-5';\n /* falls through */\n default:\n var matches = button.match(/^spacer\\-([0-9]+)$/);\n if (matches !== null) {\n this.items.push(new PSVNavBarSpacer(this, matches[1]));\n }\n else {\n throw new PSVError('Unknown button ' + button);\n }\n break;\n }\n }\n }, this);\n};\n\n/**\n * @override\n */\nPSVNavBar.prototype.destroy = function() {\n this.items.forEach(function(item) {\n item.destroy();\n });\n\n delete this.items;\n delete this.config;\n\n PSVComponent.prototype.destroy.call(this);\n};\n\n/**\n * @summary Returns a button by its identifier\n * @param {string} id\n * @param {boolean} [silent=false]\n * @returns {module:components/buttons.PSVNavBarButton}\n */\nPSVNavBar.prototype.getNavbarButton = function(id, silent) {\n var button = null;\n\n this.items.some(function(item) {\n if (item.id === id) {\n button = item;\n return true;\n }\n else {\n return false;\n }\n });\n\n if (!button && !silent) {\n console.warn('PhotoSphereViewer: button \"' + id + '\" not found in the navbar.');\n }\n\n return button;\n};\n\n/**\n * @summary Shows the navbar\n */\nPSVNavBar.prototype.showNavbar = function() {\n this.toggleNavbar(true);\n};\n\n/**\n * @summary Hides the navbar\n */\nPSVNavBar.prototype.hideNavbar = function() {\n this.toggleNavbar(false);\n};\n\n/**\n * @summary Toggles the navbar\n * @param {boolean} active\n */\nPSVNavBar.prototype.toggleNavbar = function(active) {\n PSVUtils.toggleClass(this.container, 'psv-navbar--open', active);\n};\n\n\n/**\n * Navbar caption class\n * @param {PSVNavBar} navbar\n * @param {string} caption\n * @constructor\n * @extends module:components.PSVComponent\n * @memberof module:components\n */\nfunction PSVNavBarCaption(navbar, caption) {\n PSVComponent.call(this, navbar);\n\n this.create();\n\n this.setCaption(caption);\n}\n\nPSVNavBarCaption.prototype = Object.create(PSVComponent.prototype);\nPSVNavBarCaption.prototype.constructor = PSVNavBarCaption;\n\nPSVNavBarCaption.className = 'psv-caption';\nPSVNavBarCaption.publicMethods = ['setCaption'];\n\n/**\n * @summary Sets the bar caption\n * @param {string} html\n */\nPSVNavBarCaption.prototype.setCaption = function(html) {\n if (!html) {\n this.container.innerHTML = '';\n }\n else {\n this.container.innerHTML = html;\n }\n};\n\n\n/**\n * Navbar spacer class\n * @param {PSVNavBar} navbar\n * @param {int} [weight=5]\n * @constructor\n * @extends module:components.PSVComponent\n * @memberof module:components\n */\nfunction PSVNavBarSpacer(navbar, weight) {\n PSVComponent.call(this, navbar);\n\n /**\n * @member {int}\n * @readonly\n */\n this.weight = weight || 5;\n\n this.create();\n\n this.container.classList.add('psv-spacer--weight-' + this.weight);\n}\n\nPSVNavBarSpacer.prototype = Object.create(PSVComponent.prototype);\nPSVNavBarSpacer.prototype.constructor = PSVNavBarSpacer;\n\nPSVNavBarSpacer.className = 'psv-spacer';\n\n\n/**\n * Panel class\n * @param {PhotoSphereViewer} psv\n * @constructor\n * @extends module:components.PSVComponent\n * @memberof module:components\n */\nfunction PSVPanel(psv) {\n PSVComponent.call(this, psv);\n\n /**\n * @summary Content container\n * @member {HTMLElement}\n * @readonly\n * @private\n */\n this.content = null;\n\n /**\n * @member {Object}\n * @private\n */\n this.prop = {\n mouse_x: 0,\n mouse_y: 0,\n mousedown: false,\n opened: false\n };\n\n this.create();\n}\n\nPSVPanel.prototype = Object.create(PSVComponent.prototype);\nPSVPanel.prototype.constructor = PSVPanel;\n\nPSVPanel.className = 'psv-panel';\nPSVPanel.publicMethods = ['showPanel', 'hidePanel'];\n\n/**\n * @override\n */\nPSVPanel.prototype.create = function() {\n PSVComponent.prototype.create.call(this);\n\n this.container.innerHTML =\n '<div class=\"psv-panel-resizer\"></div>' +\n '<div class=\"psv-panel-close-button\"></div>' +\n '<div class=\"psv-panel-content\"></div>';\n\n this.content = this.container.querySelector('.psv-panel-content');\n\n var closeBtn = this.container.querySelector('.psv-panel-close-button');\n closeBtn.addEventListener('click', this.hidePanel.bind(this));\n\n // Stop event bubling from panel\n if (this.psv.config.mousewheel) {\n this.container.addEventListener(PhotoSphereViewer.SYSTEM.mouseWheelEvent, function(e) {\n e.stopPropagation();\n });\n }\n\n // Event for panel resizing + stop bubling\n var resizer = this.container.querySelector('.psv-panel-resizer');\n resizer.addEventListener('mousedown', this);\n resizer.addEventListener('touchstart', this);\n this.psv.container.addEventListener('mouseup', this);\n this.psv.container.addEventListener('touchend', this);\n this.psv.container.addEventListener('mousemove', this);\n this.psv.container.addEventListener('touchmove', this);\n};\n\n/**\n * @override\n */\nPSVPanel.prototype.destroy = function() {\n this.psv.container.removeEventListener('mousemove', this);\n this.psv.container.removeEventListener('touchmove', this);\n this.psv.container.removeEventListener('mouseup', this);\n this.psv.container.removeEventListener('touchend', this);\n\n delete this.prop;\n delete this.content;\n\n PSVComponent.prototype.destroy.call(this);\n};\n\n/**\n * @summary Handles events\n * @param {Event} e\n * @private\n */\nPSVPanel.prototype.handleEvent = function(e) {\n switch (e.type) {\n // @formatter:off\n case 'mousedown': this._onMouseDown(e); break;\n case 'touchstart': this._onTouchStart(e); break;\n case 'mousemove': this._onMouseMove(e); break;\n case 'touchmove': this._onTouchMove(e); break;\n case 'mouseup': this._onMouseUp(e); break;\n case 'touchend': this._onMouseUp(e); break;\n // @formatter:on\n }\n};\n\n/**\n * @summary Shows the panel\n * @param {string} content\n * @param {boolean} [noMargin=false]\n * @fires module:components.PSVPanel.open-panel\n */\nPSVPanel.prototype.showPanel = function(content, noMargin) {\n this.content.innerHTML = content;\n this.content.scrollTop = 0;\n this.container.classList.add('psv-panel--open');\n\n PSVUtils.toggleClass(this.content, 'psv-panel-content--no-margin', noMargin === true);\n\n this.prop.opened = true;\n\n /**\n * @event open-panel\n * @memberof module:components.PSVPanel\n * @summary Triggered when the panel is opened\n */\n this.psv.trigger('open-panel');\n};\n\n/**\n * @summary Hides the panel\n * @fires module:components.PSVPanel.close-panel\n */\nPSVPanel.prototype.hidePanel = function() {\n this.content.innerHTML = null;\n this.prop.opened = false;\n this.container.classList.remove('psv-panel--open');\n\n /**\n * @event close-panel\n * @memberof module:components.PSVPanel\n * @summary Trigered when the panel is closed\n */\n this.psv.trigger('close-panel');\n};\n\n/**\n * @summary Handles mouse down events\n * @param {MouseEvent} evt\n * @private\n */\nPSVPanel.prototype._onMouseDown = function(evt) {\n evt.stopPropagation();\n this._startResize(evt);\n};\n\n/**\n * @summary Handles touch events\n * @param {TouchEvent} evt\n * @private\n */\nPSVPanel.prototype._onTouchStart = function(evt) {\n evt.stopPropagation();\n this._startResize(evt.changedTouches[0]);\n};\n\n/**\n * @summary Handles mouse up events\n * @param {MouseEvent} evt\n * @private\n */\nPSVPanel.prototype._onMouseUp = function(evt) {\n if (this.prop.mousedown) {\n evt.stopPropagation();\n this.prop.mousedown = false;\n this.content.classList.remove('psv-panel-content--no-interaction');\n }\n};\n\n/**\n * @summary Handles mouse move events\n * @param {MouseEvent} evt\n * @private\n */\nPSVPanel.prototype._onMouseMove = function(evt) {\n if (this.prop.mousedown) {\n evt.stopPropagation();\n this._resize(evt);\n }\n};\n\n/**\n * @summary Handles touch move events\n * @param {TouchEvent} evt\n * @private\n */\nPSVPanel.prototype._onTouchMove = function(evt) {\n if (this.prop.mousedown) {\n this._resize(evt.touches[0]);\n }\n};\n\n/**\n * @summary Initializes the panel resize\n * @param {MouseEvent|Touch} evt\n * @private\n */\nPSVPanel.prototype._startResize = function(evt) {\n this.prop.mouse_x = parseInt(evt.clientX);\n this.prop.mouse_y = parseInt(evt.clientY);\n this.prop.mousedown = true;\n this.content.classList.add('psv-panel-content--no-interaction');\n};\n\n/**\n * @summary Resizes the panel\n * @param {MouseEvent|Touch} evt\n * @private\n */\nPSVPanel.prototype._resize = function(evt) {\n var x = parseInt(evt.clientX);\n var y = parseInt(evt.clientY);\n\n this.container.style.width = (this.container.offsetWidth - (x - this.prop.mouse_x)) + 'px';\n\n this.prop.mouse_x = x;\n this.prop.mouse_y = y;\n};\n\n\n/**\n * Tooltip class\n * @param {module:components.PSVHUD} hud\n * @constructor\n * @extends module:components.PSVComponent\n * @memberof module:components\n */\nfunction PSVTooltip(hud) {\n PSVComponent.call(this, hud);\n\n /**\n * @member {Object}\n * @readonly\n * @private\n */\n this.config = this.psv.config.tooltip;\n\n /**\n * @member {Object}\n * @private\n */\n this.prop = {\n timeout: null\n };\n\n this.create();\n}\n\nPSVTooltip.prototype = Object.create(PSVComponent.prototype);\nPSVTooltip.prototype.constructor = PSVTooltip;\n\nPSVTooltip.className = 'psv-tooltip';\nPSVTooltip.publicMethods = ['showTooltip', 'hideTooltip', 'isTooltipVisible'];\n\nPSVTooltip.leftMap = { 0: 'left', 0.5: 'center', 1: 'right' };\nPSVTooltip.topMap = { 0: 'top', 0.5: 'center', 1: 'bottom' };\n\n/**\n * @override\n */\nPSVTooltip.prototype.create = function() {\n PSVComponent.prototype.create.call(this);\n\n this.container.innerHTML = '<div class=\"psv-tooltip-arrow\"></div><div class=\"psv-tooltip-content\"></div>';\n this.container.style.top = '-1000px';\n this.container.style.left = '-1000px';\n\n this.content = this.container.querySelector('.psv-tooltip-content');\n this.arrow = this.container.querySelector('.psv-tooltip-arrow');\n\n this.psv.on('render', this);\n};\n\n/**\n * @override\n */\nPSVTooltip.prototype.destroy = function() {\n this.psv.off('render', this);\n\n delete this.config;\n delete this.prop;\n\n PSVComponent.prototype.destroy.call(this);\n};\n\n/**\n * @summary Handles events\n * @param {Event} e\n * @private\n */\nPSVTooltip.prototype.handleEvent = function(e) {\n switch (e.type) {\n // @formatter:off\n case 'render': this.hideTooltip(); break;\n // @formatter:on\n }\n};\n\n/**\n * @summary Checks if the tooltip is visible\n * @returns {boolean}\n */\nPSVTooltip.prototype.isTooltipVisible = function() {\n return this.container.classList.contains('psv-tooltip--visible');\n};\n\n/**\n * @summary Displays a tooltip on the viewer\n * @param {Object} config\n * @param {string} config.content - HTML content of the tootlip\n * @param {int} config.top - Position of the tip of the arrow of the tooltip, in pixels\n * @param {int} config.left - Position of the tip of the arrow of the tooltip, in pixels\n * @param {string} [config.position='top center'] - Tooltip position toward it's arrow tip.\n * Accepted values are combinations of `top`, `center`, `bottom`\n * and `left`, `center`, `right`\n * @param {string} [config.className] - Additional CSS class added to the tooltip\n * @param {Object} [config.box] - Used when displaying a tooltip on a marker\n * @param {int} [config.box.width=0]\n * @param {int} [config.box.height=0]\n * @fires module:components.PSVTooltip.show-tooltip\n * @throws {PSVError} when the configuration is incorrect\n *\n * @example\n * viewer.showTooltip({ content: 'Hello world', top: 200, left: 450, position: 'center bottom'})\n */\nPSVTooltip.prototype.showTooltip = function(config) {\n if (this.prop.timeout) {\n window.clearTimeout(this.prop.timeout);\n this.prop.timeout = null;\n }\n\n var isUpdate = this.isTooltipVisible();\n var t = this.container;\n var c = this.content;\n var a = this.arrow;\n\n if (!config.position) {\n config.position = ['top', 'center'];\n }\n\n if (!config.box) {\n config.box = {\n width: 0,\n height: 0\n };\n }\n\n // parse position\n if (typeof config.position === 'string') {\n var tempPos = PSVUtils.parsePosition(config.position);\n\n if (!(tempPos.left in PSVTooltip.leftMap) || !(tempPos.top in PSVTooltip.topMap)) {\n throw new PSVError('unable to parse tooltip position \"' + config.position + '\"');\n }\n\n config.position = [PSVTooltip.topMap[tempPos.top], PSVTooltip.leftMap[tempPos.left]];\n }\n\n if (config.position[0] === 'center' && config.position[1] === 'center') {\n throw new PSVError('unable to parse tooltip position \"center center\"');\n }\n\n if (isUpdate) {\n // Remove every other classes (Firefox does not implements forEach)\n for (var i = t.classList.length - 1; i >= 0; i--) {\n var item = t.classList.item(i);\n if (item !== 'psv-tooltip' && item !== 'psv-tooltip--visible') {\n t.classList.remove(item);\n }\n }\n }\n else {\n t.className = 'psv-tooltip'; // reset the class\n }\n\n if (config.className) {\n PSVUtils.addClasses(t, config.className);\n }\n\n c.innerHTML = config.content;\n t.style.top = '0px';\n t.style.left = '0px';\n\n // compute size\n var rect = t.getBoundingClientRect();\n var style = {\n posClass: config.position.slice(),\n width: rect.right - rect.left,\n height: rect.bottom - rect.top,\n top: 0,\n left: 0,\n arrow_top: 0,\n arrow_left: 0\n };\n\n // set initial position\n this._computeTooltipPosition(style, config);\n\n // correct position if overflow\n var refresh = false;\n if (style.top < this.config.offset) {\n style.posClass[0] = 'bottom';\n refresh = true;\n }\n else if (style.top + style.height > this.psv.prop.size.height - this.config.offset) {\n style.posClass[0] = 'top';\n refresh = true;\n }\n if (style.left < this.config.offset) {\n style.posClass[1] = 'right';\n refresh = true;\n }\n else if (style.left + style.width > this.psv.prop.size.width - this.config.offset) {\n style.posClass[1] = 'left';\n refresh = true;\n }\n if (refresh) {\n this._computeTooltipPosition(style, config);\n }\n\n // apply position\n t.style.top = style.top + 'px';\n t.style.left = style.left + 'px';\n\n a.style.top = style.arrow_top + 'px';\n a.style.left = style.arrow_left + 'px';\n\n t.classList.add('psv-tooltip--' + style.posClass.join('-'));\n\n // delay for correct transition between the two classes\n if (!isUpdate) {\n this.prop.timeout = window.setTimeout(function() {\n t.classList.add('psv-tooltip--visible');\n this.prop.timeout = null;\n\n /**\n * @event show-tooltip\n * @memberof module:components.PSVTooltip\n * @summary Trigered when the tooltip is shown\n */\n this.psv.trigger('show-tooltip');\n }.bind(this), this.config.delay);\n }\n};\n\n/**\n * @summary Hides the tooltip\n * @fires module:components.PSVTooltip.hide-tooltip\n */\nPSVTooltip.prototype.hideTooltip = function() {\n if (this.prop.timeout) {\n window.clearTimeout(this.prop.timeout);\n this.prop.timeout = null;\n }\n\n if (this.isTooltipVisible()) {\n this.container.classList.remove('psv-tooltip--visible');\n\n this.prop.timeout = window.setTimeout(function() {\n this.content.innerHTML = null;\n this.container.style.top = '-1000px';\n this.container.style.left = '-1000px';\n this.prop.timeout = null;\n }.bind(this), this.config.delay);\n\n /**\n * @event hide-tooltip\n * @memberof module:components.PSVTooltip\n * @summary Trigered when the tooltip is hidden\n */\n this.psv.trigger('hide-tooltip');\n }\n};\n\n/**\n * @summary Computes the position of the tooltip and its arrow\n * @param {Object} style\n * @param {Object} config\n * @private\n */\nPSVTooltip.prototype._computeTooltipPosition = function(style, config) {\n var topBottom = false;\n\n switch (style.posClass[0]) {\n case 'bottom':\n style.top = config.top + config.box.height + this.config.offset + this.config.arrow_size;\n style.arrow_top = -this.config.arrow_size * 2;\n topBottom = true;\n break;\n\n case 'center':\n style.top = config.top + config.box.height / 2 - style.height / 2;\n style.arrow_top = style.height / 2 - this.config.arrow_size;\n break;\n\n case 'top':\n style.top = config.top - style.height - this.config.offset - this.config.arrow_size;\n style.arrow_top = style.height;\n topBottom = true;\n break;\n }\n\n switch (style.posClass[1]) {\n case 'right':\n if (topBottom) {\n style.left = config.left + config.box.width / 2 - this.config.offset - this.config.arrow_size;\n style.arrow_left = this.config.offset;\n }\n else {\n style.left = config.left + config.box.width + this.config.offset + this.config.arrow_size;\n style.arrow_left = -this.config.arrow_size * 2;\n }\n break;\n\n case 'center':\n style.left = config.left + config.box.width / 2 - style.width / 2;\n style.arrow_left = style.width / 2 - this.config.arrow_size;\n break;\n\n case 'left':\n if (topBottom) {\n style.left = config.left - style.width + config.box.width / 2 + this.config.offset + this.config.arrow_size;\n style.arrow_left = style.width - this.config.offset - this.config.arrow_size * 2;\n }\n else {\n style.left = config.left - style.width - this.config.offset - this.config.arrow_size;\n style.arrow_left = style.width;\n }\n break;\n }\n};\n\n\n/**\n * @module components/buttons\n */\n\n/**\n * Navigation bar button class\n * @param {module:components.PSVNavBar} navbar\n * @constructor\n * @extends module:components.PSVComponent\n * @memberof module:components/buttons\n */\nfunction PSVNavBarButton(navbar) {\n PSVComponent.call(this, navbar);\n\n /**\n * @summary Unique identifier of the button\n * @member {string}\n * @readonly\n */\n this.id = undefined;\n\n if (this.constructor.id) {\n this.id = this.constructor.id;\n }\n\n /**\n * @summary State of the button\n * @member {boolean}\n * @readonly\n */\n this.enabled = true;\n}\n\nPSVNavBarButton.prototype = Object.create(PSVComponent.prototype);\nPSVNavBarButton.prototype.constructor = PSVNavBarButton;\n\n/**\n * @summary Unique identifier of the button\n * @member {string}\n * @readonly\n */\nPSVNavBarButton.id = null;\n\n/**\n * @summary SVG icon name injected in the button\n * @member {string}\n * @readonly\n */\nPSVNavBarButton.icon = null;\n\n/**\n * @summary SVG icon name injected in the button when it is active\n * @member {string}\n * @readonly\n */\nPSVNavBarButton.iconActive = null;\n\n/**\n * @summary Creates the button\n * @protected\n */\nPSVNavBarButton.prototype.create = function() {\n PSVComponent.prototype.create.call(this);\n\n if (this.constructor.icon) {\n this._setIcon(this.constructor.icon);\n }\n\n if (this.id && this.psv.config.lang[this.id]) {\n this.container.title = this.psv.config.lang[this.id];\n }\n\n this.container.addEventListener('click', function(e) {\n if (this.enabled) {\n this._onClick();\n }\n e.stopPropagation();\n }.bind(this));\n};\n\n/**\n * @summary Destroys the button\n * @protected\n */\nPSVNavBarButton.prototype.destroy = function() {\n PSVComponent.prototype.destroy.call(this);\n};\n\n/**\n * @summary Changes the active state of the button\n * @param {boolean} [active] - forced state\n */\nPSVNavBarButton.prototype.toggleActive = function(active) {\n PSVUtils.toggleClass(this.container, 'psv-button--active', active);\n\n if (this.constructor.iconActive) {\n this._setIcon(active ? this.constructor.iconActive : this.constructor.icon);\n }\n};\n\n/**\n * @summary Disables the button\n */\nPSVNavBarButton.prototype.disable = function() {\n this.container.classList.add('psv-button--disabled');\n\n this.enabled = false;\n};\n\n/**\n * @summary Enables the button\n */\nPSVNavBarButton.prototype.enable = function() {\n this.container.classList.remove('psv-button--disabled');\n\n this.enabled = true;\n};\n\n/**\n * @summary Set the button icon from {@link PhotoSphereViewer.ICONS}\n * @param {string} icon\n * @param {HTMLElement} [container] - default is the main button container\n * @private\n */\nPSVNavBarButton.prototype._setIcon = function(icon, container) {\n if (!container) {\n container = this.container;\n }\n if (icon) {\n container.innerHTML = PhotoSphereViewer.ICONS[icon];\n // classList not supported on IE11, className is read-only !!!!\n container.querySelector('svg').setAttribute('class', 'psv-button-svg');\n }\n else {\n container.innerHTML = '';\n }\n};\n\n/**\n * @summary Action when the button is clicked\n * @private\n * @abstract\n */\nPSVNavBarButton.prototype._onClick = function() {\n\n};\n\n\n/**\n * Navigation bar autorotate button class\n * @param {module:components.PSVNavBar} navbar\n * @constructor\n * @extends module:components/buttons.PSVNavBarButton\n * @memberof module:components/buttons\n */\nfunction PSVNavBarAutorotateButton(navbar) {\n PSVNavBarButton.call(this, navbar);\n\n this.create();\n}\n\nPSVNavBarAutorotateButton.prototype = Object.create(PSVNavBarButton.prototype);\nPSVNavBarAutorotateButton.prototype.constructor = PSVNavBarAutorotateButton;\n\nPSVNavBarAutorotateButton.id = 'autorotate';\nPSVNavBarAutorotateButton.className = 'psv-button psv-button--hover-scale psv-autorotate-button';\nPSVNavBarAutorotateButton.icon = 'play.svg';\nPSVNavBarAutorotateButton.iconActive = 'play-active.svg';\n\n/**\n * @override\n */\nPSVNavBarAutorotateButton.prototype.create = function() {\n PSVNavBarButton.prototype.create.call(this);\n\n this.psv.on('autorotate', this);\n};\n\n/**\n * @override\n */\nPSVNavBarAutorotateButton.prototype.destroy = function() {\n this.psv.off('autorotate', this);\n\n PSVNavBarButton.prototype.destroy.call(this);\n};\n\n/**\n * @summary Handles events\n * @param {Event} e\n * @private\n */\nPSVNavBarAutorotateButton.prototype.handleEvent = function(e) {\n switch (e.type) {\n // @formatter:off\n case 'autorotate': this.toggleActive(e.args[0]); break;\n // @formatter:on\n }\n};\n\n/**\n * @override\n * @description Toggles autorotate\n */\nPSVNavBarAutorotateButton.prototype._onClick = function() {\n this.psv.toggleAutorotate();\n};\n\n\n/**\n * Navigation bar custom button class\n * @param {module:components.PSVNavBar} navbar\n * @param {Object} config\n * @param {string} [config.id]\n * @param {string} [config.className]\n * @param {string} [config.title]\n * @param {string} [config.content]\n * @param {function} [config.onClick]\n * @param {boolean} [config.enabled=true]\n * @param {boolean} [config.visible=true]\n * @constructor\n * @extends module:components/buttons.PSVNavBarButton\n * @memberof module:components/buttons\n */\nfunction PSVNavBarCustomButton(navbar, config) {\n PSVNavBarButton.call(this, navbar);\n\n /**\n * @member {Object}\n * @readonly\n * @private\n */\n this.config = config;\n\n if (this.config.id) {\n this.id = this.config.id;\n }\n\n this.create();\n}\n\nPSVNavBarCustomButton.prototype = Object.create(PSVNavBarButton.prototype);\nPSVNavBarCustomButton.prototype.constructor = PSVNavBarCustomButton;\n\nPSVNavBarCustomButton.className = 'psv-button psv-custom-button';\n\n/**\n * @override\n */\nPSVNavBarCustomButton.prototype.create = function() {\n PSVNavBarButton.prototype.create.call(this);\n\n if (this.config.className) {\n PSVUtils.addClasses(this.container, this.config.className);\n }\n\n if (this.config.title) {\n this.container.title = this.config.title;\n }\n\n if (this.config.content) {\n this.container.innerHTML = this.config.content;\n }\n\n if (this.config.enabled === false || this.config.disabled === true) {\n this.disable();\n }\n\n if (this.config.visible === false || this.config.hidden === true) {\n this.hide();\n }\n};\n\n/**\n * @override\n */\nPSVNavBarCustomButton.prototype.destroy = function() {\n delete this.config;\n\n PSVNavBarButton.prototype.destroy.call(this);\n};\n\n/**\n * @override\n * @description Calls user method\n */\nPSVNavBarCustomButton.prototype._onClick = function() {\n if (this.config.onClick) {\n this.config.onClick.apply(this.psv);\n }\n};\n\n\n/**\n * Navigation bar download button class\n * @param {module:components.PSVNavBar} navbar\n * @constructor\n * @extends module:components/buttons.PSVNavBarButton\n * @memberof module:components/buttons\n */\nfunction PSVNavBarDownloadButton(navbar) {\n PSVNavBarButton.call(this, navbar);\n\n this.create();\n}\n\nPSVNavBarDownloadButton.prototype = Object.create(PSVNavBarButton.prototype);\nPSVNavBarDownloadButton.prototype.constructor = PSVNavBarDownloadButton;\n\nPSVNavBarDownloadButton.id = 'download';\nPSVNavBarDownloadButton.className = 'psv-button psv-button--hover-scale psv-download-button';\nPSVNavBarDownloadButton.icon = 'download.svg';\n\n/**\n * @override\n * @description Asks the browser to download the panorama source file\n */\nPSVNavBarDownloadButton.prototype._onClick = function() {\n var link = document.createElement('a');\n link.href = this.psv.config.panorama;\n link.download = this.psv.config.panorama;\n this.psv.container.appendChild(link);\n link.click();\n};\n\n\n/**\n * Navigation bar fullscreen button class\n * @param {module:components.PSVNavBar} navbar\n * @constructor\n * @extends module:components/buttons.PSVNavBarButton\n * @memberof module:components/buttons\n */\nfunction PSVNavBarFullscreenButton(navbar) {\n PSVNavBarButton.call(this, navbar);\n\n this.create();\n}\n\nPSVNavBarFullscreenButton.prototype = Object.create(PSVNavBarButton.prototype);\nPSVNavBarFullscreenButton.prototype.constructor = PSVNavBarFullscreenButton;\n\nPSVNavBarFullscreenButton.id = 'fullscreen';\nPSVNavBarFullscreenButton.className = 'psv-button psv-button--hover-scale psv-fullscreen-button';\nPSVNavBarFullscreenButton.icon = 'fullscreen-in.svg';\nPSVNavBarFullscreenButton.iconActive = 'fullscreen-out.svg';\n\n/**\n * @override\n */\nPSVNavBarFullscreenButton.prototype.create = function() {\n PSVNavBarButton.prototype.create.call(this);\n\n if (!PhotoSphereViewer.SYSTEM.fullscreenEvent) {\n this.hide();\n console.warn('PhotoSphereViewer: fullscreen not supported.');\n }\n\n this.psv.on('fullscreen-updated', this);\n};\n\n/**\n * @override\n */\nPSVNavBarFullscreenButton.prototype.destroy = function() {\n this.psv.off('fullscreen-updated', this);\n\n PSVNavBarButton.prototype.destroy.call(this);\n};\n\n/**\n * Handle events\n * @param {Event} e\n * @private\n */\nPSVNavBarFullscreenButton.prototype.handleEvent = function(e) {\n switch (e.type) {\n // @formatter:off\n case 'fullscreen-updated': this.toggleActive(e.args[0]); break;\n // @formatter:on\n }\n};\n\n/**\n * @override\n * @description Toggles fullscreen\n */\nPSVNavBarFullscreenButton.prototype._onClick = function() {\n this.psv.toggleFullscreen();\n};\n\n\n/**\n * Navigation bar gyroscope button class\n * @param {module:components.PSVNavBar} navbar\n * @constructor\n * @extends module:components/buttons.PSVNavBarButton\n * @memberof module:components/buttons\n */\nfunction PSVNavBarGyroscopeButton(navbar) {\n PSVNavBarButton.call(this, navbar);\n\n this.create();\n}\n\nPSVNavBarGyroscopeButton.prototype = Object.create(PSVNavBarButton.prototype);\nPSVNavBarGyroscopeButton.prototype.constructor = PSVNavBarGyroscopeButton;\n\nPSVNavBarGyroscopeButton.id = 'gyroscope';\nPSVNavBarGyroscopeButton.className = 'psv-button psv-button--hover-scale psv-gyroscope-button';\nPSVNavBarGyroscopeButton.icon = 'compass.svg';\n\n/**\n * @override\n * @description The button gets visible once the gyroscope API is ready\n */\nPSVNavBarGyroscopeButton.prototype.create = function() {\n PSVNavBarButton.prototype.create.call(this);\n\n PhotoSphereViewer.SYSTEM.deviceOrientationSupported.then(\n this._onAvailabilityChange.bind(this, true),\n this._onAvailabilityChange.bind(this, false)\n );\n\n this.hide();\n\n this.psv.on('gyroscope-updated', this);\n};\n\n/**\n * @override\n */\nPSVNavBarGyroscopeButton.prototype.destroy = function() {\n this.psv.off('gyroscope-updated', this);\n\n PSVNavBarButton.prototype.destroy.call(this);\n};\n\n/**\n * @summary Handles events\n * @param {Event} e\n * @private\n */\nPSVNavBarGyroscopeButton.prototype.handleEvent = function(e) {\n switch (e.type) {\n // @formatter:off\n case 'gyroscope-updated': this.toggleActive(e.args[0]); break;\n // @formatter:on\n }\n};\n\n/**\n * @override\n * @description Toggles gyroscope control\n */\nPSVNavBarGyroscopeButton.prototype._onClick = function() {\n this.psv.toggleGyroscopeControl();\n};\n\n/**\n * @summary Updates button display when API is ready\n * @param {boolean} available\n * @private\n * @throws {PSVError} when {@link THREE.DeviceOrientationControls} is not loaded\n */\nPSVNavBarGyroscopeButton.prototype._onAvailabilityChange = function(available) {\n if (available) {\n if (PSVUtils.checkTHREE('DeviceOrientationControls')) {\n this.show();\n }\n else {\n throw new PSVError('Missing Three.js components: DeviceOrientationControls. Get them from three.js-examples package.');\n }\n }\n};\n\n\n/**\n * Navigation bar markers button class\n * @param {module:components.PSVNavBar} navbar\n * @constructor\n * @extends module:components/buttons.PSVNavBarButton\n * @memberof module:components/buttons\n */\nfunction PSVNavBarMarkersButton(navbar) {\n PSVNavBarButton.call(this, navbar);\n\n this.create();\n}\n\nPSVNavBarMarkersButton.prototype = Object.create(PSVNavBarButton.prototype);\nPSVNavBarMarkersButton.prototype.constructor = PSVNavBarMarkersButton;\n\nPSVNavBarMarkersButton.id = 'markers';\nPSVNavBarMarkersButton.className = 'psv-button psv-button--hover-scale psv-markers-button';\nPSVNavBarMarkersButton.icon = 'pin.svg';\n\n/**\n * @override\n * @description Toggles markers list\n */\nPSVNavBarMarkersButton.prototype._onClick = function() {\n this.psv.hud.toggleMarkersList();\n};\n\n\n/**\n * Navigation bar zoom button class\n * @param {module:components.PSVNavBar} navbar\n * @constructor\n * @extends module:components/buttons.PSVNavBarButton\n * @memberof module:components/buttons\n */\nfunction PSVNavBarZoomButton(navbar) {\n PSVNavBarButton.call(this, navbar);\n\n /**\n * @member {HTMLElement}\n * @readonly\n * @private\n */\n this.zoom_range = null;\n\n /**\n * @member {HTMLElement}\n * @readonly\n * @private\n */\n this.zoom_value = null;\n\n /**\n * @member {Object}\n * @private\n */\n this.prop = {\n mousedown: false,\n buttondown: false,\n longPressInterval: null,\n longPressTimeout: null\n };\n\n this.create();\n}\n\nPSVNavBarZoomButton.prototype = Object.create(PSVNavBarButton.prototype);\nPSVNavBarZoomButton.prototype.constructor = PSVNavBarZoomButton;\n\nPSVNavBarZoomButton.id = 'zoom';\nPSVNavBarZoomButton.className = 'psv-button psv-zoom-button';\n\n/**\n * @override\n */\nPSVNavBarZoomButton.prototype.create = function() {\n PSVNavBarButton.prototype.create.call(this);\n\n var zoom_minus = document.createElement('div');\n zoom_minus.className = 'psv-zoom-button-minus';\n zoom_minus.title = this.psv.config.lang.zoomOut;\n this._setIcon('zoom-out.svg', zoom_minus);\n this.container.appendChild(zoom_minus);\n\n var zoom_range_bg = document.createElement('div');\n zoom_range_bg.className = 'psv-zoom-button-range';\n this.container.appendChild(zoom_range_bg);\n\n this.zoom_range = document.createElement('div');\n this.zoom_range.className = 'psv-zoom-button-line';\n zoom_range_bg.appendChild(this.zoom_range);\n\n this.zoom_value = document.createElement('div');\n this.zoom_value.className = 'psv-zoom-button-handle';\n this.zoom_range.appendChild(this.zoom_value);\n\n var zoom_plus = document.createElement('div');\n zoom_plus.className = 'psv-zoom-button-plus';\n zoom_plus.title = this.psv.config.lang.zoomIn;\n this._setIcon('zoom-in.svg', zoom_plus);\n this.container.appendChild(zoom_plus);\n\n this.zoom_range.addEventListener('mousedown', this);\n this.zoom_range.addEventListener('touchstart', this);\n this.psv.container.addEventListener('mousemove', this);\n this.psv.container.addEventListener('touchmove', this);\n this.psv.container.addEventListener('mouseup', this);\n this.psv.container.addEventListener('touchend', this);\n zoom_minus.addEventListener('mousedown', this._zoomOut.bind(this));\n zoom_plus.addEventListener('mousedown', this._zoomIn.bind(this));\n\n this.psv.on('zoom-updated', this);\n\n this.psv.once('ready', function() {\n this._moveZoomValue(this.psv.prop.zoom_lvl);\n }.bind(this));\n};\n\n/**\n * @override\n */\nPSVNavBarZoomButton.prototype.destroy = function() {\n this._stopZoomChange();\n\n this.psv.container.removeEventListener('mousemove', this);\n this.psv.container.removeEventListener('touchmove', this);\n this.psv.container.removeEventListener('mouseup', this);\n this.psv.container.removeEventListener('touchend', this);\n\n delete this.zoom_range;\n delete this.zoom_value;\n\n this.psv.off('zoom-updated', this);\n\n PSVNavBarButton.prototype.destroy.call(this);\n};\n\n/**\n * @summary Handles events\n * @param {Event} e\n * @private\n */\nPSVNavBarZoomButton.prototype.handleEvent = function(e) {\n switch (e.type) {\n // @formatter:off\n case 'mousedown': this._initZoomChangeWithMouse(e); break;\n case 'touchstart': this._initZoomChangeByTouch(e); break;\n case 'mousemove': this._changeZoomWithMouse(e); break;\n case 'touchmove': this._changeZoomByTouch(e); break;\n case 'mouseup': this._stopZoomChange(e); break;\n case 'touchend': this._stopZoomChange(e); break;\n case 'zoom-updated': this._moveZoomValue(e.args[0]); break;\n // @formatter:on\n }\n};\n\n/**\n * @summary Moves the zoom cursor\n * @param {int} level\n * @private\n */\nPSVNavBarZoomButton.prototype._moveZoomValue = function(level) {\n this.zoom_value.style.left = (level / 100 * this.zoom_range.offsetWidth - this.zoom_value.offsetWidth / 2) + 'px';\n};\n\n/**\n * @summary Handles mouse down events\n * @param {MouseEvent} evt\n * @private\n */\nPSVNavBarZoomButton.prototype._initZoomChangeWithMouse = function(evt) {\n if (!this.enabled) {\n return;\n }\n\n this.prop.mousedown = true;\n this._changeZoom(evt.clientX);\n};\n\n/**\n * @summary Handles touch events\n * @param {TouchEvent} evt\n * @private\n */\nPSVNavBarZoomButton.prototype._initZoomChangeByTouch = function(evt) {\n if (!this.enabled) {\n return;\n }\n\n this.prop.mousedown = true;\n this._changeZoom(evt.changedTouches[0].clientX);\n};\n\n/**\n * @summary Handles click events\n * @description Zooms in and register long press timer\n * @private\n */\nPSVNavBarZoomButton.prototype._zoomIn = function() {\n if (!this.enabled) {\n return;\n }\n\n this.prop.buttondown = true;\n this.psv.zoomIn();\n this.prop.longPressTimeout = window.setTimeout(this._startLongPressInterval.bind(this, 1), 200);\n};\n\n/**\n * @summary Handles click events\n * @description Zooms out and register long press timer\n * @private\n */\nPSVNavBarZoomButton.prototype._zoomOut = function() {\n if (!this.enabled) {\n return;\n }\n\n this.prop.buttondown = true;\n this.psv.zoomOut();\n this.prop.longPressTimeout = window.setTimeout(this._startLongPressInterval.bind(this, -1), 200);\n};\n\n/**\n * @summary Continues zooming as long as the user presses the button\n * @param value\n * @private\n */\nPSVNavBarZoomButton.prototype._startLongPressInterval = function(value) {\n if (this.prop.buttondown) {\n this.prop.longPressInterval = window.setInterval(function() {\n this.psv.zoom(this.psv.prop.zoom_lvl + value);\n }.bind(this), 50);\n }\n};\n\n/**\n * @summary Handles mouse up events\n * @private\n */\nPSVNavBarZoomButton.prototype._stopZoomChange = function() {\n if (!this.enabled) {\n return;\n }\n\n window.clearInterval(this.prop.longPressInterval);\n window.clearTimeout(this.prop.longPressTimeout);\n this.prop.longPressInterval = null;\n this.prop.mousedown = false;\n this.prop.buttondown = false;\n};\n\n/**\n * @summary Handles mouse move events\n * @param {MouseEvent} evt\n * @private\n */\nPSVNavBarZoomButton.prototype._changeZoomWithMouse = function(evt) {\n if (!this.enabled) {\n return;\n }\n\n evt.preventDefault();\n this._changeZoom(evt.clientX);\n};\n\n/**\n * @summary Handles touch move events\n * @param {TouchEvent} evt\n * @private\n */\nPSVNavBarZoomButton.prototype._changeZoomByTouch = function(evt) {\n if (!this.enabled) {\n return;\n }\n this._changeZoom(evt.changedTouches[0].clientX);\n};\n\n/**\n * @summary Zoom change\n * @param {int} x - mouse/touch position\n * @private\n */\nPSVNavBarZoomButton.prototype._changeZoom = function(x) {\n if (this.prop.mousedown) {\n var user_input = parseInt(x) - this.zoom_range.getBoundingClientRect().left;\n var zoom_level = user_input / this.zoom_range.offsetWidth * 100;\n this.psv.zoom(zoom_level);\n }\n};\n\n\n/**\n * Custom error used in the lib\n * @param {string} message\n * @constructor\n */\nfunction PSVError(message) {\n this.message = message;\n\n // Use V8's native method if available, otherwise fallback\n if ('captureStackTrace' in Error) {\n Error.captureStackTrace(this, PSVError);\n }\n else {\n this.stack = (new Error()).stack;\n }\n}\n\nPSVError.prototype = Object.create(Error.prototype);\nPSVError.prototype.name = 'PSVError';\nPSVError.prototype.constructor = PSVError;\n\n/**\n * @summary exposes {@link PSVError}\n * @memberof PhotoSphereViewer\n * @readonly\n */\nPhotoSphereViewer.Error = PSVError;\n\n\n/**\n * Object representing a marker\n * @param {Object} properties - see {@link http://photo-sphere-viewer.js.org/markers.html#config} (merged with the object itself)\n * @param {PhotoSphereViewer} psv\n * @constructor\n * @throws {PSVError} when the configuration is incorrect\n */\nfunction PSVMarker(properties, psv) {\n if (!properties.id) {\n throw new PSVError('missing marker id');\n }\n\n if (properties.image && (!properties.width || !properties.height)) {\n throw new PSVError('missing marker width/height');\n }\n\n if (properties.image || properties.html) {\n if ((!properties.hasOwnProperty('x') || !properties.hasOwnProperty('y')) && (!properties.hasOwnProperty('latitude') || !properties.hasOwnProperty('longitude'))) {\n throw new PSVError('missing marker position, latitude/longitude or x/y');\n }\n }\n\n /**\n * @member {PhotoSphereViewer}\n * @readonly\n * @protected\n */\n this.psv = psv;\n\n /**\n * @member {boolean}\n */\n this.visible = true;\n\n /**\n * @member {boolean}\n * @readonly\n * @private\n */\n this._dynamicSize = false;\n\n // private properties\n var _id = properties.id;\n var _type = PSVMarker.getType(properties, false);\n var $el;\n\n // readonly properties\n Object.defineProperties(this, {\n /**\n * @memberof PSVMarker\n * @type {string}\n * @readonly\n */\n id: {\n configurable: false,\n enumerable: true,\n get: function() {\n return _id;\n },\n set: function() {\n }\n },\n /**\n * @memberof PSVMarker\n * @type {string}\n * @see PSVMarker.types\n * @readonly\n */\n type: {\n configurable: false,\n enumerable: true,\n get: function() {\n return _type;\n },\n set: function() {\n }\n },\n /**\n * @memberof PSVMarker\n * @type {HTMLDivElement|SVGElement}\n * @readonly\n */\n $el: {\n configurable: false,\n enumerable: true,\n get: function() {\n return $el;\n },\n set: function() {\n }\n },\n /**\n * @summary Quick access to self value of key `type`\n * @memberof PSVMarker\n * @type {*}\n * @private\n */\n _def: {\n configurable: false,\n enumerable: true,\n get: function() {\n return this[_type];\n },\n set: function(value) {\n this[_type] = value;\n }\n }\n });\n\n // create element\n if (this.isNormal()) {\n $el = document.createElement('div');\n }\n else if (this.isPolygon()) {\n $el = document.createElementNS(PSVUtils.svgNS, 'polygon');\n }\n else if (this.isPolyline()) {\n $el = document.createElementNS(PSVUtils.svgNS, 'polyline');\n }\n else {\n $el = document.createElementNS(PSVUtils.svgNS, this.type);\n }\n\n $el.id = 'psv-marker-' + this.id;\n $el.psvMarker = this;\n\n this.update(properties);\n}\n\n/**\n * @summary Types of markers\n * @type {string[]}\n * @readonly\n */\nPSVMarker.types = ['image', 'html', 'polygon_px', 'polygon_rad', 'polyline_px', 'polyline_rad', 'rect', 'circle', 'ellipse', 'path'];\n\n/**\n * @summary Determines the type of a marker by the available properties\n * @param {object} properties\n * @param {boolean} [allowNone=false]\n * @returns {string}\n * @throws {PSVError} when the marker's type cannot be found\n */\nPSVMarker.getType = function(properties, allowNone) {\n var found = [];\n\n PSVMarker.types.forEach(function(type) {\n if (properties[type]) {\n found.push(type);\n }\n });\n\n if (found.length === 0 && !allowNone) {\n throw new PSVError('missing marker content, either ' + PSVMarker.types.join(', '));\n }\n else if (found.length > 1) {\n throw new PSVError('multiple marker content, either ' + PSVMarker.types.join(', '));\n }\n\n return found[0];\n};\n\n/**\n * @summary Destroys the marker\n */\nPSVMarker.prototype.destroy = function() {\n delete this.$el.psvMarker;\n};\n\n/**\n * @summary Checks if it is a normal marker (image or html)\n * @returns {boolean}\n */\nPSVMarker.prototype.isNormal = function() {\n return this.type === 'image' || this.type === 'html';\n};\n\n/**\n * @summary Checks if it is a polygon/polyline marker\n * @returns {boolean}\n */\nPSVMarker.prototype.isPoly = function() {\n return this.isPolygon() || this.isPolyline();\n};\n\n/**\n * @summary Checks if it is a polygon marker\n * @returns {boolean}\n */\nPSVMarker.prototype.isPolygon = function() {\n return this.type === 'polygon_px' || this.type === 'polygon_rad';\n};\n\n/**\n * @summary Checks if it is a polyline marker\n * @returns {boolean}\n */\nPSVMarker.prototype.isPolyline = function() {\n return this.type === 'polyline_px' || this.type === 'polyline_rad';\n};\n\n/**\n * @summary Checks if it is an SVG marker\n * @returns {boolean}\n */\nPSVMarker.prototype.isSvg = function() {\n return this.type === 'rect' || this.type === 'circle' || this.type === 'ellipse' || this.type === 'path';\n};\n\n/**\n * @summary Computes marker scale from zoom level\n * @param {float} zoomLevel\n * @returns {float}\n */\nPSVMarker.prototype.getScale = function(zoomLevel) {\n if (Array.isArray(this.scale)) {\n return this.scale[0] + (this.scale[1] - this.scale[0]) * PSVUtils.animation.easings.inQuad(zoomLevel / 100);\n }\n else if (typeof this.scale === 'function') {\n return this.scale(zoomLevel);\n }\n else if (typeof this.scale === 'number') {\n return this.scale * PSVUtils.animation.easings.inQuad(zoomLevel / 100);\n }\n else {\n return 1;\n }\n};\n\n/**\n * @summary Updates the marker with new properties\n * @param {object} [properties]\n * @throws {PSVError} when trying to change the marker's type\n */\nPSVMarker.prototype.update = function(properties) {\n // merge objects\n if (properties && properties !== this) {\n var newType = PSVMarker.getType(properties, true);\n\n if (newType !== undefined && newType !== this.type) {\n throw new PSVError('cannot change marker type');\n }\n\n PSVUtils.deepmerge(this, properties);\n }\n\n // reset CSS class\n if (this.isNormal()) {\n this.$el.setAttribute('class', 'psv-marker psv-marker--normal');\n }\n else {\n this.$el.setAttribute('class', 'psv-marker psv-marker--svg');\n }\n\n // add CSS classes\n if (this.className) {\n PSVUtils.addClasses(this.$el, this.className);\n }\n if (this.tooltip) {\n PSVUtils.addClasses(this.$el, 'has-tooltip');\n if (typeof this.tooltip === 'string') {\n this.tooltip = { content: this.tooltip };\n }\n }\n\n // apply style\n if (this.style) {\n PSVUtils.deepmerge(this.$el.style, this.style);\n }\n\n // parse anchor\n this.anchor = PSVUtils.parsePosition(this.anchor);\n\n if (this.isNormal()) {\n this._updateNormal();\n }\n else if (this.isPolygon()) {\n this._updatePoly('polygon_rad', 'polygon_px');\n }\n else if (this.isPolyline()) {\n this._updatePoly('polyline_rad', 'polyline_px');\n }\n else {\n this._updateSvg();\n }\n};\n\n/**\n * @summary Updates a normal marker\n * @private\n */\nPSVMarker.prototype._updateNormal = function() {\n if (this.width && this.height) {\n this.$el.style.width = this.width + 'px';\n this.$el.style.height = this.height + 'px';\n this._dynamicSize = false;\n }\n else {\n this._dynamicSize = true;\n }\n\n if (this.image) {\n this.$el.style.backgroundImage = 'url(' + this.image + ')';\n }\n else {\n this.$el.innerHTML = this.html;\n }\n\n // set anchor\n this.$el.style.transformOrigin = this.anchor.left * 100 + '% ' + this.anchor.top * 100 + '%';\n\n // convert texture coordinates to spherical coordinates\n this.psv.cleanPosition(this);\n\n // compute x/y/z position\n this.position3D = this.psv.sphericalCoordsToVector3(this);\n};\n\n/**\n * @summary Updates an SVG marker\n * @private\n */\nPSVMarker.prototype._updateSvg = function() {\n this._dynamicSize = true;\n\n // set content\n switch (this.type) {\n case 'rect':\n if (typeof this._def === 'number') {\n this._def = {\n x: 0,\n y: 0,\n width: this._def,\n height: this._def\n };\n }\n else if (Array.isArray(this._def)) {\n this._def = {\n x: 0,\n y: 0,\n width: this._def[0],\n height: this._def[1]\n };\n }\n else {\n this._def.x = this._def.y = 0;\n }\n break;\n\n case 'circle':\n if (typeof this._def === 'number') {\n this._def = {\n cx: this._def,\n cy: this._def,\n r: this._def\n };\n }\n else if (Array.isArray(this._def)) {\n this._def = {\n cx: this._def[0],\n cy: this._def[0],\n r: this._def[0]\n };\n }\n else {\n this._def.cx = this._def.cy = this._def.r;\n }\n break;\n\n case 'ellipse':\n if (typeof this._def === 'number') {\n this._def = {\n cx: this._def,\n cy: this._def,\n rx: this._def,\n ry: this._def\n };\n }\n else if (Array.isArray(this._def)) {\n this._def = {\n cx: this._def[0],\n cy: this._def[1],\n rx: this._def[0],\n ry: this._def[1]\n };\n }\n else {\n this._def.cx = this._def.rx;\n this._def.cy = this._def.ry;\n }\n break;\n\n case 'path':\n if (typeof this._def === 'string') {\n this._def = {\n d: this._def\n };\n }\n break;\n }\n\n Object.getOwnPropertyNames(this._def).forEach(function(prop) {\n this.$el.setAttributeNS(null, prop, this._def[prop]);\n }, this);\n\n // set style\n if (this.svgStyle) {\n Object.getOwnPropertyNames(this.svgStyle).forEach(function(prop) {\n this.$el.setAttributeNS(null, PSVUtils.dasherize(prop), this.svgStyle[prop]);\n }, this);\n }\n else {\n this.$el.setAttributeNS(null, 'fill', 'rgba(0,0,0,0.5)');\n }\n\n // convert texture coordinates to spherical coordinates\n this.psv.cleanPosition(this);\n\n // compute x/y/z position\n this.position3D = this.psv.sphericalCoordsToVector3(this);\n};\n\n/**\n * @summary Updates a polygon marker\n * @param {'polygon_rad'|'polyline_rad'} key_rad\n * @param {'polygon_px'|'polyline_px'} key_px\n * @private\n */\nPSVMarker.prototype._updatePoly = function(key_rad, key_px) {\n this._dynamicSize = true;\n\n // set style\n if (this.svgStyle) {\n Object.getOwnPropertyNames(this.svgStyle).forEach(function(prop) {\n this.$el.setAttributeNS(null, PSVUtils.dasherize(prop), this.svgStyle[prop]);\n }, this);\n\n if (this.isPolyline() && !this.svgStyle.fill) {\n this.$el.setAttributeNS(null, 'fill', 'none');\n }\n }\n else if (this.isPolygon()) {\n this.$el.setAttributeNS(null, 'fill', 'rgba(0,0,0,0.5)');\n }\n else if (this.isPolyline()) {\n this.$el.setAttributeNS(null, 'fill', 'none');\n this.$el.setAttributeNS(null, 'stroke', 'rgb(0,0,0)');\n }\n\n // fold arrays: [1,2,3,4] => [[1,2],[3,4]]\n [this[key_rad], this[key_px]].forEach(function(polygon) {\n if (polygon && typeof polygon[0] !== 'object') {\n for (var i = 0; i < polygon.length; i++) {\n polygon.splice(i, 2, [polygon[i], polygon[i + 1]]);\n }\n }\n });\n\n // convert texture coordinates to spherical coordinates\n if (this[key_px]) {\n this[key_rad] = this[key_px].map(function(coord) {\n var sphericalCoords = this.psv.textureCoordsToSphericalCoords({ x: coord[0], y: coord[1] });\n return [sphericalCoords.longitude, sphericalCoords.latitude];\n }, this);\n }\n // clean angles\n else {\n this[key_rad] = this[key_rad].map(function(coord) {\n return [\n PSVUtils.parseAngle(coord[0]),\n PSVUtils.parseAngle(coord[1], true)\n ];\n });\n }\n\n // TODO : compute the center of the polygon\n this.longitude = this[key_rad][0][0];\n this.latitude = this[key_rad][0][1];\n\n // compute x/y/z positions\n this.positions3D = this[key_rad].map(function(coord) {\n return this.psv.sphericalCoordsToVector3({ longitude: coord[0], latitude: coord[1] });\n }, this);\n};\n\n\n/**\n * Static utilities for PSV\n * @namespace\n */\nvar PSVUtils = {};\n\n/**\n * @summary exposes {@link PSVUtils}\n * @member {object}\n * @memberof PhotoSphereViewer\n * @readonly\n */\nPhotoSphereViewer.Utils = PSVUtils;\n\n/**\n * @summary Short-Hand for PI*2\n * @type {float}\n * @readonly\n */\nPSVUtils.TwoPI = Math.PI * 2.0;\n\n/**\n * @summary Short-Hand for PI/2\n * @type {float}\n * @readonly\n */\nPSVUtils.HalfPI = Math.PI / 2.0;\n\n/**\n * @summary Namespace for SVG creation\n * @type {string}\n * @readonly\n */\nPSVUtils.svgNS = 'http://www.w3.org/2000/svg';\n\n/**\n * @summary Checks if some three.js components are loaded\n * @param {...string} components\n * @returns {boolean}\n */\nPSVUtils.checkTHREE = function(components) {\n for (var i = 0, l = arguments.length; i < l; i++) {\n if (!(arguments[i] in THREE)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @summary Detects if canvas is supported\n * @returns {boolean}\n */\nPSVUtils.isCanvasSupported = function() {\n var canvas = document.createElement('canvas');\n return !!(canvas.getContext && canvas.getContext('2d'));\n};\n\n/**\n * @summary Tries to return a canvas webgl context\n * @returns {WebGLRenderingContext}\n */\nPSVUtils.getWebGLCtx = function() {\n var canvas = document.createElement('canvas');\n var names = ['webgl', 'experimental-webgl', 'moz-webgl', 'webkit-3d'];\n var context = null;\n\n if (!canvas.getContext) {\n return null;\n }\n\n if (names.some(function(name) {\n try {\n context = canvas.getContext(name);\n return (context && typeof context.getParameter === 'function');\n } catch (e) {\n return false;\n }\n })) {\n return context;\n }\n else {\n return null;\n }\n};\n\n/**\n * @summary Detects if WebGL is supported\n * @returns {boolean}\n */\nPSVUtils.isWebGLSupported = function() {\n return !!window.WebGLRenderingContext && PSVUtils.getWebGLCtx() !== null;\n};\n\n/**\n * @summary Detects if device orientation is supported\n * @description We can only be sure device orientation is supported once received an event with coherent data\n * @returns {Promise}\n */\nPSVUtils.isDeviceOrientationSupported = function() {\n var defer = D();\n\n if ('DeviceOrientationEvent' in window) {\n var listener = function(event) {\n if (event && event.alpha !== null && !isNaN(event.alpha)) {\n defer.resolve();\n }\n else {\n defer.reject();\n }\n\n window.removeEventListener('deviceorientation', listener);\n };\n\n window.addEventListener('deviceorientation', listener, false);\n\n setTimeout(function() {\n if (defer.promise.isPending()) {\n listener(null);\n }\n }, 2000);\n }\n else {\n defer.reject();\n }\n\n return defer.promise;\n};\n\n/**\n * @summary Gets max texture width in WebGL context\n * @returns {int}\n */\nPSVUtils.getMaxTextureWidth = function() {\n var ctx = PSVUtils.getWebGLCtx();\n if (ctx !== null) {\n return ctx.getParameter(ctx.MAX_TEXTURE_SIZE);\n }\n else {\n return 0;\n }\n};\n\n/**\n * @summary Toggles a CSS class\n * @param {HTMLElement|SVGElement} element\n * @param {string} className\n * @param {boolean} [active] - forced state\n */\nPSVUtils.toggleClass = function(element, className, active) {\n // manual implementation for IE11 and SVGElement\n if (!element.classList) {\n var currentClassName = element.getAttribute('class') || '';\n var currentActive = currentClassName.indexOf(className) !== -1;\n var regex = new RegExp('(?:^|\\\\s)' + className + '(?:\\\\s|$)');\n\n if ((active === undefined || active) && !currentActive) {\n currentClassName += currentClassName.length > 0 ? ' ' + className : className;\n }\n else if (!active) {\n currentClassName = currentClassName.replace(regex, ' ');\n }\n\n element.setAttribute('class', currentClassName);\n }\n else {\n if (active === undefined) {\n element.classList.toggle(className);\n }\n else if (active && !element.classList.contains(className)) {\n element.classList.add(className);\n }\n else if (!active) {\n element.classList.remove(className);\n }\n }\n};\n\n/**\n * @summary Adds one or several CSS classes to an element\n * @param {HTMLElement} element\n * @param {string} className\n */\nPSVUtils.addClasses = function(element, className) {\n if (!className) {\n return;\n }\n className.split(' ').forEach(function(name) {\n PSVUtils.toggleClass(element, name, true);\n });\n};\n\n/**\n * @summary Removes one or several CSS classes to an element\n * @param {HTMLElement} element\n * @param {string} className\n */\nPSVUtils.removeClasses = function(element, className) {\n if (!className) {\n return;\n }\n className.split(' ').forEach(function(name) {\n PSVUtils.toggleClass(element, name, false);\n });\n};\n\n/**\n * @summary Searches if an element has a particular parent at any level including itself\n * @param {HTMLElement} el\n * @param {HTMLElement} parent\n * @returns {boolean}\n */\nPSVUtils.hasParent = function(el, parent) {\n do {\n if (el === parent) {\n return true;\n }\n } while (!!(el = el.parentNode));\n\n return false;\n};\n\n/**\n * @summary Gets the closest parent (can by itself)\n * @param {HTMLElement} el (HTMLElement)\n * @param {string} selector\n * @returns {HTMLElement}\n */\nPSVUtils.getClosest = function(el, selector) {\n var matches = el.matches || el.msMatchesSelector;\n\n do {\n if (matches.bind(el)(selector)) {\n return el;\n }\n } while (!!(el = el.parentElement));\n\n return null;\n};\n\n/**\n * @summary Gets the event name for mouse wheel\n * @returns {string}\n */\nPSVUtils.mouseWheelEvent = function() {\n return 'onwheel' in document.createElement('div') ? 'wheel' : // Modern browsers support \"wheel\"\n document.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least \"mousewheel\"\n 'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox\n};\n\n/**\n * @summary Gets the event name for fullscreen\n * @returns {string}\n */\nPSVUtils.fullscreenEvent = function() {\n var map = {\n 'exitFullscreen': 'fullscreenchange',\n 'webkitExitFullscreen': 'webkitfullscreenchange',\n 'mozCancelFullScreen': 'mozfullscreenchange',\n 'msExitFullscreen': 'MSFullscreenChange'\n };\n\n for (var exit in map) {\n if (map.hasOwnProperty(exit) && exit in document) {\n return map[exit];\n }\n }\n\n return null;\n};\n\n/**\n * @summary Ensures that a number is in a given interval\n * @param {number} x\n * @param {number} min\n * @param {number} max\n * @returns {number}\n */\nPSVUtils.bound = function(x, min, max) {\n return Math.max(min, Math.min(max, x));\n};\n\n/**\n * @summary Checks if a value is an integer\n * @function\n * @param {*} value\n * @returns {boolean}\n */\nPSVUtils.isInteger = Number.isInteger || function(value) {\n return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;\n };\n\n/**\n * @summary Computes the sum of an array\n * @param {number[]} array\n * @returns {number}\n */\nPSVUtils.sum = function(array) {\n return array.reduce(function(a, b) {\n return a + b;\n }, 0);\n};\n\n/**\n * @summary Transforms a string to dash-case\n * {@link https://github.com/shahata/dasherize}\n * @param {string} str\n * @returns {string}\n */\nPSVUtils.dasherize = function(str) {\n return str.replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g, function(s, i) {\n return (i > 0 ? '-' : '') + s.toLowerCase();\n });\n};\n\n/**\n * @summary Returns the value of a given attribute in the panorama metadata\n * @param {string} data\n * @param {string} attr\n * @returns (string)\n */\nPSVUtils.getXMPValue = function(data, attr) {\n var result;\n // XMP data are stored in children\n if ((result = data.match('<GPano:' + attr + '>(.*)</GPano:' + attr + '>')) !== null) {\n return result[1];\n }\n // XMP data are stored in attributes\n else if ((result = data.match('GPano:' + attr + '=\"(.*?)\"')) !== null) {\n return result[1];\n }\n else {\n return null;\n }\n};\n\n/**\n * @summary Detects if fullscreen is enabled\n * @param {HTMLElement} elt\n * @returns {boolean}\n */\nPSVUtils.isFullscreenEnabled = function(elt) {\n return (document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement) === elt;\n};\n\n/**\n * @summary Enters fullscreen mode\n * @param {HTMLElement} elt\n */\nPSVUtils.requestFullscreen = function(elt) {\n (elt.requestFullscreen || elt.mozRequestFullScreen || elt.webkitRequestFullscreen || elt.msRequestFullscreen).call(elt);\n};\n\n/**\n * @summary Exits fullscreen mode\n */\nPSVUtils.exitFullscreen = function() {\n (document.exitFullscreen || document.mozCancelFullScreen || document.webkitExitFullscreen || document.msExitFullscreen).call(document);\n};\n\n/**\n * @summary Gets an element style\n * @param {HTMLElement} elt\n * @param {string} prop\n * @returns {*}\n */\nPSVUtils.getStyle = function(elt, prop) {\n return window.getComputedStyle(elt, null)[prop];\n};\n\n/**\n * @summary Compute the shortest offset between two longitudes\n * @param {float} from\n * @param {float} to\n * @returns {float}\n */\nPSVUtils.getShortestArc = function(from, to) {\n var tCandidates = [\n 0, // direct\n PSVUtils.TwoPI, // clock-wise cross zero\n -PSVUtils.TwoPI // counter-clock-wise cross zero\n ];\n\n return tCandidates.reduce(function(value, candidate) {\n candidate = to - from + candidate;\n return Math.abs(candidate) < Math.abs(value) ? candidate : value;\n }, Infinity);\n};\n\n/**\n * @summary Translate CSS values like \"top center\" or \"10% 50%\" as top and left positions\n * @description The implementation is as close as possible to the \"background-position\" specification\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/background-position}\n * @param {string} value\n * @returns {{top: float, left: float}}\n */\nPSVUtils.parsePosition = function(value) {\n if (!value) {\n return { top: 0.5, left: 0.5 };\n }\n\n if (typeof value === 'object') {\n return value;\n }\n\n var tokens = value.toLocaleLowerCase().split(' ').slice(0, 2);\n\n if (tokens.length === 1) {\n if (PSVUtils.parsePosition.positions[tokens[0]] !== undefined) {\n tokens = [tokens[0], 'center'];\n }\n else {\n tokens = [tokens[0], tokens[0]];\n }\n }\n\n var xFirst = tokens[1] !== 'left' && tokens[1] !== 'right' && tokens[0] !== 'top' && tokens[0] !== 'bottom';\n\n tokens = tokens.map(function(token) {\n return PSVUtils.parsePosition.positions[token] || token;\n });\n\n if (!xFirst) {\n tokens.reverse();\n }\n\n var parsed = tokens.join(' ').match(/^([0-9.]+)% ([0-9.]+)%$/);\n\n if (parsed) {\n return {\n left: parsed[1] / 100,\n top: parsed[2] / 100\n };\n }\n else {\n return { top: 0.5, left: 0.5 };\n }\n};\n\nPSVUtils.parsePosition.positions = { 'top': '0%', 'bottom': '100%', 'left': '0%', 'right': '100%', 'center': '50%' };\n\n/**\n * @summary Parses an speed\n * @param {string} speed - The speed, in radians/degrees/revolutions per second/minute\n * @returns {float} radians per second\n * @throws {PSVError} when the speed cannot be parsed\n */\nPSVUtils.parseSpeed = function(speed) {\n if (typeof speed === 'string') {\n speed = speed.toString().trim();\n\n // Speed extraction\n var speed_value = parseFloat(speed.replace(/^(-?[0-9]+(?:\\.[0-9]*)?).*$/, '$1'));\n var speed_unit = speed.replace(/^-?[0-9]+(?:\\.[0-9]*)?(.*)$/, '$1').trim();\n\n // \"per minute\" -> \"per second\"\n if (speed_unit.match(/(pm|per minute)$/)) {\n speed_value /= 60;\n }\n\n // Which unit?\n switch (speed_unit) {\n // Degrees per minute / second\n case 'dpm':\n case 'degrees per minute':\n case 'dps':\n case 'degrees per second':\n speed = THREE.Math.degToRad(speed_value);\n break;\n\n // Radians per minute / second\n case 'radians per minute':\n case 'radians per second':\n speed = speed_value;\n break;\n\n // Revolutions per minute / second\n case 'rpm':\n case 'revolutions per minute':\n case 'rps':\n case 'revolutions per second':\n speed = speed_value * PSVUtils.TwoPI;\n break;\n\n // Unknown unit\n default:\n throw new PSVError('unknown speed unit \"' + speed_unit + '\"');\n }\n }\n\n return speed;\n};\n\n/**\n * @summary Parses an angle value in radians or degrees and returns a normalized value in radians\n * @param {string|number} angle - eg: 3.14, 3.14rad, 180deg\n * @param {boolean} [zeroCenter=false] - normalize between -Pi/2 - Pi/2 instead of 0 - 2*Pi\n * @returns {float}\n * @throws {PSVError} when the angle cannot be parsed\n */\nPSVUtils.parseAngle = function(angle, zeroCenter) {\n if (typeof angle === 'string') {\n var match = angle.toLowerCase().trim().match(/^(-?[0-9]+(?:\\.[0-9]*)?)(.*)$/);\n\n if (!match) {\n throw new PSVError('unknown angle \"' + angle + '\"');\n }\n\n var value = parseFloat(match[1]);\n var unit = match[2];\n\n if (unit) {\n switch (unit) {\n case 'deg':\n case 'degs':\n angle = THREE.Math.degToRad(value);\n break;\n case 'rad':\n case 'rads':\n angle = value;\n break;\n default:\n throw new PSVError('unknown angle unit \"' + unit + '\"');\n }\n }\n else {\n angle = value;\n }\n }\n\n angle = (zeroCenter ? angle + Math.PI : angle) % PSVUtils.TwoPI;\n\n if (angle < 0) {\n angle = PSVUtils.TwoPI + angle;\n }\n\n return zeroCenter ? PSVUtils.bound(angle - Math.PI, -PSVUtils.HalfPI, PSVUtils.HalfPI) : angle;\n};\n\n/**\n * @summary Removes all children of a three.js scene and dispose all textures\n * @param {THREE.Scene} scene\n */\nPSVUtils.cleanTHREEScene = function(scene) {\n scene.children.forEach(function(item) {\n if (item instanceof THREE.Mesh) {\n if (item.geometry) {\n item.geometry.dispose();\n item.geometry = null;\n }\n\n if (item.material) {\n if (item.material.materials) {\n item.material.materials.forEach(function(material) {\n if (material.map) {\n material.map.dispose();\n material.map = null;\n }\n\n material.dispose();\n });\n\n item.material.materials.length = 0;\n }\n else {\n if (item.material.map) {\n item.material.map.dispose();\n item.material.map = null;\n }\n\n item.material.dispose();\n }\n\n item.material = null;\n }\n }\n });\n scene.children.length = 0;\n};\n\n/**\n * @callback AnimationOnTick\n * @param {Object} properties - current values\n * @param {float} progress - 0 to 1\n */\n\n/**\n * @summary Interpolates each property with an easing and optional delay\n * @param {Object} options\n * @param {Object[]} options.properties\n * @param {number} options.properties[].start\n * @param {number} options.properties[].end\n * @param {int} options.duration\n * @param {int} [options.delay=0]\n * @param {string} [options.easing='linear']\n * @param {AnimationOnTick} options.onTick - called on each frame\n * @returns {Promise} Promise with an additional \"cancel\" method\n */\nPSVUtils.animation = function(options) {\n var defer = D(false); // alwaysAsync = false to allow immediate resolution of \"cancel\"\n var start = null;\n\n if (!options.easing || typeof options.easing === 'string') {\n options.easing = PSVUtils.animation.easings[options.easing || 'linear'];\n }\n\n function run(timestamp) {\n // the animation has been cancelled\n if (defer.promise.getStatus() === -1) {\n return;\n }\n\n // first iteration\n if (start === null) {\n start = timestamp;\n }\n\n // compute progress\n var progress = (timestamp - start) / options.duration;\n var current = {};\n var name;\n\n if (progress < 1.0) {\n // interpolate properties\n for (name in options.properties) {\n current[name] = options.properties[name].start + (options.properties[name].end - options.properties[name].start) * options.easing(progress);\n }\n\n options.onTick(current, progress);\n\n window.requestAnimationFrame(run);\n }\n else {\n // call onTick one last time with final values\n for (name in options.properties) {\n current[name] = options.properties[name].end;\n }\n\n options.onTick(current, 1.0);\n\n window.requestAnimationFrame(function() {\n defer.resolve();\n });\n }\n }\n\n if (options.delay !== undefined) {\n window.setTimeout(function() {\n window.requestAnimationFrame(run);\n }, options.delay);\n }\n else {\n window.requestAnimationFrame(run);\n }\n\n // add a \"cancel\" to the promise\n var promise = defer.promise;\n promise.cancel = function() {\n defer.reject();\n };\n return promise;\n};\n\n/**\n * @summary Collection of easing functions\n * {@link https://gist.github.com/frederickk/6165768}\n * @type {Object.<string, Function>}\n */\n// @formatter:off\n// jscs:disable\n/* jshint ignore:start */\nPSVUtils.animation.easings = {\n linear: function(t) { return t; },\n\n inQuad: function(t) { return t*t; },\n outQuad: function(t) { return t*(2-t); },\n inOutQuad: function(t) { return t<.5 ? 2*t*t : -1+(4-2*t)*t; },\n\n inCubic: function(t) { return t*t*t; },\n outCubic: function(t) { return (--t)*t*t+1; },\n inOutCubic: function(t) { return t<.5 ? 4*t*t*t : (t-1)*(2*t-2)*(2*t-2)+1; },\n\n inQuart: function(t) { return t*t*t*t; },\n outQuart: function(t) { return 1-(--t)*t*t*t; },\n inOutQuart: function(t) { return t<.5 ? 8*t*t*t*t : 1-8*(--t)*t*t*t; },\n\n inQuint: function(t) { return t*t*t*t*t; },\n outQuint: function(t) { return 1+(--t)*t*t*t*t; },\n inOutQuint: function(t) { return t<.5 ? 16*t*t*t*t*t : 1+16*(--t)*t*t*t*t; },\n\n inSine: function(t) { return 1-Math.cos(t*(Math.PI/2)); },\n outSine: function(t) { return Math.sin(t*(Math.PI/2)); },\n inOutSine: function(t) { return .5-.5*Math.cos(Math.PI*t); },\n\n inExpo: function(t) { return Math.pow(2, 10*(t-1)); },\n outExpo: function(t) { return 1-Math.pow(2, -10*t); },\n inOutExpo: function(t) { t=t*2-1; return t<0 ? .5*Math.pow(2, 10*t) : 1-.5*Math.pow(2, -10*t); },\n\n inCirc: function(t) { return 1-Math.sqrt(1-t*t); },\n outCirc: function(t) { t--; return Math.sqrt(1-t*t); },\n inOutCirc: function(t) { t*=2; return t<1 ? .5-.5*Math.sqrt(1-t*t) : .5+.5*Math.sqrt(1-(t-=2)*t); }\n};\n/* jshint ignore:end */\n// jscs:enable\n// @formatter:off\n\n/**\n * @summary Returns a function, that, when invoked, will only be triggered at most once during a given window of time.\n * @copyright underscore.js - modified by Clément Prévost {@link http://stackoverflow.com/a/27078401}\n * @param {Function} func\n * @param {int} wait\n * @returns {Function}\n */\nPSVUtils.throttle = function(func, wait) {\n var self, args, result;\n var timeout = null;\n var previous = 0;\n var later = function() {\n previous = Date.now();\n timeout = null;\n result = func.apply(self, args);\n if (!timeout) {\n self = args = null;\n }\n };\n return function() {\n var now = Date.now();\n if (!previous) {\n previous = now;\n }\n var remaining = wait - (now - previous);\n self = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(self, args);\n if (!timeout) {\n self = args = null;\n }\n }\n else if (!timeout) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n};\n\n/**\n * @summary Test if an object is a plain object\n * @description Test if an object is a plain object, i.e. is constructed\n * by the built-in Object constructor and inherits directly from Object.prototype\n * or null. Some built-in objects pass the test, e.g. Math which is a plain object\n * and some host or exotic objects may pass also.\n * {@link http://stackoverflow.com/a/5878101/1207670}\n * @param {*} obj\n * @returns {boolean}\n */\nPSVUtils.isPlainObject = function(obj) {\n // Basic check for Type object that's not null\n if (typeof obj === 'object' && obj !== null) {\n // If Object.getPrototypeOf supported, use it\n if (typeof Object.getPrototypeOf === 'function') {\n var proto = Object.getPrototypeOf(obj);\n return proto === Object.prototype || proto === null;\n }\n\n // Otherwise, use internal class\n // This should be reliable as if getPrototypeOf not supported, is pre-ES5\n return Object.prototype.toString.call(obj) === '[object Object]';\n }\n\n // Not an object\n return false;\n};\n\n/**\n * @summary Merges the enumerable attributes of two objects\n * @description Replaces arrays and alters the target object.\n * @copyright Nicholas Fisher <nfisher110@gmail.com>\n * @param {Object} target\n * @param {Object} src\n * @returns {Object} target\n */\nPSVUtils.deepmerge = function(target, src) {\n var first = src;\n\n return (function merge(target, src) {\n if (Array.isArray(src)) {\n if (!target || !Array.isArray(target)) {\n target = [];\n }\n else {\n target.length = 0;\n }\n src.forEach(function(e, i) {\n target[i] = merge(null, e);\n });\n }\n else if (typeof src === 'object') {\n if (!target || Array.isArray(target)) {\n target = {};\n }\n Object.keys(src).forEach(function(key) {\n if (typeof src[key] !== 'object' || !src[key] || !PSVUtils.isPlainObject(src[key])) {\n target[key] = src[key];\n }\n else if (src[key] != first) {\n if (!target[key]) {\n target[key] = merge(null, src[key]);\n }\n else {\n merge(target[key], src[key]);\n }\n }\n });\n }\n else {\n target = src;\n }\n\n return target;\n }(target, src));\n};\n\n/**\n * @summary Clones an object\n * @param {Object} src\n * @returns {Object}\n */\nPSVUtils.clone = function(src) {\n return PSVUtils.deepmerge(null, src);\n};\n\n/**\n * @summary Normalize mousewheel values accross browsers\n * @description From Facebook's Fixed Data Table\n * {@link https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js}\n * @copyright Facebook\n * @param {MouseWheelEvent} event\n * @returns {{spinX: number, spinY: number, pixelX: number, pixelY: number}}\n */\nPSVUtils.normalizeWheel = function(event) {\n var PIXEL_STEP = 10;\n var LINE_HEIGHT = 40;\n var PAGE_HEIGHT = 800;\n\n var sX = 0, sY = 0; // spinX, spinY\n var pX = 0, pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in event) { sY = event.detail; }\n if ('wheelDelta' in event) { sY = -event.wheelDelta / 120; }\n if ('wheelDeltaY' in event) { sY = -event.wheelDeltaY / 120; }\n if ('wheelDeltaX' in event) { sX = -event.wheelDeltaX / 120; }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in event && event.axis === event.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in event) { pY = event.deltaY; }\n if ('deltaX' in event) { pX = event.deltaX; }\n\n if ((pX || pY) && event.deltaMode) {\n if (event.deltaMode === 1) { // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n }\n else { // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) { sX = (pX < 1) ? -1 : 1; }\n if (pY && !sY) { sY = (pY < 1) ? -1 : 1; }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY\n };\n};\n\n/**\n * @callback ForEach\n * @param {*} value\n * @param {string} key\n */\n\n/**\n * Loops over enumerable properties of an object\n * @param {object} object\n * @param {ForEach} callback\n */\nPSVUtils.forEach = function(object, callback) {\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n callback(object[key], key);\n }\n }\n};\n\n\n/**\n * requestAnimationFrame polyfill\n * {@link http://mattsnider.com/cross-browser-and-legacy-supported-requestframeanimation}\n * @license MIT\n */\n(function(w) {\n \"use strict\";\n // most browsers have an implementation\n w.requestAnimationFrame = w.requestAnimationFrame ||\n w.mozRequestAnimationFrame || w.webkitRequestAnimationFrame ||\n w.msRequestAnimationFrame;\n w.cancelAnimationFrame = w.cancelAnimationFrame ||\n w.mozCancelAnimationFrame || w.webkitCancelAnimationFrame ||\n w.msCancelAnimationFrame;\n\n // polyfill, when necessary\n if (!w.requestAnimationFrame) {\n var aAnimQueue = [],\n aProcessing = [],\n iRequestId = 0,\n iIntervalId;\n\n // create a mock requestAnimationFrame function\n w.requestAnimationFrame = function(callback) {\n aAnimQueue.push([++iRequestId, callback]);\n\n if (!iIntervalId) {\n iIntervalId = setInterval(function() {\n if (aAnimQueue.length) {\n var time = +new Date();\n // Process all of the currently outstanding frame\n // requests, but none that get added during the\n // processing.\n // Swap the arrays so we don't have to create a new\n // array every frame.\n var temp = aProcessing;\n aProcessing = aAnimQueue;\n aAnimQueue = temp;\n while (aProcessing.length) {\n aProcessing.shift()[1](time);\n }\n } else {\n // don't continue the interval, if unnecessary\n clearInterval(iIntervalId);\n iIntervalId = undefined;\n }\n }, 1000 / 50); // estimating support for 50 frames per second\n }\n\n return iRequestId;\n };\n\n // create a mock cancelAnimationFrame function\n w.cancelAnimationFrame = function(requestId) {\n // find the request ID and remove it\n var i, j;\n for (i = 0, j = aAnimQueue.length; i < j; i += 1) {\n if (aAnimQueue[i][0] === requestId) {\n aAnimQueue.splice(i, 1);\n return;\n }\n }\n\n // If it's not in the queue, it may be in the set we're currently\n // processing (if cancelAnimationFrame is called from within a\n // requestAnimationFrame callback).\n for (i = 0, j = aProcessing.length; i < j; i += 1) {\n if (aProcessing[i][0] === requestId) {\n aProcessing.splice(i, 1);\n return;\n }\n }\n };\n }\n})(window);\n\n\nPhotoSphereViewer.ICONS['compass.svg'] = '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 100 100\" xml:space=\"preserve\"><path d=\"M49.997,0C22.38,0.004,0.005,22.383,0,50.002C0.005,77.614,22.38,99.995,49.997,100C77.613,99.995,99.996,77.614,100,50.002C99.996,22.383,77.613,0.004,49.997,0z M49.997,88.81c-21.429-0.04-38.772-17.378-38.809-38.807c0.037-21.437,17.381-38.775,38.809-38.812C71.43,11.227,88.769,28.567,88.81,50.002C88.769,71.432,71.43,88.77,49.997,88.81z\"/><path d=\"M72.073,25.891L40.25,41.071l-0.003-0.004l-0.003,0.009L27.925,74.109l31.82-15.182l0.004,0.004l0.002-0.007l-0.002-0.004L72.073,25.891z M57.837,54.411L44.912,42.579l21.092-10.062L57.837,54.411z\"/><!--Created by iconoci from the Noun Project--></svg>';\n\nPhotoSphereViewer.ICONS['download.svg'] = '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 100 100\" xml:space=\"preserve\"><path d=\"M83.285,35.575H66.271L66.277,3H32.151v32.575H16.561l33.648,32.701L83.285,35.575z\"/><path d=\"M83.316,64.199v16.32H16.592v-16.32H-0.094v32.639H100V64.199H83.316z\"/><!--Created by Michael Zenaty from the Noun Project--></svg>';\n\nPhotoSphereViewer.ICONS['fullscreen-in.svg'] = '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 100 100\" xml:space=\"preserve\"><polygon points=\"100,39.925 87.105,39.925 87.105,18.895 66.075,18.895 66.075,6 100,6\"/><polygon points=\"100,93.221 66.075,93.221 66.075,80.326 87.105,80.326 87.105,59.295 100,59.295\"/><polygon points=\"33.925,93.221 0,93.221 0,59.295 12.895,59.295 12.895,80.326 33.925,80.326\"/><polygon points=\"12.895,39.925 0,39.925 0,6 33.925,6 33.925,18.895 12.895,18.895\"/><!--Created by Garrett Knoll from the Noun Project--></svg>';\n\nPhotoSphereViewer.ICONS['fullscreen-out.svg'] = '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 100 100\" xml:space=\"preserve\"><polygon points=\"66.075,7 78.969,7 78.969,28.031 100,28.031 100,40.925 66.075,40.925\"/><polygon points=\"66.075,60.295 100,60.295 100,73.19 78.969,73.19 78.969,94.221 66.075,94.221\"/><polygon points=\"0,60.295 33.925,60.295 33.925,94.221 21.031,94.221 21.031,73.19 0,73.19\"/><polygon points=\"21.031,7 33.925,7 33.925,40.925 0,40.925 0,28.031 21.031,28.031\"/><!--Created by Garrett Knoll from the Noun Project--></svg>';\n\nPhotoSphereViewer.ICONS['pin.svg'] = '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 48 48\" enable-background=\"new 0 0 48 48\" xml:space=\"preserve\"><path d=\"M24,0C13.798,0,5.499,8.3,5.499,18.501c0,10.065,17.57,28.635,18.318,29.421C23.865,47.972,23.931,48,24,48s0.135-0.028,0.183-0.078c0.748-0.786,18.318-19.355,18.318-29.421C42.501,8.3,34.202,0,24,0z M24,7.139c5.703,0,10.342,4.64,10.342,10.343c0,5.702-4.639,10.342-10.342,10.342c-5.702,0-10.34-4.64-10.34-10.342C13.66,11.778,18.298,7.139,24,7.139z\"/><!--Created by Daniele Marucci from the Noun Project--></svg>';\n\nPhotoSphereViewer.ICONS['play-active.svg'] = '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 41 41\" enable-background=\"new 0 0 41 41\" xml:space=\"preserve\"><path d=\"M40.5,14.1c-0.1-0.1-1.2-0.5-2.898-1C37.5,13.1,37.4,13,37.4,12.9C34.5,6.5,28,2,20.5,2S6.6,6.5,3.7,12.9c0,0.1-0.1,0.1-0.2,0.2c-1.7,0.6-2.8,1-2.9,1L0,14.4v12.1l0.6,0.2c0.1,0,1.1,0.399,2.7,0.899c0.1,0,0.2,0.101,0.2,0.199C6.3,34.4,12.9,39,20.5,39c7.602,0,14.102-4.6,16.9-11.1c0-0.102,0.1-0.102,0.199-0.2c1.699-0.601,2.699-1,2.801-1l0.6-0.3V14.3L40.5,14.1z M6.701,11.5C9.7,7,14.8,4,20.5,4c5.8,0,10.9,3,13.8,7.5c0.2,0.3-0.1,0.6-0.399,0.5c-3.799-1-8.799-2-13.6-2c-4.7,0-9.5,1-13.2,2C6.801,12.1,6.601,11.8,6.701,11.5z M25.1,20.3L18.7,24c-0.3,0.2-0.7,0-0.7-0.5v-7.4c0-0.4,0.4-0.6,0.7-0.4 l6.399,3.8C25.4,19.6,25.4,20.1,25.1,20.3z M34.5,29.201C31.602,33.9,26.4,37,20.5,37c-5.9,0-11.1-3.1-14-7.898c-0.2-0.302,0.1-0.602,0.4-0.5c3.9,1,8.9,2.1,13.6,2.1c5,0,9.9-1,13.602-2C34.4,28.602,34.602,28.9,34.5,29.201z\"/><!--Created by Nick Bluth from the Noun Project--></svg>';\n\nPhotoSphereViewer.ICONS['play.svg'] = '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 41 41\" enable-background=\"new 0 0 41 41\" xml:space=\"preserve\"><path d=\"M40.5,14.1c-0.1-0.1-1.2-0.5-2.899-1c-0.101,0-0.2-0.1-0.2-0.2C34.5,6.5,28,2,20.5,2S6.6,6.5,3.7,12.9c0,0.1-0.1,0.1-0.2,0.2c-1.7,0.6-2.8,1-2.9,1L0,14.4v12.1l0.6,0.2c0.1,0,1.1,0.4,2.7,0.9c0.1,0,0.2,0.1,0.2,0.199C6.3,34.4,12.9,39,20.5,39c7.601,0,14.101-4.6,16.9-11.1c0-0.101,0.1-0.101,0.2-0.2c1.699-0.6,2.699-1,2.8-1l0.6-0.3V14.3L40.5,14.1zM20.5,4c5.8,0,10.9,3,13.8,7.5c0.2,0.3-0.1,0.6-0.399,0.5c-3.8-1-8.8-2-13.6-2c-4.7,0-9.5,1-13.2,2c-0.3,0.1-0.5-0.2-0.4-0.5C9.7,7,14.8,4,20.5,4z M20.5,37c-5.9,0-11.1-3.1-14-7.899c-0.2-0.301,0.1-0.601,0.4-0.5c3.9,1,8.9,2.1,13.6,2.1c5,0,9.9-1,13.601-2c0.3-0.1,0.5,0.2,0.399,0.5C31.601,33.9,26.4,37,20.5,37z M39.101,24.9c0,0.1-0.101,0.3-0.2,0.3c-2.5,0.9-10.4,3.6-18.4,3.6c-7.1,0-15.6-2.699-18.3-3.6C2.1,25.2,2,25,2,24.9V16c0-0.1,0.1-0.3,0.2-0.3c2.6-0.9,10.6-3.6,18.2-3.6c7.5,0,15.899,2.7,18.5,3.6c0.1,0,0.2,0.2,0.2,0.3V24.9z\"/><path d=\"M18.7,24l6.4-3.7c0.3-0.2,0.3-0.7,0-0.8l-6.4-3.8c-0.3-0.2-0.7,0-0.7,0.4v7.4C18,24,18.4,24.2,18.7,24z\"/><!--Created by Nick Bluth from the Noun Project--></svg>';\n\nPhotoSphereViewer.ICONS['zoom-in.svg'] = '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 20 20\" enable-background=\"new 0 0 20 20\" xml:space=\"preserve\"><path d=\"M14.043,12.22c2.476-3.483,1.659-8.313-1.823-10.789C8.736-1.044,3.907-0.228,1.431,3.255c-2.475,3.482-1.66,8.312,1.824,10.787c2.684,1.908,6.281,1.908,8.965,0l4.985,4.985c0.503,0.504,1.32,0.504,1.822,0c0.505-0.503,0.505-1.319,0-1.822L14.043,12.22z M7.738,13.263c-3.053,0-5.527-2.475-5.527-5.525c0-3.053,2.475-5.527,5.527-5.527c3.05,0,5.524,2.474,5.524,5.527C13.262,10.789,10.788,13.263,7.738,13.263z\"/><polygon points=\"8.728,4.009 6.744,4.009 6.744,6.746 4.006,6.746 4.006,8.73 6.744,8.73 6.744,11.466 8.728,11.466 8.728,8.73 11.465,8.73 11.465,6.746 8.728,6.746\"/><!--Created by Ryan Canning from the Noun Project--></svg>';\n\nPhotoSphereViewer.ICONS['zoom-out.svg'] = '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 20 20\" enable-background=\"new 0 0 20 20\" xml:space=\"preserve\"><path d=\"M14.043,12.22c2.476-3.483,1.659-8.313-1.823-10.789C8.736-1.044,3.907-0.228,1.431,3.255c-2.475,3.482-1.66,8.312,1.824,10.787c2.684,1.908,6.281,1.908,8.965,0l4.985,4.985c0.503,0.504,1.32,0.504,1.822,0c0.505-0.503,0.505-1.319,0-1.822L14.043,12.22z M7.738,13.263c-3.053,0-5.527-2.475-5.527-5.525c0-3.053,2.475-5.527,5.527-5.527c3.05,0,5.524,2.474,5.524,5.527C13.262,10.789,10.788,13.263,7.738,13.263z\"/><rect x=\"4.006\" y=\"6.746\" width=\"7.459\" height=\"1.984\"/><!--Created by Ryan Canning from the Noun Project--></svg>';\nreturn PhotoSphereViewer;\n}));\n","var userDown = false //用户鼠标判断\nvar bgMove = false\n\nvar indexPath = $('body').attr('data-path')\n\nvar until = {\n handleModel() {\n // m新增,点击区域隐藏\n $(document).on('click', '.pub-hide-modal', function() {\n $(this).fadeOut()\n })\n $(document).on('click', '.fullscreen-video', function() {\n until.pauseVideo()\n $(this).fadeOut()\n return false\n })\n $(document).on('click', '.full-pic-modal', function() {\n $(this).fadeOut()\n })\n\n // 点击背景关闭弹窗\n $(document).on('click', '.pub-modal-mask', function() {\n until.pauseVideo()\n $(this).fadeOut()\n })\n $(document).on('click', '.part-screen', function(e) {\n return false\n })\n $(document).on('click', '.close-mask-icon', function() {\n until.pauseVideo()\n $(this).parents('.pub-modal-mask').fadeOut()\n })\n $(document).on('click', '.close-full-video', function() {\n until.pauseVideo()\n $(this).parents('.fullscreen-video').fadeOut()\n })\n $(document).on('click', '.close-icon', function() {\n $(this).parents('.pub-modal').fadeOut()\n })\n $(document).on('click', '.go-back', function() {\n $('.mod-full-picture').fadeOut()\n return false\n })\n },\n // 重力感应\n acceler() {\n if (window.DeviceOrientationEvent) {\n window.addEventListener('deviceorientation', handleOrientation, false);\n function handleOrientation(event) {\n var x = event.beta; // 范围是[-180, 180]\n var y = event.gamma; // 范围是[-90, 90]\n \n // 这里我们把x的数值控制在-90到90,因为我们不需要让设备翻转倒过来。\n if (x > 60) {x = 60};\n if (x < -60) {x = -60};\n \n // 设置偏移最大值\n var max = 50;\n var pics = document.getElementsByClassName('bg-move')\n for(let i = 0; i < pics.length; i++) {\n pics[0].style = 'transform: translate3d('+max*x/120+'px, '+max*y/120+'px, 0px)'\n }\n }\n }\n },\n pauseVideo() {\n // video暂停播放\n var videoDom = document.getElementsByTagName('video')\n for(let i = 0; i < videoDom.length; i++) {\n videoDom[i].pause()\n }\n },\n decr(r) {\n var e = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@!~*-_.()'\".split(\"\");\n var n = [];\n var a = [];\n r.split(\"\").reverse().forEach(function (r, t) {\n var o = e.indexOf(r);\n if (parseInt((t + 1) % 2) == 1) {\n a.push(o)\n } else {\n var p = parseInt(o - a[(t + 1) / 2 - 1]);\n n.push(e[p])\n }\n });\n var t = n.join(\"\").replace(/@/g, \"%\");\n return decodeURIComponent(t)\n },\n /**\n * 解密数据\n */\n deCodeArg(target) {\n var srcMap = {};\n if (JSON.parse) {\n srcMap = JSON.parse(until.decr(target));\n } else {\n srcMap = eval('(' + until.decr(target) + ')');\n }\n return srcMap;\n },\n //立即预约\n bookClick() {\n\n $('.book-icon').click(function() {\n $('.comment-page').fadeIn()\n })\n // 返回\n $('#book-gack-btn').click(function() {\n $('.comment-page').fadeOut()\n })\n \n // 预约成功\n var successModal = `<div class=\"progress-modal reset-modal book-success-modal\" style=\"display: block;\">\n <p class=\"tips\">预约成功!</p>\n <div class=\"btn-wrap\">\n <div class=\"btn success-btn book-success-btn\">是</div>\n </div>\n </div>`\n $('.book-btn-bottom').click(function() {\n $('.comment-page').append(successModal)\n })\n $('.comment-page').on('click', '.book-success-btn', function() {\n $('.book-success-modal').remove()\n })\n\n // 视频播放\n $('.poster-lake').click(function() {\n $('.book-video').hide()\n $('#book-video-wrapper').show()\n $('#book-lake-video').show()\n document.getElementById('book-lake-video').play()\n })\n $('.poster-taiga').click(function() {\n $('.book-video').hide()\n $('#book-video-wrapper').show()\n $('#book-taiga-video').show()\n document.getElementById('book-taiga-video').play()\n })\n $('.poster-elden').click(function() {\n $('.book-video').hide()\n $('#book-video-wrapper').show()\n $('#book-elden-video').show()\n document.getElementById('book-elden-video').play()\n })\n },\n // 右上角工具栏\n toolbarClick() {\n // 暂停\n $('.toolbar-box').find('.bgm-icon').click(function() {\n var $this = $(this)\n var audio = document.getElementById('bgm-audio')\n if($this.hasClass('pause')) {\n audio.play()\n $this.removeClass('pause')\n } else {\n audio.pause()\n $this.addClass('pause')\n }\n })\n\n // 评论\n $('.toolbar-box').find('.comment-icon').click(function() {\n window.open('http://hdzt.duowan.com/1806/m_393864686995.html')\n })\n\n // 重置进度\n $('.toolbar-box').find('.reset-icon').click(function() {\n $('.reset-modal').fadeIn()\n })\n\n $('.yes-btn').click(function() {\n localStorage.removeItem('hunter_permision')\n localStorage.removeItem('entry')\n window.location.href = indexPath\n })\n\n $('.no-btn').click(function() {\n $('.reset-modal').fadeOut()\n })\n },\n //确认装备 \n shooting() {\n var huntVideo = document.getElementById('hunt-video')\n var huntVideoB = document.getElementById('hunt-video-b')\n\n $('.start-equit-btn').click(function() {\n var bag = $('#equit-modal').attr('data-bag')\n $('#equit-video-wrap').find('video').hide()\n if(bag == 'A') {\n $(huntVideo).show()\n huntVideo.play()\n }\n if(bag == 'B') {\n $(huntVideoB).show()\n huntVideoB.play()\n }\n $('#equit-video-wrap').fadeIn()\n })\n\n huntVideo.addEventListener('ended', function() {\n $('#equit-video-wrap').fadeOut()\n })\n huntVideoB.addEventListener('ended', function() {\n $('#equit-video-wrap').fadeOut()\n })\n\n // 开始狩猎\n $('.hunt-btn').click(function(){\n $('.fullscreen-modal').hide()\n $('#equit-modal').show()\n })\n\n $('.nav-item-wrap').click(function() {\n $('.nav-item-wrap').removeClass('active')\n $(this).parents('.container').find('.main').hide()\n $(this).addClass('active')\n var ind = $(this).attr('data-ind')\n var bag = $('#equit-modal').attr('data-bag')\n\n if(ind == 1 && bag == 'A'){\n $('#weapon-modal').show()\n }\n if(ind == 2 && bag == 'A'){\n $('#fodder-modal').show()\n }\n if(ind == 1 && bag == 'B'){\n $('#weapon-modal-b').show()\n }\n if(ind == 2 && bag == 'B'){\n $('#fodder-modal-b').show()\n }\n })\n\n $('.bag-a').click(function() {\n var $this = $(this)\n if(!$this.hasClass('bag-a-active')) {\n $this.addClass('bag-a-active')\n $('.bag-b').removeClass('bag-b-active')\n $('#equit-modal').attr('data-bag', 'A')\n $('.nav-item-wrap').eq(0).trigger('click')\n }\n })\n\n $('.bag-b').click(function() {\n var $this = $(this)\n if(!$this.hasClass('bag-b-active')) {\n $this.addClass('bag-b-active')\n $('.bag-a').removeClass('bag-a-active')\n $('#equit-modal').attr('data-bag', 'B')\n $('.nav-item-wrap').eq(0).trigger('click')\n }\n })\n },\n handleReady(x, y, viewer, view_lgt = 6, view_lat = 0) {\n var lakeFlag = false\n\n viewer.on('ready', function() {\n $('.loading-bg').hide()\n viewer.rotate({\n x: 0,\n y: 0\n });\n viewer.animate({\n x,\n y\n },2000);\n\n // 自动旋转\n var container = document.getElementsByClassName('psv-hud-svg-container')[0]\n var $toolbar = $('.toolbar-box')\n var $progress = $('.progress-modal-moblie')\n var $nav = $('.nav')\n var timer = null\n container.addEventListener('touchstart', function() {\n clearTimeout(timer)\n\n $toolbar.fadeIn()\n $progress.fadeIn()\n $nav.fadeIn()\n\n timer = setTimeout(() => {\n\n $toolbar.fadeOut()\n $progress.fadeOut()\n $nav.fadeOut()\n\n viewer.startAutorotate()\n }, 5000);\n })\n });\n\n viewer.on('position-updated', function(position) {\n let lgt = position.longitude\n let lat = position.latitude\n if(lgt > view_lgt && lat < view_lat && !lakeFlag) {\n lakeFlag = true\n $('.progress-modal-moblie').fadeIn()\n $('.suggest-modal').fadeIn()\n $('.nav').fadeIn()\n\n viewer.startAutorotate()\n }\n })\n },\n}\n\nexport default until",";(function () {\n\t'use strict';\n\n\t/**\n\t * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.\n\t *\n\t * @codingstandard ftlabs-jsv2\n\t * @copyright The Financial Times Limited [All Rights Reserved]\n\t * @license MIT License (see LICENSE.txt)\n\t */\n\n\t/*jslint browser:true, node:true*/\n\t/*global define, Event, Node*/\n\n\n\t/**\n\t * Instantiate fast-clicking listeners on the specified layer.\n\t *\n\t * @constructor\n\t * @param {Element} layer The layer to listen on\n\t * @param {Object} [options={}] The options to override the defaults\n\t */\n\tfunction FastClick(layer, options) {\n\t\tvar oldOnClick;\n\n\t\toptions = options || {};\n\n\t\t/**\n\t\t * Whether a click is currently being tracked.\n\t\t *\n\t\t * @type boolean\n\t\t */\n\t\tthis.trackingClick = false;\n\n\n\t\t/**\n\t\t * Timestamp for when click tracking started.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.trackingClickStart = 0;\n\n\n\t\t/**\n\t\t * The element being tracked for a click.\n\t\t *\n\t\t * @type EventTarget\n\t\t */\n\t\tthis.targetElement = null;\n\n\n\t\t/**\n\t\t * X-coordinate of touch start event.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchStartX = 0;\n\n\n\t\t/**\n\t\t * Y-coordinate of touch start event.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchStartY = 0;\n\n\n\t\t/**\n\t\t * ID of the last touch, retrieved from Touch.identifier.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.lastTouchIdentifier = 0;\n\n\n\t\t/**\n\t\t * Touchmove boundary, beyond which a click will be cancelled.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchBoundary = options.touchBoundary || 10;\n\n\n\t\t/**\n\t\t * The FastClick layer.\n\t\t *\n\t\t * @type Element\n\t\t */\n\t\tthis.layer = layer;\n\n\t\t/**\n\t\t * The minimum time between tap(touchstart and touchend) events\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.tapDelay = options.tapDelay || 200;\n\n\t\t/**\n\t\t * The maximum time for a tap\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.tapTimeout = options.tapTimeout || 700;\n\n\t\tif (FastClick.notNeeded(layer)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Some old versions of Android don't have Function.prototype.bind\n\t\tfunction bind(method, context) {\n\t\t\treturn function() { return method.apply(context, arguments); };\n\t\t}\n\n\n\t\tvar methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];\n\t\tvar context = this;\n\t\tfor (var i = 0, l = methods.length; i < l; i++) {\n\t\t\tcontext[methods[i]] = bind(context[methods[i]], context);\n\t\t}\n\n\t\t// Set up event handlers as required\n\t\tif (deviceIsAndroid) {\n\t\t\tlayer.addEventListener('mouseover', this.onMouse, true);\n\t\t\tlayer.addEventListener('mousedown', this.onMouse, true);\n\t\t\tlayer.addEventListener('mouseup', this.onMouse, true);\n\t\t}\n\n\t\tlayer.addEventListener('click', this.onClick, true);\n\t\tlayer.addEventListener('touchstart', this.onTouchStart, false);\n\t\tlayer.addEventListener('touchmove', this.onTouchMove, false);\n\t\tlayer.addEventListener('touchend', this.onTouchEnd, false);\n\t\tlayer.addEventListener('touchcancel', this.onTouchCancel, false);\n\n\t\t// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n\t\t// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick\n\t\t// layer when they are cancelled.\n\t\tif (!Event.prototype.stopImmediatePropagation) {\n\t\t\tlayer.removeEventListener = function(type, callback, capture) {\n\t\t\t\tvar rmv = Node.prototype.removeEventListener;\n\t\t\t\tif (type === 'click') {\n\t\t\t\t\trmv.call(layer, type, callback.hijacked || callback, capture);\n\t\t\t\t} else {\n\t\t\t\t\trmv.call(layer, type, callback, capture);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlayer.addEventListener = function(type, callback, capture) {\n\t\t\t\tvar adv = Node.prototype.addEventListener;\n\t\t\t\tif (type === 'click') {\n\t\t\t\t\tadv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {\n\t\t\t\t\t\tif (!event.propagationStopped) {\n\t\t\t\t\t\t\tcallback(event);\n\t\t\t\t\t\t}\n\t\t\t\t\t}), capture);\n\t\t\t\t} else {\n\t\t\t\t\tadv.call(layer, type, callback, capture);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t// If a handler is already declared in the element's onclick attribute, it will be fired before\n\t\t// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and\n\t\t// adding it as listener.\n\t\tif (typeof layer.onclick === 'function') {\n\n\t\t\t// Android browser on at least 3.2 requires a new reference to the function in layer.onclick\n\t\t\t// - the old one won't work if passed to addEventListener directly.\n\t\t\toldOnClick = layer.onclick;\n\t\t\tlayer.addEventListener('click', function(event) {\n\t\t\t\toldOnClick(event);\n\t\t\t}, false);\n\t\t\tlayer.onclick = null;\n\t\t}\n\t}\n\n\t/**\n\t* Windows Phone 8.1 fakes user agent string to look like Android and iPhone.\n\t*\n\t* @type boolean\n\t*/\n\tvar deviceIsWindowsPhone = navigator.userAgent.indexOf(\"Windows Phone\") >= 0;\n\n\t/**\n\t * Android requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;\n\n\n\t/**\n\t * iOS requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;\n\n\n\t/**\n\t * iOS 4 requires an exception for select elements.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOS4 = deviceIsIOS && (/OS 4_\\d(_\\d)?/).test(navigator.userAgent);\n\n\n\t/**\n\t * iOS 6.0-7.* requires the target element to be manually derived\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\\d/).test(navigator.userAgent);\n\n\t/**\n\t * BlackBerry requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;\n\n\t/**\n\t * Determine whether a given element requires a native click.\n\t *\n\t * @param {EventTarget|Element} target Target DOM element\n\t * @returns {boolean} Returns true if the element needs a native click\n\t */\n\tFastClick.prototype.needsClick = function(target) {\n\t\tswitch (target.nodeName.toLowerCase()) {\n\n\t\t// Don't send a synthetic click to disabled inputs (issue #62)\n\t\tcase 'button':\n\t\tcase 'select':\n\t\tcase 'textarea':\n\t\t\tif (target.disabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'input':\n\n\t\t\t// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)\n\t\t\tif ((deviceIsIOS && target.type === 'file') || target.disabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'label':\n\t\tcase 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames\n\t\tcase 'video':\n\t\t\treturn true;\n\t\t}\n\n\t\treturn (/\\bneedsclick\\b/).test(target.className);\n\t};\n\n\n\t/**\n\t * Determine whether a given element requires a call to focus to simulate click into element.\n\t *\n\t * @param {EventTarget|Element} target Target DOM element\n\t * @returns {boolean} Returns true if the element requires a call to focus to simulate native click.\n\t */\n\tFastClick.prototype.needsFocus = function(target) {\n\t\tswitch (target.nodeName.toLowerCase()) {\n\t\tcase 'textarea':\n\t\t\treturn true;\n\t\tcase 'select':\n\t\t\treturn !deviceIsAndroid;\n\t\tcase 'input':\n\t\t\tswitch (target.type) {\n\t\t\tcase 'button':\n\t\t\tcase 'checkbox':\n\t\t\tcase 'file':\n\t\t\tcase 'image':\n\t\t\tcase 'radio':\n\t\t\tcase 'submit':\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// No point in attempting to focus disabled inputs\n\t\t\treturn !target.disabled && !target.readOnly;\n\t\tdefault:\n\t\t\treturn (/\\bneedsfocus\\b/).test(target.className);\n\t\t}\n\t};\n\n\n\t/**\n\t * Send a click event to the specified element.\n\t *\n\t * @param {EventTarget|Element} targetElement\n\t * @param {Event} event\n\t */\n\tFastClick.prototype.sendClick = function(targetElement, event) {\n\t\tvar clickEvent, touch;\n\n\t\t// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)\n\t\tif (document.activeElement && document.activeElement !== targetElement) {\n\t\t\tdocument.activeElement.blur();\n\t\t}\n\n\t\ttouch = event.changedTouches[0];\n\n\t\t// Synthesise a click event, with an extra attribute so it can be tracked\n\t\tclickEvent = document.createEvent('MouseEvents');\n\t\tclickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);\n\t\tclickEvent.forwardedTouchEvent = true;\n\t\ttargetElement.dispatchEvent(clickEvent);\n\t};\n\n\tFastClick.prototype.determineEventType = function(targetElement) {\n\n\t\t//Issue #159: Android Chrome Select Box does not open with a synthetic click event\n\t\tif (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {\n\t\t\treturn 'mousedown';\n\t\t}\n\n\t\treturn 'click';\n\t};\n\n\n\t/**\n\t * @param {EventTarget|Element} targetElement\n\t */\n\tFastClick.prototype.focus = function(targetElement) {\n\t\tvar length;\n\n\t\t// Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.\n\t\tif (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {\n\t\t\tlength = targetElement.value.length;\n\t\t\ttargetElement.setSelectionRange(length, length);\n\t\t} else {\n\t\t\ttargetElement.focus();\n\t\t}\n\t};\n\n\n\t/**\n\t * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.\n\t *\n\t * @param {EventTarget|Element} targetElement\n\t */\n\tFastClick.prototype.updateScrollParent = function(targetElement) {\n\t\tvar scrollParent, parentElement;\n\n\t\tscrollParent = targetElement.fastClickScrollParent;\n\n\t\t// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the\n\t\t// target element was moved to another parent.\n\t\tif (!scrollParent || !scrollParent.contains(targetElement)) {\n\t\t\tparentElement = targetElement;\n\t\t\tdo {\n\t\t\t\tif (parentElement.scrollHeight > parentElement.offsetHeight) {\n\t\t\t\t\tscrollParent = parentElement;\n\t\t\t\t\ttargetElement.fastClickScrollParent = parentElement;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tparentElement = parentElement.parentElement;\n\t\t\t} while (parentElement);\n\t\t}\n\n\t\t// Always update the scroll top tracker if possible.\n\t\tif (scrollParent) {\n\t\t\tscrollParent.fastClickLastScrollTop = scrollParent.scrollTop;\n\t\t}\n\t};\n\n\n\t/**\n\t * @param {EventTarget} targetElement\n\t * @returns {Element|EventTarget}\n\t */\n\tFastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {\n\n\t\t// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.\n\t\tif (eventTarget.nodeType === Node.TEXT_NODE) {\n\t\t\treturn eventTarget.parentNode;\n\t\t}\n\n\t\treturn eventTarget;\n\t};\n\n\n\t/**\n\t * On touch start, record the position and scroll offset.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchStart = function(event) {\n\t\tvar targetElement, touch, selection;\n\n\t\t// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).\n\t\tif (event.targetTouches.length > 1) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttargetElement = this.getTargetElementFromEventTarget(event.target);\n\t\ttouch = event.targetTouches[0];\n\n\t\tif (deviceIsIOS) {\n\n\t\t\t// Only trusted events will deselect text on iOS (issue #49)\n\t\t\tselection = window.getSelection();\n\t\t\tif (selection.rangeCount && !selection.isCollapsed) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!deviceIsIOS4) {\n\n\t\t\t\t// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):\n\t\t\t\t// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched\n\t\t\t\t// with the same identifier as the touch event that previously triggered the click that triggered the alert.\n\t\t\t\t// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an\n\t\t\t\t// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.\n\t\t\t\t// Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,\n\t\t\t\t// which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,\n\t\t\t\t// random integers, it's safe to to continue if the identifier is 0 here.\n\t\t\t\tif (touch.identifier && touch.identifier === this.lastTouchIdentifier) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tthis.lastTouchIdentifier = touch.identifier;\n\n\t\t\t\t// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:\n\t\t\t\t// 1) the user does a fling scroll on the scrollable layer\n\t\t\t\t// 2) the user stops the fling scroll with another tap\n\t\t\t\t// then the event.target of the last 'touchend' event will be the element that was under the user's finger\n\t\t\t\t// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check\n\t\t\t\t// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).\n\t\t\t\tthis.updateScrollParent(targetElement);\n\t\t\t}\n\t\t}\n\n\t\tthis.trackingClick = true;\n\t\tthis.trackingClickStart = event.timeStamp;\n\t\tthis.targetElement = targetElement;\n\n\t\tthis.touchStartX = touch.pageX;\n\t\tthis.touchStartY = touch.pageY;\n\n\t\t// Prevent phantom clicks on fast double-tap (issue #36)\n\t\tif ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Based on a touchmove event object, check whether the touch has moved past a boundary since it started.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.touchHasMoved = function(event) {\n\t\tvar touch = event.changedTouches[0], boundary = this.touchBoundary;\n\n\t\tif (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * Update the last position.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchMove = function(event) {\n\t\tif (!this.trackingClick) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If the touch has moved, cancel the click tracking\n\t\tif (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {\n\t\t\tthis.trackingClick = false;\n\t\t\tthis.targetElement = null;\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Attempt to find the labelled control for the given label element.\n\t *\n\t * @param {EventTarget|HTMLLabelElement} labelElement\n\t * @returns {Element|null}\n\t */\n\tFastClick.prototype.findControl = function(labelElement) {\n\n\t\t// Fast path for newer browsers supporting the HTML5 control attribute\n\t\tif (labelElement.control !== undefined) {\n\t\t\treturn labelElement.control;\n\t\t}\n\n\t\t// All browsers under test that support touch events also support the HTML5 htmlFor attribute\n\t\tif (labelElement.htmlFor) {\n\t\t\treturn document.getElementById(labelElement.htmlFor);\n\t\t}\n\n\t\t// If no for attribute exists, attempt to retrieve the first labellable descendant element\n\t\t// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label\n\t\treturn labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');\n\t};\n\n\n\t/**\n\t * On touch end, determine whether to send a click event at once.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchEnd = function(event) {\n\t\tvar forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;\n\n\t\tif (!this.trackingClick) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Prevent phantom clicks on fast double-tap (issue #36)\n\t\tif ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n\t\t\tthis.cancelNextClick = true;\n\t\t\treturn true;\n\t\t}\n\n\t\tif ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Reset to prevent wrong click cancel on input (issue #156).\n\t\tthis.cancelNextClick = false;\n\n\t\tthis.lastClickTime = event.timeStamp;\n\n\t\ttrackingClickStart = this.trackingClickStart;\n\t\tthis.trackingClick = false;\n\t\tthis.trackingClickStart = 0;\n\n\t\t// On some iOS devices, the targetElement supplied with the event is invalid if the layer\n\t\t// is performing a transition or scroll, and has to be re-detected manually. Note that\n\t\t// for this to function correctly, it must be called *after* the event target is checked!\n\t\t// See issue #57; also filed as rdar://13048589 .\n\t\tif (deviceIsIOSWithBadTarget) {\n\t\t\ttouch = event.changedTouches[0];\n\n\t\t\t// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null\n\t\t\ttargetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;\n\t\t\ttargetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;\n\t\t}\n\n\t\ttargetTagName = targetElement.tagName.toLowerCase();\n\t\tif (targetTagName === 'label') {\n\t\t\tforElement = this.findControl(targetElement);\n\t\t\tif (forElement) {\n\t\t\t\tthis.focus(targetElement);\n\t\t\t\tif (deviceIsAndroid) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\ttargetElement = forElement;\n\t\t\t}\n\t\t} else if (this.needsFocus(targetElement)) {\n\n\t\t\t// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.\n\t\t\t// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).\n\t\t\tif ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {\n\t\t\t\tthis.targetElement = null;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.focus(targetElement);\n\t\t\tthis.sendClick(targetElement, event);\n\n\t\t\t// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.\n\t\t\t// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)\n\t\t\tif (!deviceIsIOS || targetTagName !== 'select') {\n\t\t\t\tthis.targetElement = null;\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tif (deviceIsIOS && !deviceIsIOS4) {\n\n\t\t\t// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled\n\t\t\t// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).\n\t\t\tscrollParent = targetElement.fastClickScrollParent;\n\t\t\tif (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Prevent the actual click from going though - unless the target node is marked as requiring\n\t\t// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.\n\t\tif (!this.needsClick(targetElement)) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.sendClick(targetElement, event);\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * On touch cancel, stop tracking the click.\n\t *\n\t * @returns {void}\n\t */\n\tFastClick.prototype.onTouchCancel = function() {\n\t\tthis.trackingClick = false;\n\t\tthis.targetElement = null;\n\t};\n\n\n\t/**\n\t * Determine mouse events which should be permitted.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onMouse = function(event) {\n\n\t\t// If a target element was never set (because a touch event was never fired) allow the event\n\t\tif (!this.targetElement) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (event.forwardedTouchEvent) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Programmatically generated events targeting a specific element should be permitted\n\t\tif (!event.cancelable) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Derive and check the target element to see whether the mouse event needs to be permitted;\n\t\t// unless explicitly enabled, prevent non-touch click events from triggering actions,\n\t\t// to prevent ghost/doubleclicks.\n\t\tif (!this.needsClick(this.targetElement) || this.cancelNextClick) {\n\n\t\t\t// Prevent any user-added listeners declared on FastClick element from being fired.\n\t\t\tif (event.stopImmediatePropagation) {\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t} else {\n\n\t\t\t\t// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n\t\t\t\tevent.propagationStopped = true;\n\t\t\t}\n\n\t\t\t// Cancel the event\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the mouse event is permitted, return true for the action to go through.\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * On actual clicks, determine whether this is a touch-generated click, a click action occurring\n\t * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or\n\t * an actual click which should be permitted.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onClick = function(event) {\n\t\tvar permitted;\n\n\t\t// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.\n\t\tif (this.trackingClick) {\n\t\t\tthis.targetElement = null;\n\t\t\tthis.trackingClick = false;\n\t\t\treturn true;\n\t\t}\n\n\t\t// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.\n\t\tif (event.target.type === 'submit' && event.detail === 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\tpermitted = this.onMouse(event);\n\n\t\t// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.\n\t\tif (!permitted) {\n\t\t\tthis.targetElement = null;\n\t\t}\n\n\t\t// If clicks are permitted, return true for the action to go through.\n\t\treturn permitted;\n\t};\n\n\n\t/**\n\t * Remove all FastClick's event listeners.\n\t *\n\t * @returns {void}\n\t */\n\tFastClick.prototype.destroy = function() {\n\t\tvar layer = this.layer;\n\n\t\tif (deviceIsAndroid) {\n\t\t\tlayer.removeEventListener('mouseover', this.onMouse, true);\n\t\t\tlayer.removeEventListener('mousedown', this.onMouse, true);\n\t\t\tlayer.removeEventListener('mouseup', this.onMouse, true);\n\t\t}\n\n\t\tlayer.removeEventListener('click', this.onClick, true);\n\t\tlayer.removeEventListener('touchstart', this.onTouchStart, false);\n\t\tlayer.removeEventListener('touchmove', this.onTouchMove, false);\n\t\tlayer.removeEventListener('touchend', this.onTouchEnd, false);\n\t\tlayer.removeEventListener('touchcancel', this.onTouchCancel, false);\n\t};\n\n\n\t/**\n\t * Check whether FastClick is needed.\n\t *\n\t * @param {Element} layer The layer to listen on\n\t */\n\tFastClick.notNeeded = function(layer) {\n\t\tvar metaViewport;\n\t\tvar chromeVersion;\n\t\tvar blackberryVersion;\n\t\tvar firefoxVersion;\n\n\t\t// Devices that don't support touch don't need FastClick\n\t\tif (typeof window.ontouchstart === 'undefined') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Chrome version - zero for other browsers\n\t\tchromeVersion = +(/Chrome\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n\t\tif (chromeVersion) {\n\n\t\t\tif (deviceIsAndroid) {\n\t\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\n\t\t\t\tif (metaViewport) {\n\t\t\t\t\t// Chrome on Android with user-scalable=\"no\" doesn't need FastClick (issue #89)\n\t\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// Chrome 32 and above with width=device-width or less don't need FastClick\n\t\t\t\t\tif (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Chrome desktop doesn't need FastClick (issue #15)\n\t\t\t} else {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (deviceIsBlackBerry10) {\n\t\t\tblackberryVersion = navigator.userAgent.match(/Version\\/([0-9]*)\\.([0-9]*)/);\n\n\t\t\t// BlackBerry 10.3+ does not require Fastclick library.\n\t\t\t// https://github.com/ftlabs/fastclick/issues/251\n\t\t\tif (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {\n\t\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\n\t\t\t\tif (metaViewport) {\n\t\t\t\t\t// user-scalable=no eliminates click delay.\n\t\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// width=device-width (or less than device-width) eliminates click delay.\n\t\t\t\t\tif (document.documentElement.scrollWidth <= window.outerWidth) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)\n\t\tif (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Firefox version - zero for other browsers\n\t\tfirefoxVersion = +(/Firefox\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n\t\tif (firefoxVersion >= 27) {\n\t\t\t// Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896\n\n\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\t\t\tif (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version\n\t\t// http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx\n\t\tif (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * Factory method for creating a FastClick object\n\t *\n\t * @param {Element} layer The layer to listen on\n\t * @param {Object} [options={}] The options to override the defaults\n\t */\n\tFastClick.attach = function(layer, options) {\n\t\treturn new FastClick(layer, options);\n\t};\n\n\n\tif (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine(function() {\n\t\t\treturn FastClick;\n\t\t});\n\t} else if (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = FastClick.attach;\n\t\tmodule.exports.FastClick = FastClick;\n\t} else {\n\t\twindow.FastClick = FastClick;\n\t}\n}());\n","import '../scss/index.scss'\nimport '../scss/page/scene1.scss'\n\nimport PhotoSphereViewer from 'photo-sphere-viewer'\nimport util from './until'\nvar attachFastClick = require('fastclick');\n\nimport Pic from '../img/P3-mini.jpg'\nimport location from '../img/location.png';\nimport glass from '../img/glass.png'; //望远镜\nimport eUrl from '../img/m/screen-tap-tips.png';\n\nvar viewer = null\n\nvar indexPath = $('body').attr('data-path')\n\n// 进度相关\nvar progressNum = 0\nvar allStep = 5\nvar progressFlag = {\n 'bear': false,\n 'lynx': false,\n 'road': false,\n 'lookout': false,\n 'fox': false\n}\n\nvar mp4UrlMap = {\n\n}\n\nvar huntV = {\n init() {\n this.initSnowView()\n this.handleNav()\n this.getVideoSource()\n util.handleReady(2654, 1050, viewer, 0, 0.008)\n },\n initSnowView() {\n viewer = new PhotoSphereViewer({\n container: 'photosphere',\n // panorama: 'http://hdzt.duowan.com/s/1806hunter/moblie/P3.jpg',\n panorama: Pic,\n min_fov: 50,\n max_fov: 70,\n navbar: false,\n time_anim: false,\n move_speed: 1.7, //m\n anim_speed: '1rpm',\n markers: [\n // 野牛\n {\n id: 'beer-polygon',\n polygon_px: [\n [2626, 950], [2626, 1068], [2807, 1068],[2807, 950]\n ],\n svgStyle: {\n fill: 'rgba(255, 255, 255, 0)'\n }\n },\n {\n id: 'location-beer',\n x: 2725,\n y: 990,\n image: location,\n width: 35,\n height: 35,\n anchor: 'bottom center',\n },\n // 野猪\n {\n id: 'lynx-polygon',\n polygon_px: [\n [1376, 1082], [1376, 1168], [1474, 1168],[1474, 1082]\n ],\n svgStyle: {\n fill: 'rgba(255, 255, 255, 0)'\n }\n },\n {\n id: 'location-lynx',\n x: 1422,\n y: 1122,\n image: location,\n width: 35,\n height: 35,\n anchor: 'bottom center',\n },\n // 狐狸\n {\n id: 'fox-polygon',\n polygon_px: [\n [3456, 950], [3456, 1088], [3592, 1088],[3592, 950]\n ],\n svgStyle: {\n fill: 'rgba(255, 255, 255, 0)'\n }\n },\n {\n id: 'location-fox',\n x: 3530,\n y: 1010,\n image: location,\n width: 35,\n height: 35,\n anchor: 'bottom center',\n },\n // 望远镜\n {\n id: 'glass',\n x: 202,\n y: 610,\n image: glass,\n width: 56,\n height: 59,\n anchor: 'bottom center',\n },\n // 铁路\n {\n id: 'location-road',\n x: 2250,\n y: 1120,\n image: location,\n width: 35,\n height: 35,\n anchor: 'bottom center',\n },\n ]\n })\n },\n getVideoSource() {\n let vids = ['8896623','8896631','8896635','8896637','8896639','8896535','8896617', '8897763']\n var videoEls = {\n '8896623': 'lookup',\n '8896631': 'hunt',\n '8896635': 'book-lake',\n '8896637': 'book-taiga',\n '8896639': 'book-elden',\n '8896535': 'picVideo',\n '8896617': 'huntVideo',\n '8897763': 'huntVideoB'\n }\n \n $.ajax({\n type: \"GET\",\n dataType: \"json\",\n url: `//video.duowan.com/jsapi/playPageVideoInfo/?vids=${vids.join(',')}`,\n success: function(data) {\n for(var i in data) {\n let resouce = util.deCodeArg(data[i].c).all,\n source = resouce.yuanhua || resouce[1300] || resouce[1000] || resouce[350]\n let name = videoEls[i] \n mp4UrlMap[name] = source.src\n }\n \n document.getElementById('hunt-video').src = mp4UrlMap['huntVideo']\n document.getElementById('hunt-video-b').src = mp4UrlMap['huntVideoB']\n\n document.getElementById('book-lake-video').src = mp4UrlMap['book-lake']\n document.getElementById('book-taiga-video').src = mp4UrlMap['book-taiga']\n document.getElementById('book-elden-video').src = mp4UrlMap['book-elden']\n\n huntC.lookoutClick()\n huntC.playVideo()\n }\n })\n },\n // 导航权限处理\n handleNav() {\n // 初始化加载时\n let permision = localStorage.getItem('hunter_permision')\n if(permision < 3) {\n window.location.href = indexPath\n }\n if(permision == 4) {\n progressFlag = {\n 'bear': true,\n 'lynx': true,\n 'road': true,\n 'lookout': true,\n 'fox': true\n }\n $('#cur-progress').html(5)\n }\n }\n}\n\nvar huntC = {\n init() {\n this.modalShow()\n util.bookClick()\n util.toolbarClick()\n util.shooting()\n },\n modalShow() {\n // 点击显示介绍弹窗\n $('.nav').find('.current').click(function() {\n $('#hunter-suggest-modal').fadeIn()\n })\n // 黑熊\n function beerModal() {\n if($('#hunter-beer-modal').css('display') == 'none') {\n $('.pub-modal').hide()\n $('#hunter-beer-modal').fadeIn()\n viewer.animate({\n x: 2725,\n y: 990\n },600);\n }\n if(!progressFlag['bear']){\n progressFlag['bear'] = true\n $('#cur-progress').html(++progressNum)\n progressNum == allStep ? localStorage.setItem('hunter_permision', '4') : ''\n progressNum == allStep ? $('.complete-modal').fadeIn() : ''\n }\n }\n $(document).on('click', '#psv-marker-beer-polygon', function() {\n beerModal()\n })\n $(document).on('click', '#psv-marker-location-beer', function() {\n beerModal()\n })\n\n // lynx\n function lynxModal() {\n if($('#hunter-lynx-modal').css('display') == 'none') {\n $('.pub-modal').hide()\n $('#hunter-lynx-modal').fadeIn()\n viewer.animate({\n x: 1422,\n y: 1122\n },600);\n }\n if(!progressFlag['lynx']){\n progressFlag['lynx'] = true\n $('#cur-progress').html(++progressNum)\n progressNum == allStep ? localStorage.setItem('hunter_permision', '4') : ''\n progressNum == allStep ? $('.complete-modal').fadeIn() : ''\n }\n }\n $(document).on('click', '#psv-marker-lynx-polygon', function() {\n lynxModal()\n })\n $(document).on('click', '#psv-marker-location-lynx', function() {\n lynxModal()\n })\n\n // fox\n function foxModal() {\n if($('#hunter-fox-modal').css('display') == 'none') {\n $('.pub-modal').hide()\n $('#hunter-fox-modal').fadeIn()\n viewer.animate({\n x: 3530,\n y: 1010\n },600);\n }\n if(!progressFlag['fox']){\n progressFlag['fox'] = true\n $('#cur-progress').html(++progressNum)\n progressNum == allStep ? localStorage.setItem('hunter_permision', '4') : ''\n progressNum == allStep ? $('.complete-modal').fadeIn() : ''\n }\n }\n $(document).on('click', '#psv-marker-fox-polygon', function() {\n foxModal()\n })\n $(document).on('click', '#psv-marker-location-fox', function() {\n foxModal()\n })\n\n $(document).on('click', '#psv-marker-location-road', function() {\n if(!$('#p3-road-pic')[0]){\n var roadHtml = ` <div class=\"mod-full-picture\" id=\"p3-road-pic\" style=\"display:none\">\n <div class=\"bg-move\"></div>\n <div class=\"pub-btn go-back\">返回</div>\n <div class=\"eyes-btn\" id=\"open-eyes-modal\"></div>\n <div class=\"full-pic-modal small-modal\">\n <div class=\"top-bar\">\n 北欧森林\n </div>\n <div class=\"container clearfix\">\n <p>虽然北欧人最喜欢到地中海度假,享受这里的阳光和沙滩。不过南欧的地中海人也是很羡慕北欧的人口稀少,森林密布的环境,那些难忘的原始森林,河流,湖泊,小动物等等。</p>\n <p>米兰·昆德拉说,生活在别处。倘若有一处,萃集了生活的美好,又何必另觅他乡? 冰岛的极光,瑞典的冰雪,目眩神驰的北欧风光里,最让人向往的还是森林里一口深呼吸带来的焕然一新。在这个世界上,还有什么比生命的健康活力更重。</p>\n <div class=\"eyes-btn\" id=\"screen-open-video\"></div>\n </div>\n </div>\n <div class=\"fullscreen-video fullscreen-video-picture\" style=\"display: none\">\n <video x5-playsinline=\"\" webkit-playsinline playsinline controls id=\"picture-video\" preload=\"metadata\" width=\"100%\">\n <source src=\"${mp4UrlMap['picVideo']}\">\n </video>\n </div>\n </div>`\n $('body').append(roadHtml)\n }\n util.acceler()\n $('#p3-road-pic').fadeIn()\n if(!progressFlag['road']){\n progressFlag['road'] = true\n $('#cur-progress').html(++progressNum)\n progressNum == allStep ? localStorage.setItem('hunter_permision', '4') : ''\n }\n })\n\n //moblie \b\n $(document).on('click', '#open-eyes-modal', function() {\n var showFlag = $('.full-pic-modal').css('display') == 'none' ? false : true\n showFlag ? $('.full-pic-modal').fadeOut() : $('.full-pic-modal').fadeIn()\n })\n\n $(document).on('click', '#screen-open-video', function() {\n $('.fullscreen-video-picture').show()\n var video = document.getElementById('picture-video')\n video.play()\n video.addEventListener(\"ended\",function(){\n video.load()\n $('.fullscreen-video-picture').hide()\n })\n return false\n })\n\n // 完成任务提示弹窗\n $(document).on('click', '.go-back', function() {\n progressNum == allStep ? $('.complete-modal').fadeIn() : ''\n })\n\n $('.complete-success-btn').click(function() {\n $('.complete-modal').remove()\n $('.book-icon').trigger('click')\n })\n },\n playVideo() {\n $('#hunter-video-play').click(function() {\n if(!$('#hunter-video-suggest')[0]){\n var hunterVideoHtml = `<div class=\"video-wrapper pub-modal-mask\" id=\"hunter-video-suggest\">\n <div class=\"part-screen\">\n <video x5-playsinline=\"\" webkit-playsinline playsinline controls autoplay id=\"hunter-video\">\n <source src=\"${mp4UrlMap['hunt']}\">\n </video>\n </div>\n </div>`\n $('body').append(hunterVideoHtml)\n } else {\n $('#hunter-video-suggest').show()\n }\n return false\n })\n },\n // 瞭望台\n lookoutClick() {\n var videoHtml = `<div class=\"fullscreen-video fullscreen-video-lookout\">\n <video x5-playsinline=\"\" webkit-playsinline playsinline id=\"lookout-video\" controls autoplay width=\"100%\">\n <source src=\"${mp4UrlMap['lookup']}\">\n </video>\n </div>` \n $(document).on('click', '#psv-marker-glass', function() {\n if(!$('#lookout-hunt-pic')[0]){\n var lookOutHtml = ` <div class=\"mod-full-picture\" id=\"lookout-hunt-pic\" style=\"display:none\">\n <div class=\"pub-btn go-back\">返回</div>\n <img class=\"e-tips\" src=\"${eUrl}\" alt=\"\">\n </div>`\n $('body').append(lookOutHtml)\n }\n $('#lookout-hunt-pic').fadeIn()\n\n if(!progressFlag['lookout']){\n progressFlag['lookout'] = true\n $('#cur-progress').html(++progressNum)\n progressNum == allStep ? localStorage.setItem('hunter_permision', '4') : ''\n }\n })\n \n // 轻触屏幕\n $(document).on('click', '#lookout-hunt-pic', function(e) {\n var lookVideo = document.getElementById('lookout-video')\n\n if(lookVideo) {\n $('#lookout-hunt-pic').find('.fullscreen-video').fadeIn()\n lookVideo.play()\n } else{\n $('#lookout-hunt-pic').append(videoHtml)\n lookVideo = document.getElementById('lookout-video')\n lookVideo.play()\n }\n\n lookVideo.addEventListener(\"ended\",function(){\n lookVideo.load()\n lookVideo.pause()\n $('.fullscreen-video-lookout').hide()\n $('#lookout-hunt-pic').hide()\n })\n })\n },\n}\n\n\nfunction screenInit() {\n // 竖屏\n if(window.orientation==180||window.orientation==0){\n $('.across-modal').show()\n }\n // 横屏\n if(window.orientation==90||window.orientation==-90){\n $('.across-modal').hide()\n if(viewer) return\n let entry = localStorage.getItem('entry')\n if(entry == 'index') {\n util.handleModel()\n huntV.init()\n huntC.init()\n } else {\n window.location.href = indexPath\n }\n }\n}\nscreenInit()\nwindow.addEventListener(\"onorientationchange\" in window ? \"orientationchange\" : \"resize\", screenInit, false);\n\n$(function() {\n attachFastClick(document.body);\n});","var bundleURL = null;\nfunction getBundleURLCached() {\n if (!bundleURL) {\n bundleURL = getBundleURL();\n }\n\n return bundleURL;\n}\n\nfunction getBundleURL() {\n // Attempt to find the URL of the current script and use that as the base URL\n try {\n throw new Error;\n } catch (err) {\n var matches = ('' + err.stack).match(/(https?|file|ftp):\\/\\/[^)\\n]+/g);\n if (matches) {\n return getBaseURL(matches[0]);\n }\n }\n\n return '/';\n}\n\nfunction getBaseURL(url) {\n return ('' + url).replace(/^((?:https?|file|ftp):\\/\\/.+)\\/[^/]+$/, '$1') + '/';\n}\n\nexports.getBundleURL = getBundleURLCached;\nexports.getBaseURL = getBaseURL;\n","var bundle = require('./bundle-url');\n\nfunction updateLink(link) {\n var newLink = link.cloneNode();\n newLink.onload = function () {\n link.remove();\n };\n newLink.href = link.href.split('?')[0] + '?' + Date.now();\n link.parentNode.insertBefore(newLink, link.nextSibling);\n}\n\nvar cssTimeout = null;\nfunction reloadCSS() {\n if (cssTimeout) {\n return;\n }\n\n cssTimeout = setTimeout(function () {\n var links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n for (var i = 0; i < links.length; i++) {\n if (bundle.getBaseURL(links[i].href) === bundle.getBundleURL()) {\n updateLink(links[i]);\n }\n }\n\n cssTimeout = null;\n }, 50);\n}\n\nmodule.exports = reloadCSS;\n"]}